【Unity】NavMeshを使ってキャラクターを自動で移動させる

【Unity】NavMeshを使ってキャラクターを自動で移動させる Unity
記事内に広告が含まれています。
スポンサーリンク

記事作成時の動作環境

  • Unity 2022.3.2f1
  • NavMesh 1.1.4

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の実装で使う場面が多そうです。

使い方もそこまで難しくなさそうなので、ドキュメントを確認しながら色々試してみようと思います。

参考サイト

コメント

タイトルとURLをコピーしました