Unity - Navigation:AIを用いて経路探索させる
初めに
Unity には、Navigation と呼ばれる機能があります。この機能を用いることで床や障害物など地形の情報を収集し、3Dオブジェクトに目的地までの経路を移動させることができます。本記事では、Navigation を使った簡単な経路探索の方法をまとめます。
Index
Navigation System
Navigation System とは
Unity には Navigation System という機能があります。この機能を使うことで、キャラクターに歩行可能な場所や障害物など地形を理解させ、目的地まで動かすことができます。
NavMesh システムについて
Navigation System を使うときに、以下の要素で構成される NavMesh システムで歩行可能なエリアのデータを取得します。
経路探索について
Unity では、A*(A-star)と呼ばれるアルゴリズムが採用されています。A* は与えられたスタートから、どこかに存在するゴールまでの最適なルートを探索するためのアルゴリズムです。
A* の仕組みについて、次のサイトの説明をみるとイメージが持てると思います。
tajimarobotics.com
キャラクターを目的地まで動かす
本記事では、次の2つのことをします。
- NavMesh システムを使い、地形の情報を取得する
- キャラクター(NavMesh Agentをつけたオブジェクト)を目的地まで最短経路で動かす
NavMesh システムを使い、地形の情報を取得する
次の手順で NavNesh システムを使います。
- 床、障害物、キャラクター、ゴールとなるオブジェクトを生成
今回は、上の画像のように生成します。床は plane(平面)、障害物は Cube(立方体、伸ばして使っています)、キャラクターは Cupsule(カプセル)、ゴールは Sphere(球)を使っています。
※Hierarchy で右クリック > 3DObject から生成できます。また、デフォルトでは白色ですが、Material を使って色をつけています。
- 移動経路に使うオブジェクトを選択し、Inspector の Static から Navigation Static を選択
- Window > AI > Navigation をクリックし、Navigation ウィンドウを表示させる
- Navigation ウィンドウの Bake タブをクリックし、Bake ボタンをクリックする
(注意)
オブジェクトの位置やサイズなどを変更した際、再度「Bake」を実行して経路情報を更新する必要があります。
キャラクター(NavMesh Agentをつけたオブジェクト)を目的地まで最短経路で動かす
やることは次の3つです。
- キャラクター(動かしたいオブジェクト)にNavMesh Agent コンポーネントをつける
キャラクターのオブジェクトを選択し、Inspector の Addcomponent から追加できます
- 目的地まで移動させるためのスクリプトを作成
- 先ほどのスクリプトをキャラクターのオブジェクトにつけ、目的地をアタッチする
using UnityEngine; using UnityEngine.AI; //追加 [RequireComponent(typeof(NavMeshAgent))] public class CharacterNavigation : MonoBehaviour { [SerializeField] private Transform m_Target; private NavMeshAgent m_Agent; void Start() { m_Agent = GetComponent<NavMeshAgent>(); //コンポーネントを取得 } void Update() { //目的地をセットする m_Agent.SetDestination(m_Target.position); } }