ビヘイビアツリーのタスクはFinishExecuteで終わるようにする
妹「先日作ってたオバケに追いかけられるゲームなんだけど、作ってた時にいくつか解決してない問題が出てきたんだよ」
docs.unrealengine.com
docs.unrealengine.com
妹「まずはAIの動きなんだけど、とりあえずただ追尾するキャラクターっていうのを作っていた。作ったというか、ドキュメントのやつをほぼ丸写ししたんだけど、丸写しなのに変な動き方をするからおかしいというか」
「具体的にはどんなことが?」
妹「同じAIのが何人か居るんだけど、途中で追尾をやめて、その場で立ちすくんでしまうやつが居る。一度止まるともう何にもしない。ただ再現する方法はわかった。他のキャラが邪魔で近づけない状態で、しばらく待つとそうなる」
「動かなくなる直前にジャンプしてるのは?」
妹「それは障害物に引っかかった時に乗り越えさせようと思っていれたやつ。AIMoveが失敗した時にジャンプするようにした。でもジャンプさせないようにしても結果は同じだったからそれは関係なさそうな……」
「ジャンプした時だけ動かなくなるってことは……これがFinishExecuteにつながってないせいかも。つなぐと……動くようになるね」
妹「あれ? でもチュートリアルのも、AIMoveのOnFailのとこにはなにも繋いでないから、これも同じように動かなくなるのでは?」
「ビヘイビアツリー側で、時間が経つとタスクを強制終了するデコレーターでも付けてれば別だけど、ドキュメントに書いてある図だとそうはなってないね。もしAIMoveの設定時間内に追いつけなかった場合は止まっちゃうと思う」
妹「結局FinishExecuteは要るってこと? でも白い線がつながってない、おしまいのノードなんだから、勝手に終了してくれてもいいと思うんだけど。普通のイベントとかはそうだよね?」
「Delayノードとかシーケンスとかあると、終わったかどうか判断するの難しいからね。イベントの場合は、終わってても終わってなくても、気にせず次に進めちゃって、Delayの時間とかが来たらまた続きを実行していく仕組み。でもタスクの場合は確実に終わったのを見届けてから次のタスクに進む仕組みだから、FinishExecuteが必要なんだと思う」
妹「でもでも、ドキュメントにはFinishExecuteを実行しないと便利ですって書いてあるよ?」
「うーん、どういう意味なんだろう。実行しない方がいいケースって思いつかないんだけど。動きを止めたい場合にしても、終了させた後で別のタスクで止めればいいわけだし。とりあえずFinishExecuteしちゃっていいと思う」