愛をもってゲームをつくるゴリラのブログ

UE4初心者のゴリラがいろいろ頑張ります。

BehaviorTree でのMoveToタスクのカクつきを緩和してみる

お久しぶりです。ごりです。

1年ぶりの投稿です。

先日UE4勉強会in大阪(https://ue4study-osaka.connpass.com/event/93325/)にて

EQSについて講演してきました。

そのときに、BehaviorTreeのMoveToタスクについてのカクつきについて

質問があったので今回はそれについての記事にな

ります。

 

1年前の記事になりますが、このEQSを使って解説していきます。

 

goolee.hatenablog.com

 準備としてBlackBoardKeyにVectorDestination を追加しておいてください。

ここにEQSで計算した目標地点を格納します。

f:id:m-goolee-y:20180801210006p:plain

 

カクつくパターンのBehaviorTreeとして、以下のようにしました。

RunEQSQueryタスクにRandomWalk、BlackboardKeyにDestinationを設定します。

MoveToタスクの Blackboard keyにDestinationを設定します。

 

f:id:m-goolee-y:20180801210338p:plain

これで実行してみると...

f:id:m-goolee-y:20180801211207g:plain

 

カクついているのがわかると思います。

この対処法について、サービスで目標地点の近くにきたら目標地点を更新するという手法を提案しました。

そのサービスに中身について見ていきます。

BehaviorTreeの上部にある[新規サービス]からBTService_BlueprintBaseをクリック、新しくサービスを作成します。

作成したサービスの名前は UpdateDestinationとします。

f:id:m-goolee-y:20180801213249p:plain

 

サービスの更新間隔は以下のように設定してください。

f:id:m-goolee-y:20180801213514p:plain

新しく作成したサービスを開くと、イベントグラフには何もありません。

まずはカスタムイベントでEQSを実行するイベントを作成します。

RunEQSQueryノードでランダムウォークを設定し、

EQSの計算終了時に、目標地点をBlackBoardKeyに格納と目標地点までの距離を計算しています。

f:id:m-goolee-y:20180801213705p:plain

 

カスタムイベントを追加だけでは実行されません。

関数のオーバーライドから ReceiveSearchStartAI を選択します。

RecieveSearchStartAIではEQSの実行を行います。

今回の実装ではこのイベントは一回だけ呼ばれます。

f:id:m-goolee-y:20180801214308p:plain

 

次に関数のオーバーライドから RecieveTickAI を選択します。

f:id:m-goolee-y:20180801214558p:plain

 

RecieveTickAIでは残りの移動距離をチェックし一定の比率以下になったら目標地点を更新するようにしています。

f:id:m-goolee-y:20180801215046p:plain

 

これでサービスは完成です。

BehaviorTreeのRunEQSタスク削除し、以下のように設定しなおします。。

f:id:m-goolee-y:20180801215309p:plain

 

またMoveToの設定で BlackboardKey下の 

Observed Blackboard Value Tleranceを有効にする必要があります。

f:id:m-goolee-y:20180801215647p:plain

 

これで実行すると...

 

f:id:m-goolee-y:20180801215423g:plain

 

カクつきが緩和されたと思います。

それとBehaviorTreeがすっきりしましたね。

 

この手法以外にもカクつきをなくす方法はあると思います。

みなさんもいろいろ試してみてください。

間違っている点などありましたら、ご指摘いただけるとありがたいです。

 

ではまた。