読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ビヘイビアツリーのタスク強制終了の仕組み

f:id:una_unagi:20160422224114p:plain

妹「FinishExecuteが要るのはわかったけど、デコレーターを使うと中断出来るとも言ってたよね?」

「出来るよ。例えばTimeLimitデコレーターを使うと、設定した時間が経つとタスクを強制終了させることが出来る」

妹「そうするとさ、タスクの都合を無視して勝手に終了されると困ったりしない? AとBと両方やらないと意味ないのに、A終わった段階で時間切れになったら……」

「そういう風にはならないと思う。簡単な実験用のタスクを作ってみた。"Start"って表示して、無駄なループを繰り返して、"End"って表示して、Delayして、また無駄なループを繰り返すだけのタスク。そして外部からタスクを強制終了されると"Abort"と表示される。それにTimeLimitを制限時間0秒の設定でくっつけた」

f:id:una_unagi:20160422223712p:plain

f:id:una_unagi:20160422223720p:plain

「こうすると、何回繰り返してもStartEndAbortの順番で綺麗に並ぶ。ということはどういうことかというと」

  • TimeLimitをどんなに短くにしても1度は実行される
  • 一度実行を始めるとイベントが終わるか、Delayのタイミングまで中断されない

「という仕様になっている。これは普通のブループリントの場合でも同じ」

妹「これだと昨日の歩いていくやつには使えないのでは? AIMoveToはあるけど、Delayはなかったような」

「AIMoveToは内部的にDelayみたいなことをしてるから大丈夫。というか、Delayも何にもなしでタスクを実行すると、中断する以前の問題として無限ループ警告とかが出る。普通に実行出来てるタスクなら、適度なタイミングで中断可能なはず」

妹「中断するタスクにはReceiveAbortが要るの?」

「いやこれはただ確認用にPrintStringを入れたかっただけだから。単純に中断するだけで良ければ要らない。ただこのイベントを使う場合は、最後にFinishAbortノードを繋げないといけない。FinishExecuteの場合と同じ」