【Unreal Engine】NavMesh入門:歩ける範囲を見て、AIが動かない原因を探す

作成: 2025-12-12最終更新: 2026-09-06

敵が動かないときは、Pキーで歩ける範囲を確認。NavMeshと当たり判定の違いから、AI MoveToでの移動実験、体格に合う設定、動く障害物への対応までを図解します。

「敵に移動を命令したのに、その場から動かない」。そんなとき、Blueprintの前に見ておきたいものがあります。NavMesh(ナビメッシュ)、AIが道を探すための地図です。

見た目には立派な床があっても、AIが使う地図に載っていなければ、目的地までの道を見つけられません。まずは P キーで地図を表示し、敵の足元と目的地を見比べてみましょう。

Pキーで、AIの経路探索に使うNavMeshを表示するイメージ

この記事でわかること

  • NavMeshとコリジョンは別物だということ
  • Pキーで歩ける範囲を目で確かめる方法
  • AIの体格に合わせて通れる幅と段差を決める考え方
  • 動く障害物と、避けたい場所の指定

この記事では、UE5のThird Personテンプレートを使い、Nキーを押すと敵が障害物を回り込んで移動する実験を作ります。動く状態を確かめてから、体格や地形の変化に合わせた設定へ進みます。

Sponsored

NavMeshは「道を探すための地図」

敵が壁を回り込むには、「壁がある」と分かるだけでなく、どちらへ進めば向こう側へ行けるかを調べる必要があります。この道順を探す処理が経路探索です。

NavMeshには、床や障害物の形から調べた「この体格なら歩いて通れる範囲」が記録されています。AIはその情報を使って経路を選び、移動を担当するコンポーネントのCharacter Movementがキャラクターを動かします。

NavMeshは道を選ぶ情報、コリジョンは体を支えて壁で止める判定、Character Movementは実際の移動を担当する

ここで、NavMeshとコリジョンは別の役割だと押さえておきましょう。コリジョンは当たり判定のこと。AIのキャラクターも、プレイヤーと同じく床の当たり判定に支えられています。NavMeshを表示したからといって、空中に新しい床ができるわけではありません。

この記事で扱うのは、AI MoveTo で地上を歩かせる基本的な使い方です。ジャンプで離れた足場を渡るといった移動には、別途Nav Linkなどの仕組みを組み合わせます。

まずPキーで見る

Nav Mesh Bounds Volumeは、NavMeshを作る範囲を囲む箱です。名前は長いですが、まずは「この中の床を地図にしてください」と指定するものだと考えてください。

  1. Third Personテンプレートのレベルを開き、作業用に別名で保存します。
  2. 「Place Actors(アクタを配置)」で Nav Mesh Bounds Volume を検索し、レベルへ置きます。すでにある場合は、その範囲を確認します。
  3. ボリュームの位置と大きさを調整し、試したい床全体を囲みます。上から見た広さだけでなく、箱の高さにも床が入るようにしてください。
  4. エディタのビューポートをクリックし、P キーを押します。

床に緑の領域が重なれば、NavMeshが生成されています。もう一度 P を押すと表示を隠せます。これはエディタで確認するための表示です。

Nav Mesh Bounds Volumeで床を囲み、Pキーで生成された範囲を確認する

見る場所は、敵の足元・目的地・その間の通り道の3つ。両端が緑でも、間が切れていれば、この基本設定では歩いて渡れません。

敵と目的地がそれぞれNavMesh上にあっても、間が切れていると歩く経路がつながらない

緑がまったく出ない場合は、次の順に確認します。

確認するもの見るところ
ボリューム試験用の床を、上下方向も含めて囲んでいるか
床のコリジョン見た目だけの板になっていないか。まずテンプレートの床で試すと切り分けやすい
地図の更新編集後の形が反映されているか。エディタ環境設定で「Update Navigation Automatically」を検索して確認
生成する体格極端に大きなAgent設定で、歩ける場所がなくなっていないか

実践:Nキーで敵を移動させる

まずは判断の仕組みを増やさず、置いた敵を、置いた目印まで歩かせることだけ試します。Behavior Treeはまだ使いません。移動の土台が動くと確認できれば、その後の問題も探しやすくなります。

1. 敵と目的地を置く

コンテンツブラウザで BP_ThirdPersonCharacter を複製し、BP_NavTestEnemy と名付けます。複製した方のEvent Graphにある処理は削除し、コンポーネントや見た目は残します。

BP_NavTestEnemy の「Class Defaults」で次を設定します。

