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がゴールに向かって真っすぐ移動します(分かりやすいようにマテリアルで色を付けました)。
NavMeshで動かすテスト1#Unity pic.twitter.com/OBiq0qYxFt
— ばにら (@vaniiiirava) June 21, 2023
障害物を避けて移動させる
ステージ上に障害物を追加して、避けながらゴールを目指すようにします。
障害物の追加
Cubeを作成し、Cylinderとゴールの間に配置してみました。
Cubeには「Navigation > NavMeshObstacle」をアタッチします。
「Carve」にチェックを入れるとNavMeshに穴が開き、障害物を避ける時の動きがスムーズになります。
実行結果
実行すると、Cylinderが障害物を避けながらゴールへ移動します。
NavMeshで動かすテスト2#Unity pic.twitter.com/HKzR8PD1FM
— ばにら (@vaniiiirava) June 21, 2023
段差を超えて移動する
段差やフェンスなどを飛び越えて移動する動きを実装してみます。
高低差のあるステージを作成
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で動かすテスト3#Unity pic.twitter.com/K9xfIHkH9x
— ばにら (@vaniiiirava) June 21, 2023
さいごに
NavMeshを使った移動は敵やNPCの実装で使う場面が多そうです。
使い方もそこまで難しくなさそうなので、ドキュメントを確認しながら色々試してみようと思います。
コメント