unity-navmesh について
Unity 6.3 LTSでAI Navigationを使う開発者向けのスキルです。歩行可能な面のベイク、NPCの移動、障害物への対応、経路の到達可能性確認を扱います。
主な機能
- 01NavMeshSurfaceによるナビメッシュのベイク
- 02NavMeshAgentによるNPCの移動
- 03経路と目的地への到達可能性確認
- 04NavMeshObstacleによる経路の遮断
- 05NavMeshLinkによる領域間の接続
活用シーン
- 01NPCによるターゲットの追跡や巡回
- 02レベル形状に合わせた歩行可能面のベイク
- 03ドアや箱を避ける経路の設定
- 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/NavMeshAPI は、引き続きビルトインのUnityEngine.AIにあります。
使用する場面
- エージェントにターゲットまでの歩行、追跡、巡回をさせる場合、ナビゲーション可能なサーフェスをベイクする場合、動的な障害物(
NavMeshObstacle)を追加する場合、または目的地に到達できるか確認する場合に使用します。 - プロジェクトに AI Navigation パッケージ、
NavMeshSurfaceコンポーネント、またはUnityEngine.AI.NavMeshAgentを使用するスクリプトがある場合に使用します。
使用しない場面: 移動するタイミングや場所を決めるロジック(FSM、ビヘイビアツリー、ステアリング)には game-ai を使用します(このスキルは Unity の移動/経路探索の仕組みです)。経路探索を行わない、力駆動またはキネマティックな移動には unity-physics を使用します。
基本的なワークフロー
- AI Navigation パッケージをインストールします(Package Manager →
com.unity.ai.navigation)。 - サーフェスをベイクします。静的なレベルジオメトリを選択し、Add Component → Navigation → NavMesh Surface を選択して、エージェントタイプ/エリア設定を行い、Bake をクリックします。ジオメトリ、
NavMeshModifier、またはエージェント設定を変更するたびに、再ベイクしてください。 - 移動する各 NPC に
NavMeshAgentを追加します。半径、高さ、速度はベイクしたエージェントタイプに合わせ、ベイク済みメッシュ上にスポーンさせてください。 SetDestination(targetPos)を使ってスクリプトから動かします。エージェントは自動的にステアリングし、ほかのエージェントを回避します。remainingDistance/pathPendingで到着を検知します。NavMeshObstacle(Carving)を使って動的な障害物に対処し、閉じたドアや箱が全面的な再ベイクなしで経路を塞ぐようにします。- 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— 経路探索とゲームプレイを組み合わせるジャンル。
コメント
Markdown 対応