【Unreal Engine】NavMeshの設定と最適化:AIが動かない原因を潰す

作成: 2025-12-12最終更新: 2026-07-20

AIが1歩も動かない、壁際で引っかかる——原因はNavMeshの設定です。Pキーで緑の床を確認する所から、Agent設定の合わせ方、Runtime Generationの選び方までを図解し、動かないAIを直す実践つき。

AIを作りはじめて最初に出会う壁は、たいてい 「敵が1歩も動かない」 です。Behavior Treeも組んだ、AI Controllerも割り当てた、それでも棒立ちのまま。原因の多くは、AIそのものではなく 足元の床 にあります。

UEのAIは、地面の上を自由に歩いているわけではありません。 NavMesh(ナビメッシュ) という「歩いていい場所のデータ」の上だけを移動します。この記事では、NavMeshを目で見る方法から、AIのサイズに合わせる設定、地形が変化するゲームでの選び方、そして動かないAIを実際に直す手順までを解説します。

地面の上に、AIが歩ける範囲だけが緑の床として浮かんでいるイメージ

この記事でわかること

  • AIは地面ではなく NavMeshの上 を歩いている
  • まず Pキー で緑の床を見る(ここが全ての出発点)
  • 緑が 狭く出るのは正常 (Agent Radiusの分だけ削られる)
  • Runtime Generation は Static / Dynamic Modifiers Only / Dynamic の3択
  • 実践:動かないAIを 上から順に切り分けて 直す

Sponsored

AIはNavMeshの上を歩いている

プレイヤーは地面のコリジョンの上を歩きますが、 AIは違います 。AIが参照するのは NavMesh 、「ここは歩いて移動できる」という情報を床の形として持ったデータです。

地面の上に、歩ける範囲だけを表す薄い床が重なっている図

なぜ別のデータが必要なのか。 経路を計算するため です。「AからBへ行きたい」と言われたとき、地面のポリゴンを毎回調べていては間に合いません。あらかじめ「歩ける面」を単純な形にまとめておくことで、 経路探索を高速に解ける ようにしています。

ここから、重要な帰結が2つ出てきます。

  • NavMeshがない場所へは、AIは移動できない 。地面があっても関係ありません
  • NavMeshは事前に生成される 。あとから床を置いても、再生成しなければ反映されません

「AIが動かない」の大半は、この2つのどちらかです。

まずPキーで見る

原因を推測する前に、 見てください 。エディタのビューポートにマウスカーソルを置いて P キー を押すと、NavMeshが緑色の床として表示されます。

NavMesh Bounds Volumeを置いた範囲だけ、床が緑色に表示されている図

何も出てこない場合、まず疑うのは NavMesh Bounds Volume です。Place Actors パネル(ウィンドウ → Place Actors)で「Nav」と検索し、 NavMesh Bounds Volume をレベルにドラッグします。

それでも出ないときは、次も確認してください。

  • 床にコリジョンがあるか: NavMeshは ワールドのコリジョンから作られます 。見た目の床があっても、コリジョンが無ければ生成されません
  • 床の Can Ever Affect Navigation が有効か: Actorの詳細パネルにあります。ここがオフだとNavMeshの生成対象になりません
  • 自動更新が有効か: Edit → Editor Preferences → Level Editor → MiscellaneousUpdate Navigation Automatically 。これがオフの環境では、Build → Build Paths を実行するまで生成されません

置いたら、スケールを調整して AIに歩かせたい範囲を丸ごと包む ようにします。ここで初心者がつまずくポイントが2つあります。

  • ボリュームが地面を含んでいない: 空中に浮いていたり、地面より上にしか無いと生成されません。 地面を内側に含む ようにします
  • ボリュームが小さすぎる: 端まで歩かせたいなら、その端まで覆う必要があります

P を押して緑の床が出たら、 AIの足元・通る道・目的地が、ひと続きの緑につながっているか まで確認してください。緑がどこかに出ているだけでは足りません。

Pレベルエディタのビューポート のショートカットです。PIE中にゲーム側が入力を受けている状態では切り替わらないことがあります。

緑が出たのに狭い? 壁際が少し削れて見えるのは正常です。次のAgent Radiusが理由です。

AIのサイズに合わせる

緑の床は、 AIのサイズを考慮して 作られます。「このキャラクターが通れるか」を事前に計算しているので、キャラクターと設定がずれていると挙動がおかしくなります。

壁からAgent Radius分だけ内側に削られた緑の床と、キャラクターのカプセル��を重ねた図

設定は Edit → Project Settings → Engine → Navigation Mesh にあります(Agents セクション。段差の項目は Nav Mesh Resolution Params 側にあります)。

設定意味合わせる相手
Agent RadiusAIの太さキャラクターの Capsule Radius
Agent HeightAIの高さキャラクターの Capsule Half Height × 2
Agent Max Slope登れる坂の角度既定44度。急坂を登らせたいなら上げる
Agent Max Step Heightまたげる段差Character Movementの Max Step Height

