mcpField
U
unity-navmesh

unity-navmesh

github.com/gamedev-skills開発5.4k6.1k 回インストール1 日前に更新
リポジトリ

unity-navmesh について

Unity 6.3 LTSでAI Navigationを使う開発者向けのスキルです。歩行可能な面のベイク、NPCの移動、障害物への対応、経路の到達可能性確認を扱います。

主な機能

  1. 01NavMeshSurfaceによるナビメッシュのベイク
  2. 02NavMeshAgentによるNPCの移動
  3. 03経路と目的地への到達可能性確認
  4. 04NavMeshObstacleによる経路の遮断
  5. 05NavMeshLinkによる領域間の接続

活用シーン

  1. 01NPCによるターゲットの追跡や巡回
  2. 02レベル形状に合わせた歩行可能面のベイク
  3. 03ドアや箱を避ける経路の設定
  4. 04離れた足場や床領域の接続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill unity-navmesh

インストール後、Claude Code で/unity-navmeshを入力して読み込まれたか確認します。

詳細

Unity NavMesh(AI Navigation)

Unity 6.3 LTS で NPC に経路探索を使わせる方法:歩行可能なサーフェスをベイクし、エージェントを障害物の周囲に移動させます。 Unity 6.3 LTS(6000.3) と AI Navigation パッケージ 2.x を対象としています。

バージョンに関する注意(Unity 2022+/6): 以前のビルトインの Navigation ウィンドウ(Object/Bake タブ)は廃止されました。ベイクは AI Navigation パッケージ(com.unity.ai.navigation)を使ってコンポーネントベースで行います。レベルのジオメトリに NavMeshSurface を追加し、Bake をクリックします。ランタイム の NavMeshAgent/NavMesh API は、引き続きビルトインの UnityEngine.AI にあります。

使用する場面

  • エージェントにターゲットまでの歩行、追跡、巡回をさせる場合、ナビゲーション可能なサーフェスをベイクする場合、動的な障害物(NavMeshObstacle)を追加する場合、または目的地に到達できるか確認する場合に使用します。
  • プロジェクトに AI Navigation パッケージ、NavMeshSurface コンポーネント、または UnityEngine.AI.NavMeshAgent を使用するスクリプトがある場合に使用します。

使用しない場面: 移動するタイミングや場所を決めるロジック(FSM、ビヘイビアツリー、ステアリング)には game-ai を使用します(このスキルは Unity の移動/経路探索の仕組みです)。経路探索を行わない、力駆動またはキネマティックな移動には unity-physics を使用します。

基本的なワークフロー

  1. AI Navigation パッケージをインストールします(Package Manager → com.unity.ai.navigation)。
  2. サーフェスをベイクします。静的なレベルジオメトリを選択し、Add Component → Navigation → NavMesh Surface を選択して、エージェントタイプ/エリア設定を行い、Bake をクリックします。ジオメトリ、NavMeshModifier、またはエージェント設定を変更するたびに、再ベイクしてください。
  3. 移動する各 NPC に NavMeshAgent を追加します。半径、高さ、速度はベイクしたエージェントタイプに合わせ、ベイク済みメッシュ上にスポーンさせてください。
  4. SetDestination(targetPos) を使ってスクリプトから動かします。エージェントは自動的にステアリングし、ほかのエージェントを回避します。remainingDistance/pathPending で到着を検知します。
  5. NavMeshObstacle(Carving)を使って動的な障害物に対処し、閉じたドアや箱が全面的な再ベイクなしで経路を塞ぐようにします。
  6. AI Navigation オーバーレイ(ベイク済みメッシュは Scene ビューに表示されます)と、エージェントが障害物を迂回してゴールに向かう様子で確認します。到達できないターゲットについては NavMeshPath.status を確認してください。

パターン

1. NavMeshAgent による追跡/追尾
using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class Chaser : MonoBehaviour
{
    [SerializeField] private Transform target;
    private NavMeshAgent _agent;

    private void Awake() => _agent = GetComponent<NavMeshAgent>();

    private void Update()
    {
        if (target) _agent.SetDestination(target.position);   // re-path toward the target
    }

    // Arrived? pathPending guards the first frame before a path exists.
    private bool HasArrived() =>
        !_agent.pathPending && _agent.remainingDistance <= _agent.stoppingDistance;
}
2. 移動を確定する前に到達可能か確認
using UnityEngine.AI;