設定何のためか
AI Controller ClassAIControllerAIが敵を操作できるようにする
Auto Possess AIPlaced in World or Spawned配置した敵に、実行時にAI Controllerを付ける
Auto Possess PlayerDisabledプレイヤー操作の対象にしない
Use Controller Rotation Yawオフ向きの制御をCharacter Movementに任せる

Controllerはキャラクターを操作する側、Possessは「このキャラクターを担当する」と結び付くことです。移動命令を渡す相手がいても、操作するAI Controllerがいなければ、この実験の敵は歩きません。

続いて「Character Movement」コンポーネントを選び、「Orient Rotation to Movement」をオン、「Max Walk Speed」を 300 にします。移動する方向を向き、最高速度を毎秒300cm(3m)にする設定です。コンパイルして保存します。

レベルに次の2つを置き、アウトライナー上の名前を変更してください。

  • BP_NavTestEnemy を1体置き、NavTestEnemyとする。
  • 「Place Actors」で Target Point を探して置き、NavGoalとする。Target Pointは、位置を指定するための目印です。

同じ平らな床の上で、両者を5mほど離します。敵の足元とNavGoalの位置がNavMesh上にあり、その間がつながっていることを P で確認しましょう。間に箱を置く場合は、左右に回り込める広さを残してください。

2. レベルに置いた2つを、移動命令へ渡す

レベル上部の「Blueprints」から「Open Level Blueprint」を開きます。Level Blueprintは、そのレベルだけの処理を書く場所です。今回はキー入力による実験をここに作ります。

アウトライナーで NavTestEnemy を選択してから、Level Blueprintのグラフを右クリックし、「Create a Reference to NavTestEnemy」を選びます。NavGoal も同じ操作で参照を作ります。コンテンツブラウザにある設計図ではなく、レベルに実際に置いた相手への参照です。

次の順でノードをつなぎます。

白い三角のピンは処理を進める順番、青い丸のピンは対象の参照を渡します。図では、必要な接続に絞って表示しています。

  1. 右クリックでキーボードの N イベントを追加します。「Pressed」から Print String をつなぎ、「In String」に 移動要求 と入力します。
  2. Print String の実行出力から AI MoveTo の実行入力へつなぎます。
  3. NavTestEnemy の参照を Pawn へ、NavGoal の参照を Target Actor へつなぎます。
  4. 「Acceptance Radius」を 100、「Stop on Overlap」をオフにします。

Pawnは「誰を動かすか」、Target Actorは「どこへ行くか」 です。この2つを逆にしないことが、接続の要点です。今回はTarget Actorで目的地を渡すため、「Destination」の座標入力は使いません。

敵をPawn、目的地の目印をTarget Actorへ渡し、NキーのPressedから移動を要求する

Acceptance Radiusは、「目的地まであと何cmなら到着扱いにするか」という許容距離です。ここでは 100、つまり1m手前まで近づけば十分とします。「Stop on Overlap」をオフにしたのは、この許容距離に敵自身の半径を加えず、設定の意味を追いやすくするためです。

3. 到着したか、失敗したかを表示する

AI MoveToOn Success から Print String をつなぎ、到着 と表示します。On Fail からも別の Print String をつなぎ、移動失敗 と表示してください。

AI MoveToのOn Successで到着、On Failで移動失敗を表示する

AI MoveTo にある通常の実行出力は、到着まで待つ出力ではありません。移動の結果はOn Success / On Failで受け取ると覚えておくと、「歩き始めた瞬間に到着処理が走る」間違いを防げます。

コンパイルして保存し、「Play」でゲームを開始します。ゲーム画面をクリックしてから N を一度押してください。「移動要求」と表示され、敵がNavGoalへ歩き、近づくと「到着」と出れば成功です。箱を挟んだ場合は、回り込む様子も見られます。

Target Pointの目印は、編集用なのでPlay中には表示されません。敵が向かう位置を先に確認しておきましょう。また、移動中にNキーを連打すると移動要求が上書きされるため、まずは結果が出るまで待ちます。

4. 動かないときは、表示からさかのぼる

観察したこと次に確認すること
「移動要求」も出ないPlay中か、ゲーム画面に入力フォーカスがあるか、NのPressedがつながっているか
「移動要求」の直後に「移動失敗」PawnとTarget Actorの参照、AI Controllerの設定、両端と通り道のNavMesh
歩き出すが、途中で止まるコリジョンで道が塞がれていないか、敵の体格が地図と合っているか
目印の少し手前で「到着」今回はAcceptance Radiusが100なので正常。ぴったり重なる必要はない

