[Script Library] Bazナビゲーションエージェントの移動

BazNavAgentMovement

ゲームオブジェクト向けの経路探索AI移動。Godotの組み込みNavigationAgent2Dを搭載しており、敵が壁にぶつかるのではなく、壁を回避して経路を計算します。6つの挙動、1つのノード、手動のステートコード不要。

ダウンロード:
baz_nav_agent_movement.gd (68.4 KB)

機能概要

NavigationAgent2Dを使用して、敵をターゲットへ向けて経路探索します。

  • パトロール — ウェイポイント間を、ループまたはピンポン順に移動
  • 追跡 — オブジェクト、グループ、または名前付きノードへ向けて経路探索
  • 逃避 — 脅威から離れるよう、プローブ方向を使用して経路探索
  • ランダムウォーク — 開始位置を中心とした半径内をさまよう
  • 方向設定 — 一定の角度で移動し、障害物を回避
  • ポイントへ移動 — 座標、オブジェクト、グループ、または名前付きノードへの単発移動

ビジュアルスクリプトのステートから1つの呼び出しで、ゲーム中に挙動を切り替えることができます。速度、加速度、減速度は、エンティティが既存で持つMoveAndJumpSettingsから読み取られます。

ゲームオブジェクトのナビゲーションノード設定

  1. 敵のゲームオブジェクト(またはArea2DGameObject)シーンを開きます。子ノードとしてNode2Dを追加し、baz_nav_agent_movement.gdをアタッチします。

  2. 敵のルートノードの下で、BazNavAgentMovementの兄弟ノードとしてNavigationAgent2Dを追加します。デフォルト設定で問題ありません。

  3. 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の設定

  1. 敵が存在するゲームシーンを開きます。NavigationRegion2Dを追加し、NavigationPolygonリソースを割り当てて、歩行可能な領域を描画します。

  2. 衝突としてカウントしたいTileMapLayerやStaticBody2DをNavigationRegion2Dの子ノードとして配置し、エディタのツールバーでBake NavigationPolygonを押します。ベイクされたナビメッシュがないと、敵は移動しません。

  1. 角の周りでより広い半径の経路を作成する必要がある場合は、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ノードを配置すると、フレームごとに速度の競合が発生します。
「いいね!」 6

まさに必要なものですが、うまくいかずにいます。完全なデモ例を示していただけますか?大変ありがとうございます!

フォーラムへようこそ、@xinyn さん!

順調に進めば、今週中にその使い方の動画チュートリアルを作成する予定です。それまでにおかしいところや、うまく動かない部分を共有していただければ、お手伝いできるかもしれませんよ?

スクリプトの使い方とナビゲーション領域の設定方法(このスレッドの最上部にあります)に関する動画を制作しました。お役に立てれば幸いです!

この動画、すごく役立ちました!今ではゾンビも設定通りに動くようになり、本当に感謝しています!もし今後何か問題があれば、また報告に来ます。重ねてお礼申し上げます!

「いいね!」 1

また別の問題に遭遇しました:ゾンビは設定通りに移動・巡回、あるいは追跡できるようになりましたが、その過程でゾンビは常に同じ方向を向いたままになり、移動方向に合わせて向きが変わらなくなってしまいました :sweat_smile:

多くの試行錯誤をしましたが、この問題は解決できませんでした…

私が思いつく唯一の原因は以下の通りです:

  1. アニメーションが複数の方向に対して設定されていない
  2. 移動先のステートが「Facing Type」として「Movement」を使用していない

これらを試してもまだ動作しない場合、プロジェクトを zip ファイルにまとめて pgmmv-support@gotchagotcha.jp まで送信してください。なぜこのようなことが起こっているのか調査いたします。

返信ありがとうございます。上記で言及された理由1および2については確認しましたが、問題なさそうです。これらの設定が原因ではないと思われます。

デモ動画「Navigation Agent Movement - Action Game Maker Godot」でも同様の問題が発生していることに気づきました。ゾンビは設定通りに移動しますが、移動中は常に下方向を向いており、移動方向を向いていません。

ゾンビのアニメーションは、私の方で適当に設定してしまいました。アイドルのアニメーションは下方向の1方向しかないので、その状態でアイドルアニメーションを使用すると、キャラクターは下を向いたままになります。


Baz さん、ありがとうございます。私の問題は解決しました。根気強くお手伝いいただき、本当に感謝しています~

「いいね!」 1