BehaviorTree でのMoveToタスクのカクつきを緩和してみる
お久しぶりです。ごりです。
1年ぶりの投稿です。
先日UE4勉強会in大阪(https://ue4study-osaka.connpass.com/event/93325/)にて
EQSについて講演してきました。
そのときに、BehaviorTreeのMoveToタスクについてのカクつきについて
質問があったので今回はそれについての記事にな
ります。
1年前の記事になりますが、このEQSを使って解説していきます。
準備としてBlackBoardKeyにVectorのDestination を追加しておいてください。
ここにEQSで計算した目標地点を格納します。
カクつくパターンのBehaviorTreeとして、以下のようにしました。
RunEQSQueryタスクにRandomWalk、BlackboardKeyにDestinationを設定します。
MoveToタスクの Blackboard keyにDestinationを設定します。
これで実行してみると...
カクついているのがわかると思います。
この対処法について、サービスで目標地点の近くにきたら目標地点を更新するという手法を提案しました。
そのサービスに中身について見ていきます。
BehaviorTreeの上部にある[新規サービス]からBTService_BlueprintBaseをクリック、新しくサービスを作成します。
作成したサービスの名前は UpdateDestinationとします。
サービスの更新間隔は以下のように設定してください。
新しく作成したサービスを開くと、イベントグラフには何もありません。
まずはカスタムイベントでEQSを実行するイベントを作成します。
RunEQSQueryノードでランダムウォークを設定し、
EQSの計算終了時に、目標地点をBlackBoardKeyに格納と目標地点までの距離を計算しています。
カスタムイベントを追加だけでは実行されません。
関数のオーバーライドから ReceiveSearchStartAI を選択します。
RecieveSearchStartAIではEQSの実行を行います。
今回の実装ではこのイベントは一回だけ呼ばれます。
次に関数のオーバーライドから RecieveTickAI を選択します。
RecieveTickAIでは残りの移動距離をチェックし一定の比率以下になったら目標地点を更新するようにしています。
これでサービスは完成です。
BehaviorTreeのRunEQSタスク削除し、以下のように設定しなおします。。
またMoveToの設定で BlackboardKey下の
Observed Blackboard Value Tleranceを有効にする必要があります。
これで実行すると...
カクつきが緩和されたと思います。
それとBehaviorTreeがすっきりしましたね。
この手法以外にもカクつきをなくす方法はあると思います。
みなさんもいろいろ試してみてください。
間違っている点などありましたら、ご指摘いただけるとありがたいです。
ではまた。