ゲーム開発備忘録

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

【ゼロからアンリアルエンジン5】〔AI編〕⑪CustomMoveToによるAIのスタックを防止する+ターンモーションの実装

目次

 

はじめに

 

注意

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

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

前回

namiton.hatenablog.jp

 

 

 

以前、記事内で紹介したCustomMoveTo。

非常にAIをスムーズに動かすことができるのですが、少し問題があります。

qiita.com

これは検証用に作成したレベルです。

奥と手前に移動ポイントがあり移動します。

 

この状態で実行してみます。

このように反転時に旋回半径が大きいため、そこに障害物がある場合にスタックしてしまいます。

 

これを防ぐためには特定条件下でその場回転を行う必要があります。

今回はその場回転と条件付けをできるAIに改造していきたいと思います。

 

▼記事でできること

 

解説

①アニメーションを取得

無料アセットのAdvanced Locomotion System V4からその場回転アニメーションを取得します。

www.unrealengine.com

 

プロジェクトを作成から5.0で作成します。


Advanced Locomotion System V4は非常に良いアセットなのですが非常に複雑かつ軽量とは言い難いため、ターンシステムのみを流用します。

 

プロジェクトが開いたらコンテンツからALS_N_TurnIP_ 系とALS_N_Transition_系のアニメーションを取得します。

 

右クリックから移行を押します。

 

移植対象にアニメーションのスケルトン、メッシュのみを選択します。

 

OKを押したら現在のプロジェクトのContentフォルダを指定します。


すると現在のプロジェクトのコンテンツに移植されるので、確認出来たら成功です。移植元のプロジェクトは閉じても大丈夫です。

 

②リターゲット

以前書いたこちらの記事を参考にALSV4のスケルトンからリタゲを行います。

namiton.hatenablog.jp

リターゲットしたアニメーションにカーブが含まれていることを確認しましょう。

 

③ターンシステムの実装

1.BP_NPC_Characterの編集

関数UpdateAngleを作ります。

 

ココでは変数TargetPositionとアクター角度を算出する関数です。

 

次に現在の回転を設定する関数CasheValuesです。

 

現在の回転量を計算する関数CurrentValuesです。

 

アニメーションに含まれるカーブを取得する関数GetAnimCurveValueです。

 

アニメーションのカーブの持つ回転量を加える関数UpdateTurnRotationです。

 

準備できたらターンを行うかの変数を作ります。

 

イベントグラフに画像のように組みます。

 

2.構造体の作成

構造体TurnInPlace_Assetを作ります。

 

3.ABP_NPCの編集

変数の作成

デフォルト値(貼っていないものは0です)

 

 

その場回転する関数TurnInPlaceを作成します。

ローカル変数は画像の通り

 

Characterの参照からをBP_NPC_Characterに変更しておきます。

 

回転ができるかどうかチェックする関数TurnInPlaceCheckをつくります。

 

 

トランジションのカーブからターン判定を除外するための関数CanTurnInPlaceです。

純粋にチェックを入れます。

 

同様にトランジションを実行できるかの関数CanDynamicTransitionです。

純粋にチェックを入れます。

 

トランジション用のモンタージュを再生するカスタムイベントPlayDynamicTransitionを作成します。

 

イベントグラフに組みます。PlayDynamicTransitionのアニメーションはALS_N_Transition_L_RetargetedとALS_N_Transition_R_Retargetedです。

 

最後にスロットとカーブを追加します。

 

カーブの変更はカーブピンから追加します。

 

アニメーションスロットからグループとスロットを追加してください。

 

スロットから名前を選択します。

 

BTT_CustomMoveToの改造

 

1.経路探索の独立タスク化

経路探索を独立させます。

タスクBTT_PathFindingを作成します。

 

ブラックボードでは配列を所持できないので、BP_NPC_CharacterにCutomMovePathPointsを用意します。

 

タスクからキャラクターブループリントに経路検索結果をセットします。

MinDistanceから目的地が直近の場合は生成しないようにしました。

 

BTT_CustomMoveToを開きます。

経路探索は別のタスクに移植したのでここではキャラクターの持つ経路情報を取得します。存在しない=経路が設定されていない場合はタスクを終了します。

 

2.ターン用タスクの作成

新規タスクからBTT_TurnSystemというタスクをつくります。

 

変数を用意します。

 

ターンするかの変数をセットして経路探索の二番目を見るようにします。二番目がない場合は目的地が直近、もしくは直線のため目的地へターンするようにしました。

 

⑤ビヘイビアツリーに組み込み

BTT_CustomMoveToのノードの前に追加します。

経路探索→ターンシステム有効化→アニメーション再生→ターンシステム無効化を行います。

 

プレイヤーを見つけたときはターンせずに直接追いかけるようにしたいので、TurnSystemから無効化します。

 

▼全体像

黄色で囲ったところが追加したもの


完成!!

 

さらに精度を上げたいときは経路探索のポイント配列からポイントごとに内積計算を行い、キャラクターの前ベクトルと一定の角度差がついている場合はターンに移行するなどの実装もできます。

 

⑥+αアニメーションによる足の浮きをなおしたい場合

リタゲしたアニメーションの足が浮いてしなうようなときはアニメーションを修正することで見栄えをよくすることができます。

 

アニメーションエディタからPelvisを選択して

 

キーを押します。


するとレイヤートラックに追加され、このアニメーションを補正することができます。

 

ちょっとしたアニメーション修正に使えるので便利です。

最後に

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

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

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

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