動いたら一度Playを止め、Bounds Volumeを試験場所から外して地図を更新し、同じ操作を試してみてください。ほかのボリュームも覆っていない場所であれば、緑の領域が消え、経路を作れず「移動失敗」になります。元の位置へ戻すと、また歩けます。

床もBlueprintも同じなのに、地図の有無で結果が変わる。この比較ができると、次に敵が動かなくなったときも、調べる場所を絞れます。

Sponsored

AIの体格に合わせる

人間は通れても、大きなボスは通れない通路があります。NavMeshにも、どれくらいの体格のキャラクターが通るのかを教える必要があります。経路探索をするキャラクターを、設定上は Agent(エージェント) と呼びます。

まず、キャラクターの「Capsule Component」を選びます。カプセルは体を包む当たり判定で、「Capsule Radius」が半径、「Capsule Half Height」が高さの半分です。スケールが1なら、全体の高さはHalf Heightの2倍になります。

次に「Project Settings」の「Navigation Mesh」で、生成する地図の体格を確認します。

設定地図に教えること
Agent Radius体の半径。壁からどれだけ離れれば体が収まるか
Agent Height体の全高。天井までどれだけ空きが必要か
Agent Max Slope歩いて上れる坂の角度
Agent Max Step Height歩いて越えられる段差の高さ

UEのバージョンによって、段差の設定は「Nav Mesh Resolution Params」内で解像度ごとに分かれています。また、複数の体格を登録したプロジェクトでは、「Navigation System」の「Supported Agents」も確認してください。今見ている地図が、どの体格用なのかをそろえてから調整します。

壁際の緑が削れるのは、体の分の余白

NavMeshは、キャラクターの中心が通れる場所を示します。壁ぎりぎりまで中心を近づけると、体の半分が壁にめり込んでしまうため、Agent Radiusの分だけ壁から離して生成されます。

Agent Radiusの分だけ壁から歩ける範囲が削られる。大きすぎると通路が消え、小さすぎると体が引っかかる

半径が大きすぎると、本当は通れる廊下にも経路を作れません。逆に小さすぎると、地図上では通れるのに、実際のカプセルが壁に引っかかります。緑を増やすためだけに小さくせず、キャラクターの当たり判定に合う値を基準にしましょう。

設定を変えたら、地図の再生成が終わってから P で通路の幅を見直し、先ほどのNキーの実験を試します。見た目の緑が増えただけで終わらず、敵の体が引っかからずに通れるところまで確認してください。

坂と段差も、地図側だけでは決まりません。「Character Movement」にも「Walkable Floor Angle」と「Max Step Height」があります。地図が「通れる」と判断しても、移動側がその坂や段差を越えられなければ、途中で止まってしまいます。

地形が変わるゲームでは、地図も更新する

ドアが開く、橋が架かる、壁が壊れる。ゲーム中に通れる場所が変わるなら、AIの地図にも変化を伝えます。その更新方法を選ぶのがRuntime Generationです。「実行中に、どこまで地図を作り直すか」という設定です。

「Project Settings」→「Navigation Mesh」で確認できます。

Staticは作っておいた地図を使い、Dynamic Modifiers Onlyは既存の地図の扱いを変え、Dynamicは形の変化に合わせて歩ける面も更新する
設定実行中に変えられるもの使う場面の例
Static実行中には再生成しない地形も通行条件も変わらない、小さな固定マップ
Dynamic Modifiers Onlyすでにある地図の通行可否やコスト地図は作っておき、特定の区域だけ通行禁止にする
Dynamic形の変化に応じた、歩ける面の生成動く障害物を反映する、実行中に新しい床を増やす

Modifier(モディファイア) は、地図の特定の範囲に「ここは通行禁止」などの扱いを指定するものです。Dynamic Modifiers Onlyは、その指定を更新できますが、地図がなかった場所に歩ける面を作ることはできません

たとえばドアを扱う方法は、2つ考えられます。

  • 動くドアそのものを地図へ反映するならDynamic。開閉に応じて、その周辺の歩ける範囲を更新します。
  • 通路の地図を先に作っておき、閉じている間だけModifierで塞ぐならDynamic Modifiers Only。この方式では、閉じたドアの形で地図に穴を焼き込まないようにしておく必要があります。

後者で禁止を解除しても、元から地図がなければ道は現れません。また、Modifierが変えるのは経路探索の情報です。ドアを動かす処理や、実物の当たり判定を切り替える処理は別に用意します。

