敵やNPCが、壁や柱を避けながら目的地までスッと歩いていく——この「賢い移動」は、ゲームの説得力を大きく左右します。逆に、壁にぶつかって右往左往するAIは、それだけで安っぽく見えてしまいます。
Godotでこの賢い移動を支えるのが、 NavigationRegion2D と ナビゲーションメッシュ(AI 用の地図) です。この記事では、その 地図をどう作るか に焦点を当てます。地図の上を実際に歩くエージェント(追跡や巡回のコード)は、姉妹記事 NavigationAgent2Dによるパスファインディング に譲り、ここでは 「歩ける範囲」をベイクで用意する ところまでをしっかり押さえます。
この記事でわかること
- なぜナビゲーションメッシュが要るのか(物理ベース移動との違い)
NavigationRegion2Dで 移動可能領域をベイク する流れagent_radiusで 壁との距離を保つ 仕組みNavigationObstacle2Dで 動く障害物を避けさせる- この地図の上を歩くエージェントは 次の記事 へ
なぜナビゲーションメッシュが必要か
「障害物を避ける」だけなら物理でもできそうですが、それだと ぶつかってから初めて壁の存在に気づく ことになります。行き止まりに突っ込んでから引き返す——不自然で、遠回りな動きです。

- 物理ベース :
StaticBody2Dなどに 衝突して初めて 障害物を認識する。ぶつかって気づくので不自然になりがち - ナビゲーションメッシュ :あらかじめ 「移動可能な領域」をポリゴンの地図 として持っておき、AIは ぶつかる前に 障害物を避けた経路を計算できる
NavigationRegion2D は、この「AI用の地図」を保持し、シーンに配置する役割のノードです。
NavigationRegion2Dでメッシュをベイクする
移動可能な領域 を計算して地図を作ることを ベイク(Bake) と呼びます。シーンに置いたコリジョン形状を「障害物」として、その隙間を「歩ける範囲」として自動計算してくれます。

手順はシンプルです。
- ステージを組む :
TileMapやStaticBody2Dなど、CollisionShape2D/CollisionPolygon2Dを持つノードで壁や地形を配置します。これらが「障害物」になります。 - NavigationRegion2Dを追加 :ノードを追加し、
navigation_polygonに「New NavigationPolygon」で新規リソースを作ります。 - ベイクする :
NavigationRegion2Dを選択した状態で、ツールバーの 「Bake NavigationPolygon」 をクリック。成功すると、歩ける範囲が 青い半透明のポリゴン で表示されます。
NavigationPolygon リソース側には、ベイクの挙動を決めるプロパティがあります。とくに重要なのが次の2つです。
| プロパティ(NavigationPolygon) | 役割 |
|---|---|
agent_radius | エージェントの半径。壁から安全な距離を取ったメッシュを生成(後述) |
source_geometry_mode | ベイクの元にする形状の取得方法。TileMapから作るときはグループ方式にし、TileMapを対象グループに入れる |
agent_radiusで壁との距離を保つ
ベイクしたメッシュを壁ギリギリまで作ると、キャラの中心がメッシュの端=壁のキワまで行けてしまい、見た目上 壁にめり込みます 。これを防ぐのが agent_radius です。

agent_radius を設定すると、メッシュが 壁からその半径分だけ内側に縮んで 生成されます。キャラの中心はメッシュ内しか通れないので、体が壁に食い込まなくなります。目安は キャラのコリジョン半径より少し大きめ 。狭い通路を通り抜けられないときは、この値が大きすぎないかを疑います。
ヒント:キャラのサイズが大小混在するなら、
NavigationPolygonを サイズ別に用意 して、それぞれagent_radiusを変えてベイクすると自然です。
NavigationObstacle2Dで動く障害物に対応
ベイクしたメッシュは 静的 です。プレイヤーが設置した箱や、動くドアのように 後から動く障害物 は、メッシュには焼き込まれていません。これを避けさせたいときは、その障害物に NavigationObstacle2D を追加します。

NavigationObstacle2D は、 メッシュを再ベイクせずに その周囲へ一時的な「回避領域」を作ります。近くを通るエージェントは、この領域を避けるよう経路を調整します。再ベイクは重い処理なので、動くものはこちらで避けさせるのが基本です(ただし多用は負荷になるので必要な数に絞ります)。
なお「どのオブジェクトを障害物とみなすか」は、コリジョンレイヤーとマスク の設定とも関わります。避けてほしいのに避けない、というときはレイヤー設定も確認します。
よくある 間違いとベストプラクティス
| よくある間違い | ベストプラクティス |
|---|---|
| 障害物のコリジョンが開いている/複雑すぎてベイクに失敗 | 形状を閉じた単純なものにする。TileMapは source_geometry_mode をグループ方式にし対象グループへ |
agent_radius が0のままで壁にめり込む | キャラ半径より少し大きめに設定してメッシュを内側へ縮める |
| 動く障害物を避けない | NavigationObstacle2D を付け、コリジョンレイヤー/マスクを確認する |
| 障害物が変わるたびに毎回再ベイク | 静的な地形だけベイクし、動くものは NavigationObstacle2D に任せる |
おまけ:先に知っておくと良いこと
- この地図の上を歩かせる :メッシュができたら、NavigationAgent2D を使って「目的地を指定 → 次の中継点へ移動」でキャラを動かします。追跡・巡回のコードは全部そちらです。
- 3Dも同じ考え方 :
NavigationRegion3D+NavigationMeshで、3Dでもまったく同じ「ベイクして地図を作る」流れになります。 - AIの判断は別レイヤー :ナビメッシュは「どう歩くか(経路)」の担当です。「いつ追う・いつ巡回するか(判断)」は ステートマシン やビヘイビアツリーの領域で、経路探索と組み合わせて使います。
まとめ
- ナビゲーションメッシュ は「AI用の地図」。物理と違い、ぶつかる前に障害物を避けられる
NavigationRegion2DにNavigationPolygonを持たせ、Bake で歩ける範囲を生成するagent_radiusで壁から内側にメッシュを縮め、キャラのめり込みを防ぐ- 動く障害物 は再ベイクせず
NavigationObstacle2Dで避けさせる
まずは壁を数個置いたステージで NavigationRegion2D をベイクし、青いポリゴンが正しく「歩ける範囲」を覆うか確かめてみてください。地図が用意できたら、次は NavigationAgent2D でその上を実際に歩かせてみましょう。
さらに学ぶために
- NavigationAgent2Dによるパスファインディング ——この地図の上で追跡・巡回を実装する(続きの記事)
- Collision LayersとMasksでオブジェクトを整理する ——障害物やエージェントのレイヤー設定
- ステートマシンで管理するAIとプレイヤーの状態 ——「いつ追う・巡回するか」の判断と組み合わせる
- Godot公式ドキュメント:2D Navigation ——ナビゲーションの一次情報