自動生成されたマップで動くAIキャラクターの作成②
自動生成ダンジョンで自動的に動く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