BazNavAgentMovement
GameObject向けのパスファインディングAI移動。Godotの組み込みNavigationAgent2Dを使用しており、敵が壁にぶつかるのではなく、壁を迂回して経路を計算します。6つの動作モード、1つのノード、手動の状態管理コード不要。
ダウンロード:
v1.2 (AGM 2.0.0+):
baz_nav_agent_movement.gd (72.3 KB)
- 実行中に速度変化を追従します。 以前のスクリプトは敵が動き始めた際に速度を一度だけ読み取っていましたが、現在は毎フレームオブジェクトの移動速度変数(MoveAndJumpSettingsにフォールバック)から読み取るようになり、アクションやスクリプトで変更した値がすぐに反映されます。
- 加速時のイージングが改善されました。 加速度を有効にすると、急激な切り替えではなく、設定された加速度と減速度に基づいて新しい速度へとスムーズに移行します。
- 状態の「Horizontal Speed Multiplier」は読み取られません。 代わりに移動速度変数を変更してください。
v1.1 (AGM 2.0.0+):
baz_nav_agent_movement.gd (70.5 KB)
- AGMaker 2.0で進行方向に合わせて向きが変わります。 バージョン2.0では、スクリプト由来の移動に対してMovementの向きの追従が停止し、敵はデフォルトの向き(サイドビューの場合は常に右向き)のまま固定されていました。このスクリプトではオブジェクト自体を回転させるようになりました。
- セットアップの変更は不要です。 Movementの設定にあるAnimation Facing Directionを「左」に設定したまま使用でき、パトロール待機中など停止している際も最後の向きを保持します。
- アップグレードはファイルの入れ替えだけです。
baz_nav_agent_movement.gdをこの新しいバージョンに置き換えてください。既存のノードやビジュアルスクリプトはそのまま維持されます。
v1.0 (Pre AGM 2.0.0):
baz_nav_agent_movement.gd (68.4 KB)
機能概要
NavigationAgent2Dを使用して、敵をターゲットまでパスファインディングします。
- Patrol(巡回) — ウェイポイント間をLoopまたはPing-Pong順で移動
- Chase(追跡) — オブジェクト、グループ、または名前付きノードに向かって経路を計算
- Flee(逃走) — プロブ方向を用いて脅威から遠ざかるように経路を計算
- Random Walk(ランダムウォーク) — 開始位置を中心とした半径内で彷徨う
- Set Direction(方向指定) — 一定の角度で移動し、障害物を迂回する
- Move To Point(地点へ移動) — 座標、オブジェクト、グループ、または名前付きノードへの単発移動
ビジュアルスクリプトの状態から1回の呼び出しでゲーム中に動作モードを切り替えることができます。速度、加速度、減速度はエンティティの既存のMoveAndJumpSettingsから読み取られます。
GameObjectのナビゲーションノードのセットアップ
-
敵のGameObject(またはArea2DGameObject)シーンを開きます。Node2D を子として追加し、
baz_nav_agent_movement.gdをアタッチします。 -
敵のルートノードの下にBazNavAgentMovementと兄弟関係となる NavigationAgent2D を追加します。初期設定のままで問題ありません。
-
BazNavAgentMovementノードを選択し、インスペクタドロップダウンから Behavior Mode(動作モード) を選択します。インスペクタには選択したモードに関連するフィールドのみが表示されます。フィールド上にカーソルを合わせるとツールチップが表示されます。
| Behavior Mode | 機能 |
|---|---|
| Patrol | ウェイポイントリストをLoopまたはPing-Pong順で循環 |
| Chase | 最も近い有効なターゲットへ経路を計算 |
| Flee | 最も近い脅威から遠ざかるように経路を計算 |
| Random Walk | 開始位置の半径内からランダムな目的地を選択 |
| Set Direction | 一定の角度で移動し、障害物を迂回 |
| Move To Point | 座標、ノード、またはグループメンバーへの単発移動 |
ビジュアルスクリプトでのBazNavAgentMovementの使用法
敵のビジュアルスクリプトでAI状態を選択し、InvokeScript アクションを追加します:
- Target Node: BazNavAgentMovement
- Target Method:
apply_movement - Invoke Timing: OnStateUpdate
これだけでランタイムの配線は完了です。apply_movement() は初回呼び出し時に自動初期化され、物理ティックごとに選択された動作を実行します。
GameSceneのNavigationRegion2DおよびNavigationPolygonのセットアップ
-
敵が存在するゲームシーンを開きます。NavigationRegion2D を追加し、NavigationPolygonリソースを割り当てて、歩行可能な領域を描画します。
-
衝突としてカウントしたいTileMapLayerやStaticBody2DをNavigationRegion2Dの子として配置し、エディタツールバーで Bake NavigationPolygon を押します。ベイクされたナビメッシュがないと、敵は移動しません。
- コーナー周辺により広い半径で経路を作成する必要がある場合は、NavigationPolygonリソースの Radius プロパティを調整できます。ただし、再ベイクする必要があります!
アクション
| メソッド | 呼び出すタイミング |
|---|---|
apply_movement() |
アクティブなAI状態のすべての物理ティック(OnStateUpdate)。基本使用に必須。 |
reset_movement() |
移動を停止し、次のapply_movement()呼び出し時に再初期化します。明示的なリセットが必要な場合にのみ使用します。apply_movement()が呼び出されなくなれば、移動は自動的に停止するためです。 |
switch_to_patrol() |
パトロール状態のOnStateEnter。ウェイポイント0からサイクルを再開します。 |
switch_to_chase() |
追跡状態のOnStateEnter。最も近い有効なターゲットを取得します。 |
switch_to_flee() |
逃走状態のOnStateEnter。最も近い脅威を取得します。 |
switch_to_random_walk() |
彷徨い状態のOnStateEnter。 |
switch_to_set_direction() |
固定方向状態のOnStateEnter。 |
switch_to_move_to_point() |
単発移動状態のOnStateEnter。構成されたソースから目的地を固定します。 |
return_to_start() |
スポーン位置へ経路を計算して戻ります。 |
return_to_nearest_patrol() |
最も近いウェイポイントへ経路を計算し、そこから巡回を再開します。 |
条件
ビジュアルスクリプトの遷移条件スロット(ScriptConditionEvaluator)で使用します:
| メソッド | Trueになる条件 |
|---|---|
is_at_destination() |
エンティティが現在のターゲットに到達した場合 |
is_moving() |
エンティティの速度が0でない場合 |
has_completed_patrol() |
完全なLoopまたはPing-Pongサイクルが終了した場合 |
is_at_start() |
エンティティがスポーン位置に戻った場合(8px以内) |
is_returning() |
return_to_startまたはreturn_to_nearest_patrolの移動処理中である場合 |
is_patrol_paused() |
巡回がアクティブで、エンティティがウェイポイントで待機している場合 |
is_patrol_at_last_waypoint() |
巡回がアクティブで、エンティティが最終ウェイポイントにいる、またはそこへ向かっている場合 |
is_chase_has_target() |
追跡がアクティブで、有効なターゲットがロックされている場合 |
ヒント
- まずナビメッシュをベイクしてください。 NavigationRegion2Dが見つからないかベイクされていないことが、何も動かない最も一般的な原因です。エディタの [Debug] > [Visible Navigation] を使用して、メッシュが想定通りに表示されていることを確認してください。
- 速度はMoveAndJumpSettingsから取得します。 加速度が選択されている場合でも、それに応じて追随します。
- Debug Enabled をオンにすると、初期化、ターゲット更新、モード切替、到着イベントなどがOutputに出力されます。リリースビルド時はオフにしてください。
- ゲーム中のモード切替で速度はリセットされません。 加速度/減速度のランプ処理は切替間で継続されます。完全に停止させたい場合は、最初に
reset_movement()を呼び出してください。 - Set Directionは「ニンジンを使った道付け」のようなパスファインディングを行います。 ターゲットを前方128px先に投影してそこに経路を計算するため、右方向に進む敵でも壁を迂回し続け、永久に進行方向から逸脱することはありません。
- エンティティあたり1ノードです。 同じエンティティに2つのBazNavAgentMovementノードがあると、毎フレーム速度を奪い合います。