Agent Radius が大きいほど、緑の床は壁から内側に削られます 。これは「太いキャラクターは壁ぎりぎりを通れない」という当たり前を、あらかじめ計算に入れているからです。

だから症状はこう出ます。

  • 設定が実際より大きい → 通れるはずの通路に緑が出ず、 AIが入ってこない
  • 設定が実際より小さい → 緑は出るが、実際には通れず 壁に引っかかって止まる

数値を変えると緑の形が変わるので、P を押したまま調整すると分かりやすいです(自動更新をオフにしている場合は Build → Build Paths が必要です)。

なお、削られる幅は おおむねAgent Radius相当 ですが、内部的にボクセル化して計算しているため、数値と見た目が厳密に一致するわけではありません。

段差や坂は、NavMesh側とキャラクター側の両方を見ます。 段差なら Agent Max Step Height と Character Movementの Max Step Height 、坂なら Agent Max Slope と Character Movementの Walkable Floor Angle を確認します。 片方だけ上げても登りません 。「緑は出ているのに登らない」ときは、たいていこれが原因です。

Sponsored

地形が変わるゲームでの設定

「ドアが開いたら通れるようになる」「壁を壊したら道ができる」——こうしたゲームでは、 実行中にNavMeshを更新する 必要があります。

Project Settings → Navigation Mesh → RuntimeRuntime Generation で、3択から選びます。

Static・Dynamic Modifiers Only・Dynamicの3つで、実行中の更新範囲が変わることを示す図
設定実行中の更新向いているゲーム
Staticしない (エディタで焼いたものを使う)地形が変わらないゲーム。 最も軽い
Dynamic Modifiers OnlyNav Modifierによる Area Class・コスト・ブロックの変更ドアの開閉など、既存の床の扱いだけが変わる場合
Dynamic変更があった タイルだけ再生成する破壊で地形そのものが変わる、動的に床を生成する

基本は Static です。 地形が変わらないゲームで Dynamic にしておく理由はありません。

そして知っておきたい区別が1つあります。

Nav Modifierは既存の床の「扱い」を変えるもので、新しい床は作りません。 壁が壊れてできた穴をAIに通らせたいなら、 そこにNavMeshを生成し直す必要がある ので Dynamic が要ります。

ドアの場合も注意が必要です。 Dynamic Modifiers Only で対応できるのは、ドアに Nav Modifier を持たせて「開いたら通行可、閉じたら通行不可」と切り替える作りにしたとき 。単にドアのメッシュを動かすだけでは反映されず、Dynamic が必要になります。

「溶岩の上は通ってほしくない」「この橋はできれば避けてほしい」——こうした調整は Nav Modifier Volume で行います。

通行不可のエリアと、コストが高く設定されて避けられるエリアを示す図

Place Actors から Nav Modifier Volume を置き、Area Class を設定します。

Area Class効果
NavArea_Null通行不可 。そこの緑が消えます
NavArea_Obstacle通れるが コストが高い 。他に道があれば避けます
NavArea_Default普通の通行可能エリア

使いどころが広いのは NavArea_Obstacle です。 禁止ではなく「避けたい」 を表現できるので、「普段は迂回するが、他に道がなければ通る」という自然な挙動になります。溶岩や毒沼、敵の視線が通る open な場所など、 リスクのある地形 の表現に向いています。

Sponsored

実践:動かないAIを切り分けて直す

ステルスゲームの巡回兵、ホラーゲームの追跡者、タワーディフェンスの侵攻ユニット——「AIが動かない」はどのジャンルでも最初に踏むトラブルです。ここでは 上から順に切り分ける手順 を、実際に動かしながら確認します。

再現用の準備: 最小構成で試します。

種類名前設定
CharacterBP_EnemyAI Controller ClassBP_EnemyAIControllerAuto Possess AIPlaced in World or Spawned
AIControllerBP_EnemyAIController下のグラフを書く
レベルコリジョンのある床NavMeshは コリジョンから生成されますCan Ever Affect Navigation も有効に
レベルNav Mesh Bounds Volumeまだ置かない (わざと症状を出します)

まずAI Controllerに、プレイヤーへ向かうだけの最小の処理を書きます。

On PossessからGet Player Pawn、AI Move Toへつなぐノードグラフ
Event On Possess(BP_EnemyAIController)
  → Delay(Duration: 0.5)
  → Get Player Pawn(Player Index: 0)
  → Is Valid ?
      Valid → AI Move To(Pawn: Get Controlled Pawn,
                          Target Actor: 取得したPawn,
                          Acceptable Radius: 100.0)
          On Success → Print String("到着")
          On Fail    → Print String("失敗")

ピン名に注意してください。行き先を指定するのは Target Actor です(Goal Actor は別ノードの名前なので、探しても見つかりません)。Pawn ピンには Get Controlled Pawn をつなぎます。

Delay はプレイヤー生成を待つための簡易な手段です。 確実ではない ので、Is Valid で受けて失敗に気づけるようにしておきます。