Dynamicでも、毎回マップ全体を作り直すわけではありません。NavMeshはタイルという小さな区画に分かれていて、変化した部分を更新します。ただし、更新する範囲や頻度が増えれば負荷も増えます。最初の固定床の実験はStaticで十分です。

崖際には入ってほしくない。一方、毒の沼は遠回りできるなら避けてほしい。この2つは、地図上でも区別できます。

「Place Actors」から Nav Modifier Volume を置き、対象の床を囲みます。「Area Class」で、その範囲の扱いを選びます。

編集時に配置するだけならStaticでも反映されます。Play中に範囲や扱いを変える場合は、前の節の更新方法も合わせて選びます。

NavArea_Nullは通行禁止、NavArea_Obstacleは通行コストが高い区域として扱う
Area Class意味
NavArea_Default通常の歩ける区域
NavArea_Null経路に使えない区域。通行禁止にしたい場所向け
NavArea_Obstacle通るコストが高い区域。なるべく避けてほしい場所向け

コストは、道を選ぶための「通りにくさの点数」です。経路探索では、距離や区域ごとの設定から求めた点数の合計が小さい道を選びます。

通るコストの合計で経路を選ぶ例。危険な近道が10、遠回りが6なら遠回りを選ぶが、遠回りが20なら近道を選ぶ

そのため、NavArea_Obstacleは別の道があれば必ず避けるという意味ではありません。遠回りの方が高くつくなら、その区域を通ることもあります。絶対に通してはいけない場所にはNavArea_Nullを使いましょう。

なお、Areaを設定しただけで毒ダメージが発生したり、歩く速度が落ちたりするわけではありません。道の選び方と、通ったときに起こることは別の設定です。

Sponsored

重くする前に、必要な範囲を考える

最適化の最初の一歩は、細かな数値を触ることより、どこに地図が必要で、いつ更新が必要かを決めることです。

  • Bounds Volumeは、AIが移動する範囲を囲む。背景の山まで無条件に含める必要はありません。
  • 固定の地形なら、まずStaticで作る。変化が必要になった段階で、その内容に合う更新方法を選びます。
  • Dynamicでは、動くものが常に地図の更新を引き起こしていないか確認する。経路探索に関係しない飾りまで反映すると、余計な更新が増えます。

「Cell Size」「Cell Height」は、地形を調べる細かさに関わる値です。小さくすると細かな形を扱いやすくなりますが、生成やメモリの負担も増えます。まずは初期値で動かし、必要な細い道や段差を表せないと分かってから見直しましょう。

巡回先には「今いる場所から届く点」を使う

次に敵を巡回させるなら、Get Random Reachable Point in Radiusが使えます。指定した位置の周辺で、そこから経路がつながるランダムな点を探すノードです。

よく似た Get Random Location in Navigable Radius は、NavMesh上の点を探しますが、元の位置から届くとは限りません。地図が島のように分かれていると、この違いが移動失敗につながります。

Reachable Pointは今いる島の中から選ぶが、Navigable Radiusは届かない島の点も選ぶ

移動が動いたら、Behavior Tree入門:巡回する敵が、プレイヤーを見つけて追ってくるで、巡回先を選ぶ処理と追跡の判断を組み合わせてみてください。体格や段差側を詳しく調整したい場合は、Character Movementの基本も役立ちます。

おまけ:先に知っておくと良いこと

  • 緑が出ていない場所へは行けない: Pキーで緑が見えないなら、NavMesh Bounds Volumeの範囲、床のCollision、ビルドの状態の順に確かめます
  • 体格が合わないと経路がおかしくなる: Agent RadiusとHeightがキャラクターのカプセルと合っていないと、通れるはずの隙間を避けたり、逆に通れない場所へ経路を引いたりします。敵の体格を変えたらNavMeshも作り直します
  • 動く障害物は設定が別: 開く扉や動く足場を経路へ反映したいときは、Runtime GenerationとDynamic Obstacleの設定が関わります
  • Nav Modifierは「禁止」だけではない: 「通れるが、できれば避けたい場所」も指定できます。溶岩や水たまりの表現に使えます

まとめ

AIが動かないときは、まず P キーでNavMeshを表示し、敵の足元から目的地まで道がつながっているかを見ます。地図があれば、移動要求、操作するAI Controller、実際の当たり判定へと順に調べます。

地図は道を選び、コリジョンは体を支えます。この役割の違いを押さえておくと、「緑なのに引っかかる」「床を増やしたのに歩かない」も、別々の問題として考えられるようになります。

参考資料

Unreal Engine このセクションのノート98