public bool CanReach(NavMeshAgent agent, Vector3 destination)
{
    var path = new NavMeshPath();
    agent.CalculatePath(destination, path);
    return path.status == NavMeshPathStatus.PathComplete;   // vs Partial / Invalid
}
3. ランタイムでベイク(プロシージャル生成またはストリーミングされるレベル向け)
using Unity.AI.Navigation;   // the package namespace (NavMeshSurface)

[SerializeField] private NavMeshSurface surface;

// After spawning level geometry, build the navmesh in code.
public void RebuildNav() => surface.BuildNavMesh();
4. メッシュを分割する動的障害物
// Add a NavMeshObstacle (Carve = true) to a door/crate. While present it cuts a hole in the
// navmesh so agents route around it; remove/disable it to reopen the path — no re-bake needed.
5. NavMeshLink でメッシュの別々の部分を接続(ジャンプ、ドア、隙間)
// Two baked surfaces that don't touch (a ledge and the floor below, two platforms across a
// gap) are separate islands — an agent can't path between them. Add Component > Navigation >
// NavMesh Link to bridge them: assign Start/End Transforms, set Width (0 = point-to-point),
// and toggle Bidirectional for one-way vs two-way. NavMeshLink lives in Unity.AI.Navigation.
// It replaces the deprecated built-in OffMeshLink (see pitfalls).

注意点

  • Navigation ウィンドウを探している — Unity 6 ではすでに存在しません。AI Navigation パッケージの NavMeshSurface コンポーネントを使ってベイクしてください。
  • エージェントが動かない/原点にワープする — ベイク済みメッシュ上にいないか、サーフェスが ベイクされていません。サーフェスをベイクし、エージェントをその上にスポーンしてください (NavMesh.SamplePosition で位置を合わせます)。
  • エージェントが新しいジオメトリを無視する — ナビメッシュはベイク済みです。実行時にスポーンした障害物には NavMeshObstacle(カービング)を使うか、surface.BuildNavMesh() で再ベイクしてください。
  • 毎フレーム SetDestination を呼び出すのは非効率です — 移動の遅いターゲットの場合は、毎フレームではなく、 タイマー(例:0.2 秒ごと)で経路を再計算してください。
  • エージェントの半径/高さが一致していない — NavMeshAgent のサイズがベイク時のエージェント タイプと異なると、隙間にはまったり、浮いたりします。一致させてください。
  • エージェント同士がぶつかって振動する — avoidancePriority と品質を調整するか、エージェントの回避機能に頼るのではなく、 完全に静止した障害物には障害物を使用してください。
  • OffMeshLink を使おうとしている — 組み込みの OffMeshLink コンポーネントは AI Navigation 2.0 で 非推奨となり、Add Component メニューから追加できなくなりました。代わりにパッケージの NavMeshLink(Unity.AI.Navigation)を使ってください。Transform ベースのエンドポイントと実行時の activated プロパティが追加されます。既存の OffMeshLink は移行してください。
  • CalculatePath が PathPartial を返す — 目的地がエージェントとは異なるベイク済み アイランド上にあります(メッシュが接続されていない隙間があります)。NavMeshLink(パターン 5)で 2 つをつなぐか、1 つのサーフェスが両方を覆うようにジオメトリを拡張してください。部分経路では 手前側の端までしか到達できません。

参考資料

  • 主なドキュメント:AI Navigation パッケージのマニュアル (https://docs.unity3d.com/Packages/[email protected]/manual/index.html)、 NavMeshLink のページ (https://docs.unity3d.com/Packages/[email protected]/manual/NavMeshLink.html) および OffMeshLink の非推奨に関する「What's new」の注記 (https://docs.unity3d.com/Packages/[email protected]/manual/whats-new.html)、さらに ScriptReference/AI.NavMeshAgent、ScriptReference/AI.NavMesh。

関連スキル

  • game-ai — エンジンに依存しない意思決定(FSM、ビヘイビアツリー、ステアリング)。これを使用します。
  • unity-csharp-scripting — エージェントを囲む MonoBehaviour の構造。
  • tower-defense / fps-shooter — 経路探索とゲームプレイを組み合わせるジャンル。

コメント