症状の確認: Playすると、敵は動かず、失敗 が出ます。 On Fail が出ること自体が手がかり になります。ここから順に潰していきましょう。

ステップ1:NavMeshがあるか。 P キーを押します。 緑の床が出ていない はずです。Place Actors から NavMesh Bounds Volume を置き、レベル全体を覆うようにスケールします。

再度 P を押して緑が出たら、もう一度Playしてください。 今度は敵が近づいてきます 。ここまでで大半のケースは解決します。

ステップ2:それでも動かないなら、周辺を確認する。 順に見ていきます。

  • BP_EnemyAI Controller ClassAuto Possess AI
  • 敵の足元にも緑があるか (目的地だけでなく、出発点もNavMesh上に必要です)
  • AI Move ToPawnTarget Actor が両方繋がっているか
  • Get Player PawnNone を返していないか(GameModeのDefault Pawn設定)

ステップ3:緑はあるが、途中で止まる。 通路の途中で引っかかるなら、Agent設定とキャラクターのサイズがずれています。

症状見るところ
狭い通路に入ってこないAgent Radius が実際のCapsule Radiusより大きい
壁に擦れて止まるAgent Radius が小さすぎる
段差で止まるAgent Max Step Height とCharacter Movementの Max Step Height
坂を登らないAgent Max Slope

ステップ4:出発点と目的地が、ひと続きの緑でつながっているか。 見落としがちですが、 両端が同じ緑の領域に乗っている 必要があります。プレイヤーがボリュームの外に立っていないか、P を押した状態で確認してください。

(設定によっては、途中まで進む経路(Partial Path)が許可されることもあります。「まったく動かない」のか「途中で止まる」のかは、切り分けの手がかりになります)

Playして確認してください。 敵がまっすぐではなく、壁を回り込んで近づいてくる はずです。これが見えれば、経路探索がきちんと働いています。到着すると 到着 のログが出ます。

ポイントは2つです。

  • 推測する前に P を押す: NavMeshは目で見られます。「たぶん設定が…」と悩む前に、緑が出ているか・どこまで出ているかを確認するのが最短です
  • NavMeshとキャラクターは別々に設定されている: Agent設定を変えてもキャラクターは変わりませんし、その逆も同じ。 段差や坂は両方の値をそろえる 必要があります

AIの行動そのものを組み立てる段階に進むなら Behavior Treeで敵AIを作る へ。移動がひととおり動いたら、次は「プレイヤーを見つけて追う」——索敵は AI Perceptionで敵に見つけさせる で扱います。移動はするが挙動が不自然、という場合は Animation Blueprint 側の問題かもしれません。


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

動く床の上をAIに歩かせるのは、素直にはいきません。 NavMeshが床にくっついて一緒に動くわけではないためです(Dynamic なら現在位置のコリジョンから再生成されることはありますが、コストは高くつきます)。エレベーターや動く足場では、「乗っている間はAIの移動を止めて、足場に固定する」といった別の作りにするほうが現実的です。

Get Random Reachable Point in Radius は、巡回AIの定番です。 NavMesh上のランダムな地点を返してくれるので、「その辺をうろうろする」動きが数ノードで作れます。似た名前に Get Random Location in Navigable Radius もあり、こちらは到達可能かどうかまでは保証しません。 巡回に使うなら Reachable のほうです。

大きなレベルではNavMeshの生成に時間がかかります。 編集が重く感じたら、Edit → Editor Preferences → Level Editor → MiscellaneousUpdate Navigation Automatically をオフにし、必要なときに Build → Build Paths で生成する運用に切り替えられます。

レベルを分割している場合、生成対象になるのは ロードされている範囲 です。World Partitionを使っていると、未ロードの領域が意図どおりビルドされないことがあるので、実機で確認してください(→ レベルストリーミング)。

C++で移動させるときも、考え方は同じです。

// AI Controller の中で
void AMyAIController::ChaseTarget(AActor* Target)
{
    if (Target)
    {
        // 内部でNavMeshを使って経路を計算する
        MoveToActor(Target, /*AcceptanceRadius=*/100.0f);
    }
}

MoveToActor / MoveToLocation が近い役割です(Blueprintの AI Move ToOn Success / On Fail を持つ非同期ノードなので、完全に同じではありません)。 NavMeshがなければC++でも動かない のは同じなので、まず P キーです。


まとめ

「AIが動かない」は、この順番で潰すと最短で解決します。

順番確認することよくある原因
P で緑の床が出るかNavMesh Bounds Volumeが無い・小さい・浮いている
AI Controllerが割り当たっているかAI Controller Class 未設定、Auto Possess AI
AI Move ToPawnTarget Actor が繋がっているかピンが空
Agent設定がキャラと合っているかRadius / Step Height / Slope
ゴール側に緑があるか目的地がボリュームの外

そして運用の指針が1つ。 地形が変わらないなら Static のまま にしておきます。Dynamic は必要になってから選ぶもので、最初から選ぶものではありません。

あなたのレベル、P キーを押したら端まで緑になっていますか?