ビヘイビアツリーのタスク強制終了の仕組み
妹「FinishExecuteが要るのはわかったけど、デコレーターを使うと中断出来るとも言ってたよね?」
「出来るよ。例えばTimeLimitデコレーターを使うと、設定した時間が経つとタスクを強制終了させることが出来る」
妹「そうするとさ、タスクの都合を無視して勝手に終了されると困ったりしない? AとBと両方やらないと意味ないのに、A終わった段階で時間切れになったら……」
「そういう風にはならないと思う。簡単な実験用のタスクを作ってみた。"Start"って表示して、無駄なループを繰り返して、"End"って表示して、Delayして、また無駄なループを繰り返すだけのタスク。そして外部からタスクを強制終了されると"Abort"と表示される。それにTimeLimitを制限時間0秒の設定でくっつけた」
「こうすると、何回繰り返してもStartEndAbortの順番で綺麗に並ぶ。ということはどういうことかというと」
- TimeLimitをどんなに短くにしても1度は実行される
- 一度実行を始めるとイベントが終わるか、Delayのタイミングまで中断されない
「という仕様になっている。これは普通のブループリントの場合でも同じ」
妹「これだと昨日の歩いていくやつには使えないのでは? AIMoveToはあるけど、Delayはなかったような」
「AIMoveToは内部的にDelayみたいなことをしてるから大丈夫。というか、Delayも何にもなしでタスクを実行すると、中断する以前の問題として無限ループ警告とかが出る。普通に実行出来てるタスクなら、適度なタイミングで中断可能なはず」
妹「中断するタスクにはReceiveAbortが要るの?」
「いやこれはただ確認用にPrintStringを入れたかっただけだから。単純に中断するだけで良ければ要らない。ただこのイベントを使う場合は、最後にFinishAbortノードを繋げないといけない。FinishExecuteの場合と同じ」