SnelDev
(SnelDev)
1
お世話になります。
現在、「プレイヤーを追いかけ続け、移動を開始してから3秒後経っても目標アクター(プレイヤー)地点に到達出来なければ諦める」といったAIを作成しています。
添付図のようなBPを組んでいるのですが、目標アクターに届いていないにも関わらず、図の「目標アクターに到達できた時」に処理が入ってしまいます。
所感では、デフォルトのMovementResultがSuccessになっており、ブロックや停止等の原因があって初めてそれぞれ失敗のEnumに変わるように見えるのですが、「追いかけ続けたけど届かなかった」という状態を取得することは可能でしょうか?
ご教授の程、よろしくお願いいたします。
TimeLimit
Decoratorを使用することをおすすめします
TimeLimitDecoratorを使えば、指定時間内にタスクツリーが完了しなかった場合に、そのタスクを失敗として中断することができるようになります
Latentノードに付いている戻り値は、Latentノードの処理完了時(この場合はOnSuccessかOnFail)にしか正しい値は取れません
ですので、それ以外のタイミングで取得しようとしても、その変数の初期値など、目的に合わない値しか参照できません
なお、EPathFollowingResultのSuccess以外の値は、Blocked、OffPath、Aborted、Invalidといった、何らかの原因でNavmesh上の移動ができなくなった、と判断されたときのものです
追いかけることができるなら、それは移動可能である、ということですから、Success以外の回答が返ってくることはないでしょう…対象がNavMesh外に逃げ出すのでなければ、ですが
SnelDev
(SnelDev)
3
ご回答頂き、ありがとうございます。
時間内に完了しない時に失敗を返せるものがあるのですね。確かに、こちらで実現できそうです。
また、参照のタイミングやEPathFollowingResultについても、補足頂きありがとうございます。Navmesh上での移動ができなくなった結果のものだったのですね。また一つ勉強させて頂きました。
ビヘイビアツリーの勉強中で今一つ理解が追い付いていないのですが、失敗を返すということはMoveToで移動している速度は0に戻るという事でしょうか?
下図のように組みなおしてみましたが、waitを5秒挟んでいるにも関わらず、移動し続けてしまいます。MoveToTargetタスクがTimeLimitで失敗したら、Selectorに伴って次のWaitが呼ばれると解釈しているのですが、間違っていますでしょうか?
ご教授の程、よろしくお願いいたします。
Timelimitはあくまでも指定時間を過ぎたタスクを失敗扱いにするだけで、MoveToを止めるわけではありません
MoveToによる移動を止めるには StopMovementImmediately
や StopActiveMovement
を別途実行する必要があります
MoveToTargetタスクがTimeLimitで失敗したら、Selectorに伴って次のWaitが呼ばれると解釈しているのですが
Selectorの動作についてはその解釈であっています
ですので、Waitの前に、StopActiveMovementを実行するタスクを挿入する必要があります
SnelDev
(SnelDev)
5
ご回答頂き、ありがとうございます。
なるほど、「失敗扱いにするだけ」なのですね。
提案頂いた内容を元に、MovetoActorをAI MoveToに差し替えて試してみたところ、それらしい動きになりました。
ありがとうございます。
後学のためにお伺いさせて頂きたいのですが、上記画像のまま後ろにStopActiveMovement用タスクを入れると、AIが動かずに止まってしまいました。
調べてみたところ、MoveToActorはLatentノードではないため、TimeLimitを待たずにすぐにブランチでFalseに入っているのが原因のようですが、なぜFalseに入っているのかがわかりません。
こちら、宜しければご教授頂けますでしょうか?
MoveToActorはAIに対象のActorの場所へ移動することを リクエストする ノードです
リクエストが受け付けられたタイミングで次のノードへ処理が移ります
この戻り値は、リクエストを受け付けた(RequestSuccessful)か、既に目的地にいるので動く必要がない(AlreadyAtGoal)か、失敗した(Failed)かのいずれかになります
正常に受け付けた場合、RequestSuccessfulが返るので、画像の中のBranchは常にFalseになります
実際の移動はAIPawnに付いているMovmentComponentの動作によります
このノードのすぐ後ろにStopActiveMovmentを入れるということは、せっかくAIにリクエストした移動を、その場でキャンセルすることになるため、一歩も動くことなく移動が終わってしまいます
SnelDev
(SnelDev)
7
なるほど!
MoveToActorはリクエストするノードなのですね。
とても理解ができました。ありがとうございました。
こちらの質問は以上で完了とさせていただきます。
ご教授頂き、ありがとうございました。