目次
NavMesh とは?
NavMesh(ナビメッシュ)とは、シーン上を AI で自動に移動する 3D モデルを作れる Unity の機能です。
「ナビゲーション」という言葉は「目的地までの経路や道順のこと」を意味しますが、NavMesh を使うことで、3Dモデルをある目的地まで移動させたり、細かい道順を設定したり、障害物を避けて移動させることができます。
開発環境
Unity 2020.3.1f1
NavMesh を使ってみる
ここからは実際に NavMesh を使って目的地まで自動で移動する AI を作成します。
ステージを作成する
はじめに AI が移動するためのステージを作成します。
Hierarchy ウィンドウ上の「+」ボタンから「3D Object > Plane」を生成し「Ground」と名付け、これをステージの面とします。
また障害物となる「3D Object > Cube」、目的地となる「3D Object > Cylinder」を生成し、それぞれ「Obstacle」「Goal」と名付けて、スケールや位置を調整してステージの適当な場所に配置します。
移動する AI となる3Dモデルを作成
AI として目的地まで移動する 3Dモデルを作成します。
「3D Object > Capsule」を生成し「Character」と名付けて、ステージ上のスタート地点にしたい場所に配置します。
各オブジェクトに NavMesh を適用
各オブジェクトに NavMesh を適用し、ステージ上で移動できるエリアを設定します。
Hierarchy ウィンドウから移動経路に使いたいオブジェクトを選択し、Inspector ウィンドウの「Static」の下矢印から「Navigation Static」を選択します。
次に Unity のメニューバーから「Window > AI > Navigation」を選択して Navigation ウィンドウを表示します。
上部の「Bake」タブを選択し、下部の「Bake」ボタンを実行します。これで先程「Navigation Static」を設定した各オブジェクトの位置情報が経路として認識されます。
AI に Nav Mesh Agent を設定
移動する AI に Nav Mesh Agent コンポーネントをアタッチします。
Hierarchy ウィンドウにて、移動対象となる「Character」を選択し、Inspector ウィンドウから「Add Component > Navigation > 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 からドラッグ&ドロップします。
これで全ての設定は完了です。
実際に動かしてみる
全ての設定が完了したので Unity を実行してみます。
Character オブジェクトが障害物を避けながら目的地の Goal オブジェクトまで自動で移動しています。
おわりに
NavMesh の入門として目的地まで自動で移動する AI を作成しました。
今回紹介した NavMesh の機能はほんの一部です。その他にもできることは色々あるので気になる方はぜひ調べてみて下さい。
参考資料
- ナビメッシュの作成 | Unity Documentation