(更新履歴)2024/12/24 画像の表示を修正、動画をXからYoutubeに変更
NavMeshとは
NavMesh(ナビメッシュ)とはUnityの機能の1つで、AIを使ったナビゲーションシステムです。
ステージ上の歩行可能なエリアを設定することで、キャラクターを指定の位置まで移動させたり、障害物を避けながら移動させることができます。
NavMeshのインストール
NavMeshを使用するにはPackageManagerからインストールする必要があります。
「Window > Package Manager」を開きます。

「Packages:Unity Registry」を選択して「AI Navigation」パッケージを探し、「Install」をクリックします。

使い方
NavMeshの基本的な使い方を紹介します。
ゴールへ向かって移動させる
まずはシンプルに、キャラクターをまっすぐゴールまで移動させてみます。
ステージを作成
Planeを作成し、Add Componentから「Navigation > NavMeshSurface」をアタッチします。

「Bake」をクリックするとメッシュデータが作成され、Planeの一部が青くなりました。
この青い部分が移動可能エリアとして認識されます。

キャラクターとゴールのオブジェクトを作成
ナビゲーションするキャラクターを作成します。
「Cylinder」がデフォルトでNavMeshのエージェントに適したサイズになっているようなので、今回は特に値を変更せずそのまま使用することにします。

Cylinderを選択し、Add Componentから「Navigation > NavMeshAgent」をアタッチします。

スクリプトを作成し、ゴールの座標までナビゲーションするコードを記述します。
using UnityEngine;
using UnityEngine.AI;
public class Move : MonoBehaviour
{
public Transform goal;
void Start()
{
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.destination = goal.position;
}
}
エディターに戻り、ゴールにするオブジェクトを作成します。

先ほど作成したスクリプトをCylinderにアタッチし、ヒエラルキービューでゴールを指定します。

実行結果
実行すると、Cylinderがゴールに向かって真っすぐ移動します(分かりやすいようにマテリアルで色を付けました)。
障害物を避けて移動させる
ステージ上に障害物を追加して、避けながらゴールを目指すようにします。
障害物の追加
Cubeを作成し、Cylinderとゴールの間に配置してみました。

Cubeには「Navigation > NavMeshObstacle」をアタッチします。
「Carve」にチェックを入れるとNavMeshに穴が開き、障害物を避ける時の動きがスムーズになります。

実行結果
実行すると、Cylinderが障害物を避けながらゴールへ移動します。
段差を超えて移動する
段差やフェンスなどを飛び越えて移動する動きを実装してみます。
高低差のあるステージを作成
PlaneにアタッチしていたNavMeshSurfaceは削除しておきます。
もう1つPlaneを追加して、少し下の方に配置しました。
ゴールの場所も移動しておきます。

空のオブジェクトを作成し、2つのPlaneを子オブジェクトにします。
空のオブジェクトに「NavMeshSurface」と「NavMeshModifier」の2つをアタッチします。

NavMeshSurfaceの「Object Collection > Collect Objects」を「NavMeshModifier Component Only」に変更します。
これにより、NavMeshModifierコンポーネントがアタッチされているオブジェクトだけがメッシュデータの対象になります。
NavMeshModifierで「Apply to Children」をONにすることで、子オブジェクトにした2つのPlaneにもNavMeshModifierが適用されるようになります。

「Bake」をクリックしてメッシュデータを作成します。

段差を超えて移動する場所を設定
Cubeを2つ作成し、移動の開始地点と終了地点に配置します。

開始地点のCubeに「Navigation > OffMeshLink」をアタッチします。
Startに開始地点、Endに終了地点のCubeを設定します。

実行結果
実行すると、Cylinderが段差を超えてゴールまで移動します。
さいごに
NavMeshを使った移動は敵やNPCの実装で使う場面が多そうです。
使い方もそこまで難しくなさそうなので、ドキュメントを確認しながら色々試してみようと思います。
コメント