Behavior DesignerのConditional Abortsという機能についてまとめます。
Unity2018.3.9
課題
例として次のようなBehavior Treeを考えます。
Sequenceの子TaskのBool Comparisonの判定が通ると、10秒待機してからログを出力します。
従って、判定が通ってから10秒間はこのBehavior Treeは実行中状態となります。
さてこの状態でBool Comparisonによる判定がfalseになったらどうなるでしょうか?
初期設定では一度評価されたTaskの再評価は行われないため、何も起こりません。
これでは例えば、「敵が近くにいなかったら力を一定時間ためてから攻撃するが、ためている途中に敵が近くにきたらキャンセル」みたいなことがやりづらいです。
Abort Type : Self
前節のようなBehavior TreeでConditional Nodeを再評価したい場合には、
Sequence NodeのAbort TypeをNoneからSelfに変更します。
Abort TypeはComposite Taskの設定値で、Selfにした場合には
「このTaskの実行中は子のActionTaskを再評価する」という意味になります。
Abort TypeをSelfにした上で前節の例を実行し、途中でBool Comparisonの判定をfalseにすると
その時点で再評価が行われてBehavior Treeが失敗することが確認できます。
Abort Type : Lower Priority
Abort TypeにはLower Priorityという設定もあります。
Lower Priorityに設定すると、
「このTaskより右側にあるTaskの実行中はこのTaskの子のActionTaskを再評価する」という意味になります。
例えば以下のようなBehavior Treeでは、一度Waitが実行中になってしまうとBool Comparisonは再評価されません。
しかし2個目のSequenceのAbort TypeをLow Priorityに設定すれば、
右側にあるWaitの実行中にも再評価が行われるので判定の変更によりBehavior Treeが失敗します。
Abort Type : Both
Abort Typeにはもう一つ、Bothいう設定があります。
これは単純にSelfとLow Priorityの合わせ技になります。
アイコン
Composite TaskにAbort Typeが設定されているかどうかはTaskの左上のアイコンで識別できます。
最後にこれらを紹介して終わります。
Abort Type | アイコン |
---|---|
None | |
Self | |
Lower Priority | |
Both |