【Godot】NavigationRegion2Dとナビゲーションメッシュ - AIが歩ける地図を作る

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

GodotのNavigationRegion2Dとナビゲーションメッシュの仕組みを解説。物理ベース移動との違い、ベイクによる移動可能領域の生成、agent_radiusで壁との距離を保つ設定、NavigationObstacle2Dによる動的障害物への対応まで、図とともに学びます。

敵やNPCが、壁や柱を避けながら目的地までスッと歩いていく——この「賢い移動」は、ゲームの説得力を大きく左右します。逆に、壁にぶつかって右往左往するAIは、それだけで安っぽく見えてしまいます。

Godotでこの賢い移動を支えるのが、 NavigationRegion2Dナビゲーションメッシュ(AI用の地図) です。この記事では、その 地図をどう作るか に焦点を当てます。地図の上を実際に歩くエージェント(追跡や巡回のコード)は、姉妹記事 NavigationAgent2Dによるパスファインディング に譲り、ここでは 「歩ける範囲」をベイクで用意する ところまでをしっかり押さえます。

真上から見た2Dマップ。壁を避けて移動可能領域(青いポリゴン)が敷かれ、障害物を回り込む経路の点線が引かれている

この記事でわかること

  • なぜナビゲーションメッシュが要るのか(物理ベース移動との違い)
  • NavigationRegion2D移動可能領域をベイク する流れ
  • agent_radius壁との距離を保つ 仕組み
  • NavigationObstacle2D動く障害物を避けさせる
  • この地図の上を歩くエージェントは 次の記事

Sponsored

なぜナビゲーションメッシュが必要か

「障害物を避ける」だけなら物理でもできそうですが、それだと ぶつかってから初めて壁の存在に気づく ことになります。行き止まりに突っ込んでから引き返す——不自然で、遠回りな動きです。

物理ベースは壁にぶつかってから引き返す、ナビメッシュは事前に地図で障害物を避けて進む、2方式の対比図
  • 物理ベースStaticBody2D などに 衝突して初めて 障害物を認識する。ぶつかって気づくので不自然になりがち
  • ナビゲーションメッシュ :あらかじめ 「移動可能な領域」をポリゴンの地図 として持っておき、AIは ぶつかる前に 障害物を避けた経路を計算できる

NavigationRegion2D は、この「AI用の地図」を保持し、シーンに配置する役割のノードです。

NavigationRegion2Dでメッシュをベイクする

移動可能な領域を計算して地図を作ることを ベイク(Bake) と呼びます。シーンに置いたコリジョン形状を「障害物」として、その隙間を「歩ける範囲」として自動計算してくれます。

ステージの壁や障害物からBakeを行うと、壁を除いた床部分だけが三角形分割された青いナビゲーションメッシュになる図

手順はシンプルです。

  1. ステージを組むTileMapStaticBody2D など、CollisionShape2D / CollisionPolygon2D を持つノードで壁や地形を配置します。これらが「障害物」になります。
  2. NavigationRegion2Dを追加 :ノードを追加し、navigation_polygon に「New NavigationPolygon」で新規リソースを作ります。
  3. ベイクするNavigationRegion2D を選択した状態で、ツールバーの 「Bake NavigationPolygon」 をクリック。成功すると、歩ける範囲が 青い半透明のポリゴン で表示されます。

NavigationPolygon リソース側には、ベイクの挙動を決めるプロパティがあります。とくに重要なのが次の2つです。

プロパティ(NavigationPolygon)役割
agent_radiusエージェントの半径。壁から安全な距離を取ったメッシュを生成(後述)
source_geometry_modeベイクの元にする形状の取得方法。TileMapから作るときはグループ方式にし、TileMapを対象グループに入れる
Sponsored

agent_radiusで壁との距離を保つ

ベイクしたメッシュを壁ギリギリまで作ると、キャラの中心がメッシュの端=壁のキワまで行けてしまい、見た目上 壁にめり込みます 。これを防ぐのが agent_radius です。

壁のふちからagent_radius分だけ内側にナビメッシュが縮んで生成され、キャラが壁にめり込まない様子を両矢印で示した俯瞰図

agent_radius を設定すると、メッシュが 壁からその半径分だけ内側に縮んで 生成されます。キャラの中心はメッシュ内しか通れないので、体が壁に食い込まなくなります。目安は キャラのコリジョン半径より少し大きめ 。狭い通路を通り抜けられないときは、この値が大きすぎないかを疑います。

ヒント:キャラのサイズが大小混在するなら、NavigationPolygonサイズ別に用意 して、それぞれ agent_radius を変えてベイクすると自然です。

NavigationObstacle2Dで動く障害物に対応

ベイクしたメッシュは 静的 です。プレイヤーが設置した箱や、動くドアのように 後から動く障害物 は、メッシュには焼き込まれていません。これを避けさせたいときは、その障害物に NavigationObstacle2D を追加します。

動く障害物に付けたNavigationObstacle2Dが周囲に回避領域(点線の円)を作り、エージェントが直線経路から回り込む経路に変える俯瞰図

NavigationObstacle2D は、 メッシュを再ベイクせずに その周囲へ一時的な「回避領域」を作ります。近くを通るエージェントは、この領域を避けるよう経路を調整します。再ベイクは重い処理なので、動くものはこちらで避けさせるのが基本です(ただし多用は負荷になるので必要な数に絞ります)。

なお「どのオブジェクトを障害物とみなすか」は、コリジョンレイヤーとマスク の設定とも関わります。避けてほしいのに避けない、というときはレイヤー設定も確認します。

Sponsored

よくある間違いとベストプラクティス

よくある間違いベストプラクティス
障害物のコリジョンが開いている/複雑すぎてベイクに失敗形状を閉じた単純なものにする。TileMapは source_geometry_mode をグループ方式にし対象グループへ
agent_radius が0のままで壁にめり込むキャラ半径より少し大きめに設定してメッシュを内側へ縮める
動く障害物を避けないNavigationObstacle2D を付け、コリジョンレイヤー/マスクを確認する
障害物が変わるたびに毎回再ベイク静的な地形だけベイクし、動くものは NavigationObstacle2D に任せる

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

  • この地図の上を歩かせる :メッシュができたら、NavigationAgent2D を使って「目的地を指定 → 次の中継点へ移動」でキャラを動かします。追跡・巡回のコードは全部そちらです。
  • 3Dも同じ考え方NavigationRegion3DNavigationMesh で、3Dでもまったく同じ「ベイクして地図を作る」流れになります。
  • AIの判断は別レイヤー :ナビメッシュは「どう歩くか(経路)」の担当です。「いつ追う・いつ巡回するか(判断)」は ステートマシン やビヘイビアツリーの領域で、経路探索と組み合わせて使います。

まとめ

  • ナビゲーションメッシュ は「AI用の地図」。物理と違い、ぶつかる前に障害物を避けられる
  • NavigationRegion2DNavigationPolygon を持たせ、Bake で歩ける範囲を生成する
  • agent_radius で壁から内側にメッシュを縮め、キャラのめり込みを防ぐ
  • 動く障害物 は再ベイクせず NavigationObstacle2D で避けさせる

まずは壁を数個置いたステージで NavigationRegion2D をベイクし、青いポリゴンが正しく「歩ける範囲」を覆うか確かめてみてください。地図が用意できたら、次は NavigationAgent2D でその上を実際に歩かせてみましょう。

さらに学ぶために