AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

FTLみたいなものを作ってみる(2)

経路探索を実装。
部屋を三つにして、スタートからゴールまで移動できた。

f:id:yasu9780:20161210042928g:plain

このへんは以前も作ってますが、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);
        }
広告を非表示にする