【Unity】はじめての NavMesh 入門【AIによる経路移動】

はじめての NavMesh 入門

NavMesh とは?

NavMesh(ナビメッシュ)とは、シーン上を AI で自動に移動する 3D モデルを作れる Unity の機能です。

「ナビゲーション」という言葉は「目的地までの経路や道順のこと」を意味しますが、NavMesh を使うことで、3Dモデルをある目的地まで移動させたり、細かい道順を設定したり、障害物を避けて移動させることができます。

NavMesh 入門

開発環境

Unity 2020.3.1f1

NavMesh を使ってみる

ここからは実際に NavMesh を使って目的地まで自動で移動する AI を作成します。

ステージを作成する

はじめに AI が移動するためのステージを作成します。

Hierarchy ウィンドウ上の「」ボタンから「3D Object > Plane」を生成し「Ground」と名付け、これをステージの面とします。

また障害物となる「3D Object > Cube」、目的地となる「3D Object > Cylinder」を生成し、それぞれ「Obstacle」「Goal」と名付けて、スケールや位置を調整してステージの適当な場所に配置します。

NavMesh用のステージ作成

移動する AI となる3Dモデルを作成

AI として目的地まで移動する 3Dモデルを作成します。

3D Object > Capsule」を生成し「Character」と名付けて、ステージ上のスタート地点にしたい場所に配置します。

NavMeshで移動するキャラクターモデルの作成

各オブジェクトに NavMesh を適用

各オブジェクトに NavMesh を適用し、ステージ上で移動できるエリアを設定します。

Hierarchy ウィンドウから移動経路に使いたいオブジェクトを選択し、Inspector ウィンドウの「Static」の下矢印から「Navigation Static」を選択します。

Navigation Static を設定

次に Unity のメニューバーから「Window > AI > Navigation」を選択して Navigation ウィンドウを表示します。

上部の「Bake」タブを選択し、下部の「Bake」ボタンを実行します。これで先程「Navigation Static」を設定した各オブジェクトの位置情報が経路として認識されます。

NavMesh の Bake を実行

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

AI に Nav Mesh Agent を設定

移動する AI に Nav Mesh Agent コンポーネントをアタッチします。

Hierarchy ウィンドウにて、移動対象となる「Character」を選択し、Inspector ウィンドウから「Add Component > Navigation > Nav Mesh Agent」を選択します。

Nav Mesh Agent のアタッチ

目的地まで移動するスクリプトを作成

目的地まで移動させるため、AI を動かすスクリプトを作成します。

Project ウィンドウから「+」ボタンを押して「C# Script」を選択し、「CharacterNavigation」と名付けます。

スクリプトの中身は以下になります。

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);
	}
}

AI にスクリプトを設定

作成した「CharacterNavigation」スクリプトを移動対象のオブジェクトにアタッチします。

Hierarchy 上の「Character」オブジェクトに作成したスクリプトをアタッチし、CharacterNavigation の「Target」の欄には目的地である「Goal」オブジェクトを Hierarchy からドラッグ&ドロップします。

Character にスクリプトを設定

これで全ての設定は完了です。

実際に動かしてみる

全ての設定が完了したので Unity を実行してみます。

Character オブジェクトが障害物を避けながら目的地の Goal オブジェクトまで自動で移動しています。

NavMesh による経路移動の gif

おわりに

NavMesh の入門として目的地まで自動で移動する AI を作成しました。

今回紹介した NavMesh の機能はほんの一部です。その他にもできることは色々あるので気になる方はぜひ調べてみて下さい。

参考資料