自動生成ダンジョンで自動的に動くAIキャラクターの生成
自動生成ダンジョンにランタイム時におけるNavMesh生成プログラムを適用してみます。 自動生成ダンジョンプログラムは以前のものになります。
public void Awake()
{
GameObject rootObject = new GameObject("Root");
rootObject.transform.parent = transform;
GenerateDungeon(rootObject, dungeonColumnSize, dungeonRowSize);
// generate navmesh
NavMeshSurface surface = null;
TryGetComponent(out surface);
if (surface)
{
surface.BuildNavMesh();
}
}
Awake時にNavMeshSurfaceコンポーネントで、NavMeshの自動生成を行っているだけの非常に簡単なコードになります。
結果がこちらです。簡単にNavMeshが生成できました。

== AIで動くキャラクターの作成
ダンジョンに開始位置、終了位置を設定し、開始位置から終了位置まで動いていく簡単なキャラクターを作成します。
Capsuleコンポーネントを作成し、そこにNavMeshAgentのコンポーネントと、制御用スクリプトを追加します。
制御用スクリプトは以下のような記述になります。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class DummyAICharacter : MonoBehaviour { public Vector3 Destination = Vector3.zero; private NavMeshAgent m_navMeshAgent = null; // Start is called before the first frame update void Start() { TryGetComponent(out m_navMeshAgent); } // Update is called once per frame void Update() { if (m_navMeshAgent) { m_navMeshAgent.destination = Destination; } } }
GameManagerオブジェクトも作成し、以下のようなコードで、ダンジョンの開始位置をAICharacterに与えるようにしました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class DummyAICharacter : MonoBehaviour { public Vector3 Destination = Vector3.zero; private NavMeshAgent m_navMeshAgent = null; // Start is called before the first frame update void Start() { TryGetComponent(out m_navMeshAgent); } // Update is called once per frame void Update() { if (m_navMeshAgent) { m_navMeshAgent.destination = Destination; } } }
実行結果はこのようになります。
スタート地点(S)からゴール地点(G)までNavMeshAgentによりChacacterは迷うことなく迷路を進んでいくことができています。

今回のプロジェクトは以下からダウンロードできます。
https://gitlab.com/ringogames2022/kruskalalgorithmdungeon/-/tree/main