BazNavAgentMovement
ゲームオブジェクト向けの経路探索AI移動。Godotの組み込みNavigationAgent2Dを搭載しており、敵が壁にぶつかるのではなく、壁を回避して経路を計算します。6つの挙動、1つのノード、手動のステートコード不要。
ダウンロード:
baz_nav_agent_movement.gd (68.4 KB)
機能概要
NavigationAgent2Dを使用して、敵をターゲットへ向けて経路探索します。
- パトロール — ウェイポイント間を、ループまたはピンポン順に移動
- 追跡 — オブジェクト、グループ、または名前付きノードへ向けて経路探索
- 逃避 — 脅威から離れるよう、プローブ方向を使用して経路探索
- ランダムウォーク — 開始位置を中心とした半径内をさまよう
- 方向設定 — 一定の角度で移動し、障害物を回避
- ポイントへ移動 — 座標、オブジェクト、グループ、または名前付きノードへの単発移動
ビジュアルスクリプトのステートから1つの呼び出しで、ゲーム中に挙動を切り替えることができます。速度、加速度、減速度は、エンティティが既存で持つMoveAndJumpSettingsから読み取られます。
ゲームオブジェクトのナビゲーションノード設定
-
敵のゲームオブジェクト(またはArea2DGameObject)シーンを開きます。子ノードとしてNode2Dを追加し、
baz_nav_agent_movement.gdをアタッチします。 -
敵のルートノードの下で、BazNavAgentMovementの兄弟ノードとしてNavigationAgent2Dを追加します。デフォルト設定で問題ありません。
-
BazNavAgentMovementノードを選択し、インスペクタのドロップダウンからBehavior Modeを選択します。インスペクタには選択されたモードに関連するフィールドのみが表示されます。フィールド上にカーソルを合わせるとツールチップが表示されます。
| Behavior Mode | 機能 |
|---|---|
| Patrol | ウェイポイントリストをループまたはピンポン順で巡回 |
| Chase | 最も近い有効なターゲットへ向けて経路探索 |
| Flee | 最も近い脅威から離れるように経路探索 |
| Random Walk | 開始位置の半径内からランダムな目的地を選択 |
| Set Direction | 一定の角度で移動し、障害物を回避 |
| Move To Point | 座標、ノード、またはグループメンバーへの単発移動 |
ビジュアルスクリプトでのBazNavAgentMovementの使用
敵のビジュアルスクリプトで、AIステートを選択し、InvokeScriptアクションを追加します:
- 対象ノード: BazNavAgentMovement
- 対象メソッド:
apply_movement - 呼び出しタイミング: 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)で使用:
| メソッド | 真となる条件 |
|---|---|
is_at_destination() |
エンティティが現在のターゲットに到達した |
is_moving() |
エンティティの速度が0でない |
has_completed_patrol() |
ループまたはピンポンの全サイクルが完了した |
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が、何も動かない最も一般的な原因です。エディタで [デバッグ] > [ナビゲーションの可視化] を使用し、メッシュが想定した場所にあるか確認してください。
- 速度はMoveAndJumpSettingsから取得します。 加速度が選択されている場合でも追従します。
- Debug Enabled をオンにすると、初期化、ターゲット更新、モード切替、到着イベントが出力ウィンドウに表示されます。リリース時にはオフにしてください。
- ゲーム中のモード切替で速度はリセットされません。 加速度/減速度のランプは切替間で維持されます。ハードストップさせたい場合は、最初に
reset_movement()を呼び出してください。 - 方向設定は「にんじんを使った経路探索」を使用します。 前方128px先にターゲットを投影して経路探索を行うため、右へ移動する敵でも壁を回避しながら、永久に進行方向から逸脱することはありません。
- エンティティごとに1ノード。 同じエンティティに2つのBazNavAgentMovementノードを配置すると、フレームごとに速度の競合が発生します。




