4

私がビヘイビアツリーで理解していることから、各ビヘイビアは、数回の反復で実行できる短い目標指向のアクションである必要があります。

たとえば、以下はビヘイビア ツリーのイメージです。

ここに画像の説明を入力

ここで、 Drive To Enemyの動作がツリー内で数回以上の反復を行うと仮定しましょう。そのため、各パスでDrive To Enemyが呼び出されます。これは、現在実行中の状態であるためです。

問題は、敵が近くにいる場合にEvade Enemyを呼び出したいことです。そして、Drive To Enemyが常に呼び出されることを考えると、 Evade Enemyを呼び出す機会はありません(おそらく、Avoid Enemy と呼ばれるべきです)。

  • 現在実行中のアクションに関係なく、ツリーの各パストラバースする必要がありますか?
  • 私はこれを正しい方法で行っていますか?
  • そのような行動を処理する適切な方法は何ですか?
4

1 に答える 1

4

以下のアイデアがうまくいかない場合は、毎回トップに戻るのが最後の手段になると思います。

Alex Champandard が彼の Web サイト aigamedev.com で提案しているように、代わりに基本的な考え方は、「Drive To Enemy」の動作をしている間、動作を継続する必要があることを確認するために追加のチェックを実行する何らかの方法を含めることです。 .

アレックスの方法は、並列コンポジットを使用することです。これは、すべての子を同時に実行するビヘイビア ツリー ノードの一種です。

次のようになります。

  1. メインセレクター:
    • 敵を回避
      • 敵の位置を特定
      • 反対方向にドライブ
    • 平行
      • 敵は近くにいますか?
      • 敵を追う
        • 敵への道を見つける
        • 敵に向かってドライブ
        • 火の武器
    • 追跡フラグ
      • ロケート フラグ
      • パスを検索
      • フラグにドライブ

Parallel ノードは、"Is Enemy Nearby?" を繰り返し評価し続けます。実行が「Chase Enemy」サブツリーの奥深くにある場合でも、ノードを (適度なペースで) 実行します。「敵が近くにいる?」という瞬間 失敗を返すと、パラレルはすぐに失敗を返し、「敵を追いかける」動作の完了をスキップします。したがって、ツリーの次の評価は「敵を回避する」動作に到達します。

「敵は近くにいる?」状態は、一種のアサーション チェックまたはアーリーアウト チェックとして機能します。基本的には、イテレーションがまだ完了していなくても、ツリーがイベントに応答できるイベント駆動型の機能のようなものです。

ただし、システムを設計した方法では、並列動作を使用しません (使用するサードパーティのゲーム エンジンでは適切にマルチスレッド化できません)。代わりに、ほぼ同じことを行うコンポジットがありますが、その子のトラバーサルのそれぞれの間でチェックを評価するだけです。一種のインターリーブのように、通常の実行からチェックの評価まで行ったり来たりします。チェックが失敗した場合にのみ、トップに戻ります。

于 2013-03-31T00:40:34.237 に答える