ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Navigation:AIを用いて経路探索させる

初めに

 Unity には、Navigation と呼ばれる機能があります。この機能を用いることで床や障害物など地形の情報を収集し、3Dオブジェクトに目的地までの経路を移動させることができます。本記事では、Navigation を使った簡単な経路探索の方法をまとめます。


 Unity には Navigation System という機能があります。この機能を使うことで、キャラクターに歩行可能な場所や障害物など地形を理解させ、目的地まで動かすことができます。

 Navigation System を使うときに、以下の要素で構成される NavMesh システムで歩行可能なエリアのデータを取得します。

機能 説明
NavMesh 歩行可能な面のデータ
NavMesh Agent 動かすキャラクターにつけるコンポーネント
Off-Mesh Link 飛び越えられる溝など NavMesh で表現できない移動可能な場所を表すためのコンポーネント
NavMesh Obstacle 障害物につけるコンポーネント
動かすことができる

経路探索について

 Unity では、A*(A-star)と呼ばれるアルゴリズムが採用されています。A* は与えられたスタートから、どこかに存在するゴールまでの最適なルートを探索するためのアルゴリズムです。

 A* の仕組みについて、次のサイトの説明をみるとイメージが持てると思います。
tajimarobotics.com

キャラクターを目的地まで動かす

 本記事では、次の2つのことをします。

  • NavMesh システムを使い、地形の情報を取得する
  • キャラクター(NavMesh Agentをつけたオブジェクト)を目的地まで最短経路で動かす

 次の手順で NavNesh システムを使います。

  1. 床、障害物、キャラクター、ゴールとなるオブジェクトを生成

    今回は、上の画像のように生成します。床は plane(平面)、障害物は Cube(立方体、伸ばして使っています)、キャラクターは Cupsule(カプセル)、ゴールは Sphere(球)を使っています。

    ※Hierarchy で右クリック > 3DObject から生成できます。また、デフォルトでは白色ですが、Material を使って色をつけています。

  2. 移動経路に使うオブジェクトを選択し、Inspector の Static から Navigation Static を選択
  3. Window > AI > Navigation をクリックし、Navigation ウィンドウを表示させる
  4. Navigation ウィンドウの Bake タブをクリックし、Bake ボタンをクリックする

(注意)
オブジェクトの位置やサイズなどを変更した際、再度「Bake」を実行して経路情報を更新する必要があります。

キャラクター(NavMesh Agentをつけたオブジェクト)を目的地まで最短経路で動かす

 やることは次の3つです。

  1. キャラクター(動かしたいオブジェクト)にNavMesh Agent コンポーネントをつける

     キャラクターのオブジェクトを選択し、Inspector の Addcomponent から追加できます

  2. 目的地まで移動させるためのスクリプトを作成
  3. 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);
    	}
    }
    

  4. 先ほどのスクリプトをキャラクターのオブジェクトにつけ、目的地をアタッチする

実行

youtu.be

 キャラクターが目的地まで障害物を避け、最短経路で動いていることが分かります。

最後に

  • Navigation System を使い、経路探索させることができる
  • NavMesh を使い、歩行可能エリアのデータを取得する
  • 移動させるオブジェクトには、NavMeshAgent コンポーネントをつける

 まだまだ、奥が深い機能です。上の参考に公式のドキュメントのリンクを載せています。そちらにさらに詳しい説明が載っています。