以下のアイデアがうまくいかない場合は、毎回トップに戻るのが最後の手段になると思います。
Alex Champandard が彼の Web サイト aigamedev.com で提案しているように、代わりに基本的な考え方は、「Drive To Enemy」の動作をしている間、動作を継続する必要があることを確認するために追加のチェックを実行する何らかの方法を含めることです。 .
アレックスの方法は、並列コンポジットを使用することです。これは、すべての子を同時に実行するビヘイビア ツリー ノードの一種です。
次のようになります。
- メインセレクター:
- 敵を回避
- 平行
- 敵は近くにいますか?
- 敵を追う
- 敵への道を見つける
- 敵に向かってドライブ
- 火の武器
- 追跡フラグ
Parallel ノードは、"Is Enemy Nearby?" を繰り返し評価し続けます。実行が「Chase Enemy」サブツリーの奥深くにある場合でも、ノードを (適度なペースで) 実行します。「敵が近くにいる?」という瞬間 失敗を返すと、パラレルはすぐに失敗を返し、「敵を追いかける」動作の完了をスキップします。したがって、ツリーの次の評価は「敵を回避する」動作に到達します。
「敵は近くにいる?」状態は、一種のアサーション チェックまたはアーリーアウト チェックとして機能します。基本的には、イテレーションがまだ完了していなくても、ツリーがイベントに応答できるイベント駆動型の機能のようなものです。
ただし、システムを設計した方法では、並列動作を使用しません (使用するサードパーティのゲーム エンジンでは適切にマルチスレッド化できません)。代わりに、ほぼ同じことを行うコンポジットがありますが、その子のトラバーサルのそれぞれの間でチェックを評価するだけです。一種のインターリーブのように、通常の実行からチェックの評価まで行ったり来たりします。チェックが失敗した場合にのみ、トップに戻ります。