ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【ゼロからアンリアルエンジン5】〔AI編〕⑱プレイヤーと間合いを取りながら移動する戦闘NPCを作ろう。中編

目次

 

はじめに

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

前回

namiton.hatenablog.jp

 

前回はAddMovementInputに入力されるWorldDirectionを変更することでNPCを動かすことに成功しました。

今回はプレイヤーとの位置関係保ちつつ移動するように変更していきたいと思います。

 

▼この記事でできること

 

解説

 

BTT_Strafingの編集

 

プレイヤーの方向をNPCは常に見ているため、NPCキャラクターのベクトルを利用することにしました。

 

プレイヤーから見て左に移動する場合はこのように組みます。

 

②BP_NPC_Characterの修正

ターンアニメーション中でも移動を優先してほしいのでStopSlotAnimationノードでTurnSlotのアニメーションを中断する処理を挟みます。

 

また、ルックアットを解除したときのMaxWalkSpeedを300にしておきます。

 

③ビヘイビアツリーの修正

Strafing中でも距離を計算してほしいのでオブザーバーをSelfに変更します。

 

プレイヤーとの距離一定以上の時はロックオンを解除するようにします。

 

実行してみましょう。

一定以上離れたら走ってついてきて、一定未満ならプレイヤーを中心に移動するようになれば成功です。

 

④4方向の移動に対応する

BTT_Strafingを開きます。

前編で作成した列挙型のEN_StrafingDirectionを使ってStrafingDirectionを作成します。


ユーザーが指定した中からランダムに選択するような仕組みにしてみます。

SelectStrafingDirectionという名前でインスタンス編集可能にチェック

 

単一から配列に変更します。

 

コンパイル後、デフォルト値に何らかのインデックスを入れておきましょう。

 

配列にすることで詳細から複数選択することができるようになります。

 

指定したものからランダムに取得します。

 

関数SelectWorldDirectionを作成します。

インプットにStrafingDirectionControlledPawn、アウトプットにWorldDirectionを用意して純粋にチェックを入れます。

 

列挙型の選択するノードから、それぞれの列挙型の内容からベクトルを設定します。

 

作成した関数を接続します。

 

ビヘイビアツリーからインデックスを追加して思い通りの移動をしているか確認してみてください。

 

 

⑤移動距離をランダム化する

CanMoveのフラグが立っている間移動するのでDelayノードの時間を変数化すれば移動距離を変更できます。

float型の変数MinMoveTimeMaxMoveTimeを作成します。

 

RandomFloatinRangeノードから設定した範囲内の時間をランダムに設定します。

 

ビヘイビアツリーから設定して動作を確認しましょう。

 

▼ノードの全体像

 

⑥もっと!ビヘイビアツリー!

デコレーターを使用することでプレイヤーとの距離や確率操作からより正確な移動決定を行えます。

 

確率からの行動決定は③話でやりましたね!このデコレーターを流用しましょう。

namiton.hatenablog.jp

 

 

 

タスクをインデックスから指定する仕組みにしたことで一つだけ選べば常にその移動が呼ばれます。

それを利用して距離が一定未満≒プレイヤーと近すぎるときは後ろに下がる。

 

距離がちょうどいいくらいなら10パーセントの確率で前後移動。それ以外は左右移動

 

いずれにも属さない場合は離れすぎていると判定して前進するようにしてみました。

 

いろいろ試してみてより良い挙動をするビヘイビアツリーを組んでみましょう!

 

このままだと壁や穴を無視してしまうので、後編では障害物の判定を行います。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。