【Unity】NavMeshの作成手順(Unity2022以降:新バージョン)

2025年4月3日

NavMesh(ナビゲーションメッシュ)は、3Dゲームでキャラクターが自動的に移動できるエリアを定義する技術です。ゲーム開発では、キャラクターが障害物を避けて目標地点に到達するような経路探索が必要です。NavMeshを使うと、ゲームの地形をもとに移動可能な範囲(メッシュ)を自動的に生成し、キャラクターが効率的に移動できます。Unityでは、NavMeshコンポーネントを追加して、簡単に経路探索を設定できるため、初心者でも使いやすい機能です。

新しいバージョンになり、一部、操作が異なります
次を参考に進めていきましょう

パッケージマネージャからAI Navigationのインポート

Unity6ではデフォルトでインポートされています

Windowメニューからビューを開いてインポートします

障害物の作成

テスト用に高さ1くらいのCubeを作成して、プレイヤーと敵の間に置いておきましょう

追いかける敵を作成します

想定として敵に見立てたシリンダーを1つ置いてみましょう

敵のゲームオブジェクトに追いかける機能のコンポーネントを追加します

NavMeshAgentコンポーネントを追加します

追いかけるスクリプトの作成

NavMeshAgentを利用するために、移動用にスクリプトを1つ作成し、敵(シリンダー)にアタッチします


NavmeshAgentのdestination(目的地)プロパティにプレイヤーを代入することで追いかける機能が実行されます

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class Enemy : MonoBehaviour
{
    [SerializeField]
    Transform playerTransform;

    NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        agent.destination = playerTransform.position;
    }
}

アタッチしたら、インスペクターのplayerTransformフィールドに、追いかけられるプレイヤーをドラッグ&ドロップします

Updateに記述しているので、毎フレームごとにプレイヤーが移動すると、そこに向かって追いかけてくることになります

敵の移動可能エリアの指定

シーンにNavMesh Surfaceゲームオブジェクトを作成と移動エリアを作成

ヒエラルキーで右クリック、AIメニューから選択します
NavMeshSurfaceコンポーネントがアタッチされたNavMesh Surfaceゲームオブジェクトが作成されます
(ゲームオブジェクト名とコンポーネント名が同じですが、機能が違うので大丈夫です)

敵の移動エリアの作成

作成後、NavMeshSurfaceコンポーネントで、移動可能エリアのベイクを実行します

上記手順を進めた時の動画

実行結果

敵が追っかけてくるパラメータ(情報)のカスタム設定

スピードがデフォルトで3.5m/sになっていますので、ゆっくり迫ってきて欲しい時は調整しましょう

NavMesh Surfaceの情報を変更するには

エージェントの移動制限のパラメータは、インスペクターから変更できません

Windowメニューから設定変更のページを開きます

参考

NavMesh Surface コンポーネント

ピックアップしているのは、どのエリアを指定するかのポイントになります

NavMeshSurface コンポーネントには、ナビメッシュの生成を細かく制御するためのさまざまな設定項目があります。以下に主な設定項目を列挙します。

  1. Agent Type
    • ナビメッシュを生成する際に対象となるエージェントの種類を指定します。これにより、エージェントのサイズ(半径や高さ)や歩行可能な領域が決まります。
  2. Collect Objects
    • ナビメッシュ生成時にどのオブジェクトを収集するかを設定します。
      • All: シーン内の全オブジェクト(Layer Maskでフィルタリング可能)が対象。
      • Children: NavMeshSurface がアタッチされているオブジェクトの子オブジェクトのみが対象。
      • Volume: 指定した領域(Center と Size で定義)内のオブジェクトが対象。
  3. Layer Mask
    • 収集対象とするオブジェクトを、特定のレイヤーに基づいて絞り込みます。指定したレイヤーに属するオブジェクトだけがナビメッシュ生成の対象になります。
  4. Use Geometry
    • ナビメッシュ生成時にどのジオメトリ情報を利用するかを選択します。
      • Render Meshes: メッシュレンダラーの形状からジオメトリを収集。
      • Physics Colliders: 物理コライダーの形状からジオメトリを収集。
      • ※ Unity のバージョンやパッケージによっては、両方を組み合わせるオプションがある場合もあります。
  5. Default Area
  • ビルドされたナビメッシュ上に適用されるデフォルトのエリアタイプを設定します。通常は「Walkable」(歩行可能)ですが、必要に応じて変更可能です。
  1. Override Tile Size
    • デフォルトのタイルサイズを上書きして、カスタムのタイルサイズを使用するかどうかを設定します。
    • 有効にすると、タイルサイズがパフォーマンスやメモリ使用量に与える影響を調整できます。
  2. Tile Size
    • Override Tile Size が有効な場合に、ナビメッシュビルド時に使用するタイルのサイズ(分割単位)を指定します。
  3. Override Voxel Size
    • ナビメッシュ生成時に用いるボクセルサイズをデフォルト値から上書きするかどうかを指定します。
    • ボクセルサイズはナビメッシュの解像度に影響し、より小さい値にすると詳細なジオメトリが反映されますが、ビルド時間が長くなる可能性があります。
  4. Voxel Size
    • Override Voxel Size を有効にした場合に、カスタムのボクセルサイズを指定します。
  5. NavMesh Data (Runtime Reference)
    • ビルドされたナビメッシュデータへの参照を保持するフィールドです。スクリプトからナビメッシュの更新やクエリを行う際に利用されます。

これらの設定を組み合わせることで、シーン内の特定のオブジェクトや領域に合わせたナビメッシュを柔軟に生成することが可能です。シーンの構成やエージェントの特性に合わせて、各パラメータを調整してください。

AI,Unity

Posted by hidepon