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

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

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

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

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

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

この記事でわかること

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

動作確認環境: Godot 4.7

Sponsored

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

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

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

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

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

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

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

手順はシンプルです。

  1. ステージを組む :TileMap や StaticBody2D など、CollisionShape2D / CollisionPolygon2D を持つノードで壁や地形を配置します。これらが「障害物」になります。
  2. NavigationRegion2Dを追加 :ノードを追加し、navigation_polygon に「New NavigationPolygon」で新規リソースを作ります。壁や地形のノードは、この NavigationRegion2D の子へ移します(既定では、ベイクは領域ノードの子孫だけを障害物として集めます)。
  3. 歩ける範囲の外周を描く :NavigationRegion2D を選ぶと、2Dビューの上部に、点を打って多角形を描くツールが出ます。歩かせたい範囲をぐるりと囲みます。ベイクは壁の隙間を探す処理ではなく、この外周の中から壁のぶんを削る処理なので、外周が無いと何も作られません。
  4. ベイクする :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 は、 メッシュを再ベイクせずに 近くのエージェントへ「ここを避けて」と伝えます。変わるのは経路ではなく、エージェントが進む速度です。エージェント側で回避(avoidance_enabled)をオンにし、計算し直された速度(velocity_computed シグナル)で動かしたときだけ効きます(配線は NavigationAgent2Dの記事 で扱います)。障害物の大きさは radius で与えます(既定は0で、そのままでは効きません)。再ベイクは重い処理なので、動くものはこちらで避けさせるのが基本です(ただし多用は負荷になるので必要な数に絞ります)。

なお、回避で「どの障害物を避けるか」は、コリジョンレイヤーではなく、NavigationObstacle2D の avoidance_layers とエージェントの avoidance_mask の組み合わせで決まります。ベイクで集める壁を絞りたいときは、NavigationPolygon の parsed_collision_mask で コリジョンレイヤー を選びます。

Sponsored

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

よくある間違いベストプラクティス
ベイクしても青いポリゴンが出ない歩ける範囲の外周を描き、壁を NavigationRegion2D の子に置く
障害物のコリジョンが開いている/複雑すぎてベイクに失敗形状を閉じた単純なものにする。TileMapは source_geometry_mode をグループ方式にし対象グループへ
agent_radius がキャラより小さく、壁にめり込むキャラ半径より少し大きめに設定してメッシュを内側へ縮める
動く障害物を避けないNavigationObstacle2D に radius を与え、エージェント側の回避(avoidance_enabled)をオンにする
障害物が変わるたびに毎回再ベイク静的な地形だけベイクし、動くものは NavigationObstacle2D に任せる

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

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

まとめ

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

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

さらに学ぶために

次に読む学習パスの次の記事
AI・経路探索

NavigationAgent2Dによるパスファインディング - 敵AIの追跡と巡回

この記事を読む
Godot このセクションのノート104