//tips
//sceneの一部が透明になる理由
Unityのシーンの一部が透明になる要因の一つにcameraの描画設定がある。
カメラのClipping Planesという設定で、
Near : どれくらい近さまでを描画するか
Far : どれくらい遠くまで描画するか
https://docs.unity3d.com/ja/2018.4/Manual/class-Camera.html
を調整することができる。
ただ、描画範囲を拡大することは負荷も増えるので動作が重くなることに注意する必要がある。
また、障害物にめり込んでしまった場合は、シェーダー(描画方法)を書き換える必要がある。
描画方法の変更は下記参照。
https://teratail.com/questions/82707
//経路探索
経路探索とは、スタート地点からゴール地点までの最適経路をコンピュータ計算で求めるもの。NAVITIMEなどのスマホアプリでも使用されている。
一般的には距離をコストとし、コストが最も少ない経路が選ばれる。
動的な経路検索の場合、障害物が動くため移動するたびに最適経路を計算する必要がある。このゴールまでの移動するルート群を移動回数でランキング化することで、最短のゴール経路と最短の移動回数がわかる。
この考え方でいくと、必要なことは、
1.現在地におけるゴールまでのルートを全てリスト化できること
2.全ルートでゴールまでの移動回数のランキングor最小値を求められること
3.移動回数最短のルートをリストから取り出せること
4.enemyに当たったものはリストから削除できること
などがある。
//List型の使い方
リストを作る際にList型を使用する。使用の際にはusing System.Collections.Generic;を一番最初に宣言する必要がある。
これにより下記のような種類のリストを作成できる。
private List<GameObject> myList = new List<GameObject>();//gameobject型のリスト
private List<int> intList = new List<int>(); //int型のリスト
private List<float> floatList = new List<float>(); //float型のリスト
List<string> playerItemList = new List<string>();//string型のリスト
Listを使用してカウントダウンを作成する。今回は数字なのでintを使用。myList.Add(i);でリストの要素を追加。
Listは要素を追加できる配列のようなもので、リストの順番も0から始まる。
例えば、下記のスクリプトが上から順に流れていったとすると、
List<int> intList = new List<int>();
intList.Add(1); // リストの中身は、intList = {1}
intList.Add(2); // リストの中身は、intList = {1,2}
intList.Add(3); // リストの中身は、intList = {1,2,3}
intList.RemoveAt(1); // リストの中身は、intList = {1,3}
//myList.Add(i); //int型 iをList末尾に加える
//myList.RemoveAt(0); //Listの0番目の要素を消す
このようになることがわかる。
Startで1から9が入ったリストを作成し、1秒を切ったら、Listの中身の大きい要素から順にtext表示へと変えていくと下記になる。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class countDown : MonoBehaviour
{
private List<int> myList = new List<int>(); //Listの宣言
private float timeleft; //時間測定のための変数
private int count; //カウント変数
void Start()
{
for (int i = 0; i < 10; i++)
{
myList.Add(i); //int型 iをmyList末尾に加える
}
}
void Update()
{
timeleft -= Time.deltaTime;
if (timeleft <= 0.0)
{
timeleft = 1.0f;
this.GetComponent<Text>().text = myList[9 - count].ToString(); //テキストの変更
count++;
}
}
}
樹形図を作るにしろリストでルートを記録していく道のりが見えない(手作業の方が早い)ので他のやり方も模索する。
NavMesh.CalculatePathをうまく使えないか検討中。
https://docs.unity3d.com/ja/current/ScriptReference/AI.NavMesh.CalculatePath.html
https://qiita.com/ta-ka/items/a023a11efe17ab097433
一旦下記コードも分析。
struct edge {
int from;
int to;
int cost;
};
int V, E, d[MAX_V];
edge es[MAX_E];
bool has_negative_loop(int s) {
fill(d, d + V, INF);
d[s] = 0;
for (int i = 0; i < V; i++) {
for (int j = 0; j < E; j++) {
edge e = es[j];
if (d[e.to] > d[e.from] + e.cost) {
d[e.to] = d[e.from] + e.cost;
if (i == V - 1) {
return true;
}
}
}
}
return false;
}