【Unity】Behavior Designerで条件判定の結果が途中で変わった時の挙動を決めるConditional Aborts

Behavior DesignerのConditional Abortsという機能についてまとめます。

Unity2018.3.9

課題

例として次のようなBehavior Treeを考えます。

f:id:halya_11:20190402002248p:plain

Sequenceの子TaskのBool Comparisonの判定が通ると、10秒待機してからログを出力します。
従って、判定が通ってから10秒間はこのBehavior Treeは実行中状態となります。

f:id:halya_11:20190402002402p:plain

さてこの状態でBool Comparisonによる判定がfalseになったらどうなるでしょうか?
初期設定では一度評価されたTaskの再評価は行われないため、何も起こりません。

f:id:halya_11:20190402002715g:plain

これでは例えば、「敵が近くにいなかったら力を一定時間ためてから攻撃するが、ためている途中に敵が近くにきたらキャンセル」みたいなことがやりづらいです。

Abort Type : Self

前節のようなBehavior TreeでConditional Nodeを再評価したい場合には、
Sequence NodeのAbort TypeをNoneからSelfに変更します。

f:id:halya_11:20190402003143p:plain

Abort TypeはComposite Taskの設定値で、Selfにした場合には
「このTaskの実行中は子のActionTaskを再評価する」という意味になります。

Abort TypeをSelfにした上で前節の例を実行し、途中でBool Comparisonの判定をfalseにすると
その時点で再評価が行われてBehavior Treeが失敗することが確認できます。

f:id:halya_11:20190402003612g:plain

Abort Type : Lower Priority

Abort TypeにはLower Priorityという設定もあります。

f:id:halya_11:20190402004054p:plain

Lower Priorityに設定すると、
「このTaskより右側にあるTaskの実行中はこのTaskの子のActionTaskを再評価する」という意味になります。

例えば以下のようなBehavior Treeでは、一度Waitが実行中になってしまうとBool Comparisonは再評価されません。

f:id:halya_11:20190402004413g:plain

しかし2個目のSequenceのAbort TypeをLow Priorityに設定すれば、
右側にあるWaitの実行中にも再評価が行われるので判定の変更によりBehavior Treeが失敗します。

f:id:halya_11:20190402004629g:plain

Abort Type : Both

Abort Typeにはもう一つ、Bothいう設定があります。
これは単純にSelfとLow Priorityの合わせ技になります。

f:id:halya_11:20190402004825p:plain

アイコン

Composite TaskにAbort Typeが設定されているかどうかはTaskの左上のアイコンで識別できます。
最後にこれらを紹介して終わります。

Abort Type アイコン
None f:id:halya_11:20190402005018p:plain
Self f:id:halya_11:20190402005113p:plain
Lower Priority f:id:halya_11:20190402005153p:plain
Both f:id:halya_11:20190402005216p:plain

参考

opsive.com