BLOGブログ

2018.08.30UE4UE/ Blueprint

[UE4] BehaviorTree: Task、Service、Decoratorのイベント

執筆バージョン: Unreal Engine 4.20

BehaviorTreeノードのイベント

UE4のBehaviorTreeでは、各種ノードを組み合わせてAIのふるまいを作っていきます。
このうち、Task、Service、Decoratorの各ノードは、Blueprintでオリジナルのものを作ることができます。

今回は、Task、Service、DecoratorをBlueprintで作る場合に、利用可能なイベントについて調べてみました。

※以下で記述する全てのイベントには、”AI” のつかないイベントも存在します。
機能はほぼ同等ですが、イベント引数が異なります。また、両方を実装した場合は、”AI” のついたイベントのみが呼ばれます。
本記事では、これらの詳細な比較は省略し、”AI” のついたイベントについてのみ、記述します。

Tickイベント

Receive Tick AI イベント (Task)

  • Task実行中に呼ばれます。
  • Tick間隔を指定することはできません。

Receive Tick AI イベント (Service)

  • アタッチされたノードの実行中に呼ばれます。
  • Interval プロパティで、Tick間隔を指定することができます。

Receive Tick AI イベント (Decorator)

  • Observer Aborts のための監視中に呼ばれます。すなわち、Decoratorが、中止すべきか判断する対象となるノードの、監視中に呼ばれます。
  • Observer Aborts の値が None の場合は、一切呼ばれません。
  • Tick間隔を指定することはできません。

Taskの実行、中止時に呼ばれるイベント

Receive Execute AI イベント (Task)

  • Taskが開始されるときに呼ばれます。
  • Receive Execute AI イベントを記述した場合、Finish Execute 関数を呼ぶか、DecoratorによってAbortされるまで、ノードの実行状態が続きます。

Receive Abort AI イベント (Task)

  • TaskがDecoratorによって中止されたときに呼ばれます。
  • Receive Abort AI イベントを記述した場合、Finish Abort 関数を呼ぶまで、ノードの実行状態が続きます。

Receive Execution Start AI イベント (Decorator)

  • アタッチされたノードが開始されるときに呼ばれます。
  • Observer Aborts設定に関わらず呼ばれます。

Receive Execution Finish AI イベント (Decorator)

  • アタッチされたノードが終了、または中止されたときに呼ばれます。
  • Observer Aborts設定に関わらず呼ばれます。

Compositeの下位ノード決定前に呼ばれるイベント

Receive Search Start AI イベント (Service)

  • アタッチされた Composite ノードの下位ノードの中で、最初に実行すべきノードを決める前に、このイベントが呼ばれます。
  • アタッチされたノードがTaskの場合は、一切呼ばれません。

Decorator、Serviceの有効化、無効化時に呼ばれるイベント

Receive Activation AI イベント (Service)

  • アタッチされたノードが、開始されるときに呼ばれます。
  • アタッチされたノードが終了しても、次に実行されるノードが同じノードであった場合、すなわち、この Service が引き続き動作する場合には、次のノードの Receive Activation AI イベントは呼ばれません。

Receive Deactivation AI イベント (Service)

  • アタッチされたノードが、終了されるときに呼ばれます。
  • アタッチされたノードが終了しても、次に実行されるノードが同じノードであった場合、すなわち、この Service が引き続き動作する場合には、終了するノードの Receive Deactivation AI イベントは呼ばれません。

Receive Observer Activated AI イベント (Decorator)

  • Observer Aborts のための監視を開始するときに呼ばれます。すなわち、Decoratorが中止すべきか判断する対象となるノードの、監視を開始するときに呼ばれます。
  • Observer Aborts の値が None の場合は、一切呼ばれません。
  • 監視対象のノードが終了しても、次に実行されるノードが引き続き監視対象であった場合には、次のノードの Receive Observer Activated AI イベントは呼ばれません。

Receive Observer Deactivated AI イベント (Decorator)

  • Observer Aborts のための監視を終了するときに呼ばれます。すなわち、Decoratorが中止すべきか判断する対象となるノードの、監視を終了するときに呼ばれます。
  • Observer Aborts の値が None の場合は、一切呼ばれません。
  • 監視対象のノードが終了しても、次に実行されるノードが引き続き監視対象であった場合には、終了するノードの Receive Observer Deactivated AI イベントは呼ばれません。

実行するTaskが決定してからのイベント呼び出し順序

実行するTaskが決定してから、実際に実行されるまでの、イベント呼び出し順序については、およそ以下のようになっています。

  • (CompositeやDecoratorを元に、開始すべきTaskが決まる)
  • これから実行される Task や Composite にアタッチされている Decorator の Receive Execution Start AI イベント
  • 直前まで実行されていた Task の Receive Abort AI イベント
  • 直前まで実行されていた Task や Composite にアタッチされている Service の Receive Deactivation AI イベント
  • 直前まで実行されていた Task や Composite を監視していた Decorator の Receive Observer Deactivated AI イベント
  • これから実行される Task や Composite を監視する Decorator の Receive Observer Activated AI イベント
  • これから実行される Task や Composite にアタッチされている Service の Receive Activation AI イベント
  • これから実行される Task や Composite を監視する Decorator の Receive Tick AI イベント
  • これから実行される Task の Receive Execute AI イベント
  • これから実行される Task の Receive Tick AI イベント
  • (Task実行中)
  • (Task実行終了、もしくは Decorator による 中止)
  • 実行していた Task や Composite にアタッチされている Decorator の Receive Execution Finish AI イベント
  • (CompositeやDecoratorを元に、開始すべきTaskが決まる)
  • これから実行される Task や Composite にアタッチされている Decorator の Receive Execution Start AI イベント
  • (以下続く..)

Decoratorの Receive Execuiton Start AI イベントの後に、直前まで実行されていた Task などに関わる終了イベントが呼ばれることに注意してください。
例えば、Receive Execution Start AI と、Receive Deactivation AIとで同じBlackboard変数を読み書きする処理を記述していると、前後関係が混ざってしまうことにより、思わぬバグを生む可能性があります。

まとめ

いかがでしたか?同じ名前や似たような名前のイベントであっても、それぞれ役割やタイミングなどに違いがあることがご覧いただけたかと思います。
この違いを把握することで、AIのふるまいをより的確に作っていくことができます。
BehaviorTreeのノード、そしてイベントを使いこなして、さまざまなAI挙動を作ってみてくださいね!