経路探索を実装。
部屋を三つにして、スタートからゴールまで移動できた。
このへんは以前も作ってますが、3Dとの位置合わせが難しかった記憶がありますが、とりあえずできました。
公式チュートリアルのRogueLikeGame的でもありますね。あっちは光線なげて大丈夫なら前進って作りでしたが。
CalcNaviを動かすと、Searchがマップ内をゴールからスキャンして、移動可能なマスに、そこまで距離をマーキングしていきます。
スタート位置のnavMap[x,y]はゴールからの距離が記入されていて、そこから4方向を調べると、それぞれのマスに、ゴールからの距離が入っているので、
距離が短くなるマスに移動すると、ゴールに近づけるって仕組みです。
実際は入っているのは距離+100です。1~99は、ユニットの要素番号として使います(今のところ1が壁、2がドア)
早くエアロック開放して真空にして船員が死ぬ処理を作りたい(≧∇≦)
GameObject goal; Vector3 next; Vector3 dir; void Start() { goal = GameObject.Find("Goal"); goal.transform.position = new Vector3(9, 0, 99 - 4); CalcNavi((int)goal.transform.position.x, 99- (int)goal.transform.position.z); getNext(); } void Update() { if (Vector3.Distance(man.transform.position, goal.transform.position) < 0.05f) return; man.transform.position += dir * Time.deltaTime; if (Vector3.Distance(man.transform.position, next) < 0.02f) { man.transform.position = next; getNext(); } } void getNext() { int[] dx = { -1, 1, 0, 0 }; int[] dy = { 0, 0, -1, 1 }; int x = Mathf.FloorToInt(man.transform.position.x); int y = 99 - Mathf.CeilToInt(man.transform.position.z); if(navMap[x,y]==100) return; int min = 99999; int dis = -1; for (int i = 0; i <= 3; i++) { int ret = navMap[x + dx[i], y + dy[i]]; if (ret == 1) continue; // wall if (ret < min) { min = ret; dis = i; } } if (dis != -1) { dir = new Vector3(dx[dis], 0, -dy[dis]); next = man.transform.position + new Vector3(dx[dis], 0, -dy[dis]); } } void CalcNavi(int gx,int gy) { for (int i = 0; i < 100; i++) for (int j = 0; j < 100; j++) navMap[j, i] = 0; for (int i = 0; i < 100; i++) for (int j = 0; j < 100; j++) navMap[j, i] = map[j,i]; search(gx,gy,0); } void search(int gx,int gy,int dist) { if (gx < 0 || gx >= 100 | gy < 0 || gy >= 100) return;// out of map if (map[gx, gy] == 1 ) return; // wall if (navMap[gx, gy] >= 100 && navMap[gx, gy] <= dist + 100) return; navMap[gx, gy] = dist + 100; search(gx - 1, gy,dist+1); search(gx + 1, gy, dist + 1); search(gx, gy-1, dist + 1); search(gx, gy+1, dist + 1); }