Page 1 of 1

BehaviourTree の SubStateMachine + デコレータについて

Posted: 2018/08/13 02:54
by kudou
unity 2018 1.0 f2
arbor3.1.3

図1のような BehaviourTree を作成しました。
●図1
Image
②、③のデコレータの条件が合わなかった場合に④が実行されます。
このときに②、③の条件があっていないときにでもSubStateMachineReferenceの開始ステートの挙動のOnStateBeginやOnStateUpdateが1度実行されてから④が実行されているようでした。
私としてはデコレータの条件が合わないときはSubStateMachineReferenceの中の挙動は実行されずにいて欲しいのですが、上記の挙動は仕様でしょうか?

Re: BehaviourTree の SubStateMachine + デコレータについて

Posted: 2018/08/13 04:00
by caitsithware
ご質問ありがとうございます。

現在の仕様についてですが、ノードのアクティブ化と処理の流れは以下の通りとなっています。
  • ノードがアクティブになる
    このタイミングでActionBehaviourやDecorator、ServiceのOnAwakeとOnStartが呼び出される。
    SubStateMachine関連では、このOnStartのタイミングでPlay開始しているため、必ず子グラフが実行開始されるようになっている。
  • 割り込み判定を行う。
  • 実行可能かのデコレータ判定を行う(アクティブ化後の1回のみ)。
  • 条件に合致するならOnExecuteを呼び出す。
まず、なぜアクティブの時に必ずOnStartを呼ぶようになっているかというと、TimeLimitやCooldownデコレータのように通過次第タイマーを開始したいケースなどがあるためです。
LowerPriorityによる割り込み判定のためにも「一度アクティブになり通過した」状態は必要かと考えています。
スクリプトが自由に記述できるのもあり、どういったケースで呼び出して欲しいか必要ないかがArbor本体側では判断できないため、現状は一律で呼び出すようになっています。

ですが、この問題点もわかりますので、今後の更新で何かしらの対応をしたいと思います。
それまでの間、条件判定をFSMで行うか、FSM側の開始ステートにGoToTransitionを挟むなどで処理を一瞬遅らせるなどしてください。

また、OnStateUpdateについてはログ出力をして確認してみましたが、条件が合致しないアクション側のOnStateUpdateは呼び出されていないようでした。
もし呼び出されているようでしたら不具合ですので詳細を不具合報告フォーラムへお願いいたします。

ご不便おかけして申し訳ありませんがよろしくお願いいたします。

追記:
arbor3.1.3
これは勝手なお願いなのですが、
バージョンの違いに細かくサポートするのも難しいので、もしよろしければArbor最新版(3.2.3)を使用するようにお願いいたします。

Re: BehaviourTree の SubStateMachine + デコレータについて

Posted: 2018/08/13 05:13
by kudou
ご返答ありがとうございます。

ノードのアクティブ化と処理の流れの件、了解いたしました。
また対応策も「FSM側の開始ステートにGoToTransitionを挟む」ことで思ったとおりの動作ができました。
また、OnStateUpdateについてはログ出力をして確認してみましたが、条件が合致しないアクション側のOnStateUpdateは呼び出されていないようでした。
もし呼び出されているようでしたら不具合ですので詳細を不具合報告フォーラムへお願いいたします。
こちらは呼び出されていないようでした。
OnStateAwakeやOnStateBeginなどと一緒にチェックしていたときに勘違いしたのかもしれません。
本当にすみません。

3.1.3は3.2.3の書き間違えでした。
本当にすみません。

ミスが多く、本当にすみません。
気をつけます。