ゲーム開発備忘録

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

【ゼロからアンリアルエンジン5】〔AI編〕⑨NPCの注意をそらすアイテムを投げる仕組みを作ろう~アニメーション編~

目次

 

はじめに

 

注意

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

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

 

今回はプレイヤーがAIが反応するアイテムを投げれるようにします。

長くなるので二部構成にして、この記事ではアニメーションを作成するまでを実装します。

 

前回

namiton.hatenablog.jp

 

解説

①エイムする仕組みを作ろう

エイムについては素晴らしい記事があるのでこちらを参考に実装します。

free-gamer.hatenablog.com

 

エイムするためのキーを割り当てます。

 

編集からプロジェクト設定

 

エンジン・インプットからアクションマッピングを追加から

 

Aimからマウスの右ボタンを設定します。

 

投げるアクションも作成しましょう。

 

BP_ThirdPersonCharacterを開きます。

イベントグラフにインプットアクションから作成したAimを設定します。

 

タイムラインを作成してフロートトラックを追加

 

0.25秒で0~1にするようにします。

 

このLarpからカメラのスプリングの値を変更します。

 

ゲームを実行して右クリックを押したらカメラが寄るようにします。

 

被写界深度は視認性に影響が出る可能性があるので、オンオフできるようにします。

変数のBool型を追加してUseDOFという名前に設定します。



記事のように関数を作成します。

ビネット効果を追加しました。

 

タイマーで関数を実行します。

 

UseDOFをオンにしていい感じの絵作りをします。

 

②移動速度を下げる

MaxWalkSpeedで移動速度を変更できます。

 

③アニメーションの適応

以前書いたこちらの記事を読んでThrowアニメーションを使用できるようにしてください。

namiton.hatenablog.jp

 

④ステートマシンの作成

ABP_Mannyを開きます。

ステートマシンからキャッシュされたポーズを作成します。

 

名前を変更します。

 

ステートマシンを新規作成して名前をOverride Statesとします。

 

ステートを2個追加します。

 

リネームします。

 

MainStatesにはキャッシュしたものを設定

 

遷移情報を取得できるようBP_ThirdPersonCharacterをキャストして変数化しておきます。

 

遷移の設定をします。

 

⑤アニメーションポーズの作成

まず構えるポーズを取得します。

リターゲットしたThrowアニメーションを開きます。

 

36フレーム当たりのポーズを使います。


アセットを作成→アニメーションを作成→現在のポーズ

名前はThrow_Anim_Poseとしました。

 

1フレーム分のアニメーションができた。

 

⑥トリミングしたアニメーションの作成

投げるポーズからアニメーションを再生するのではじめから再生すると重複してしまいます。そこで重複分をカットしたアニメーションを作成します。

 

Originalを複製します。

Throw_Anim_Cutとしました。

 

~35フレームをカットします。

 

同様に61フレーム以降を削除します。

 

⑦イベントの作成

投げたかどうか判定するThrow変数を作成します。

 

インプットアクションのThrowを出してエイムしているときにThrowをTrueにします。

 

⑧ステートと遷移の編集

▼完成図

 

まずAimStatesの中身です。

 

まずレイヤードブレンドで作成したポーズの上半身のみを上書きします。

これでspine_02より末端のアニメーションをPoseに上書きできます。

 

次にルックアットです。指定した骨に対してLocation方向へ向けることができます。

身体が60度以上曲がらないように制限しています。

 

ピンとして公開を押すことでLookatLocationをピンにできます。

そこから変数へ昇格しましょう。

 

LookatLocationに設定する変数は

カメラが見ている場所なので、アニメーションBPのイベントグラフからカメラからの正面1500の位置に向けるようにします。

 

次にThrowStatesの中身です。

やっていることはほぼ同じです。

再生しているのがPoseではなくCutなので気を付けてください。

またループは外しておきましょう。

左右に大きく動くアニメーションとルックアットの相性はよくないので省いています。

 

遷移一覧

 

▼AnimStatesとThrowStatesははじめから再生してほしいので

Always~にチェックをいれます。

 

▼投げたかどうかのフラグです。

 

▼投げた後に再び構える遷移です。

投げるアニメーションが9割再生されたら遷移します。

 

▼投げたらそのまま通常移動に戻る遷移です。

 

⑨アニメーション通知の設定

アニメーション通知を楽にするためにこちら記事を行ってください。

namiton.hatenablog.jp

 

EN_NotifyCategoryにActionを追加します。

 

BPI_ReceiveAnimNotifyにNotify_ActionEventを追加します。

 

BP_CustomAnimNotifyからインタフェースの呼び出しを追加します。

 

Throw_Anim_Cutの50フレームにカスタム通知を配置して名前をAC_ThrowEnd、CategoryをActionにします。

 

⑩イベントの編集

BP_ThirdPersonCharacterを開きます。

Actionイベントを実装します。

 

イベントから名前でスイッチを行いThrowフラグをFalseにするようにします。

 

実行してみましょう。

被写界深度のオンオフと投げモーションが正しく遷移するか確認しましょう。

 

よくよく見るとアニメーションのブレンドが綺麗に見えないところがあります。

これはMixamoからダウンロードしたアニメーションとUE5のアニメーションは別のモノだからです。AAAゲームがよく見えるのは高クオリティでつながりに違和感がない豊富なアニメーションが大きく作用していると考えています。

 

UE5のマーケットプレイスには高クオリティなアニメーションアセットが多数販売されています。見栄えのするアニメーションはモチベーションにもつながるので、ぜひ見てみてはいかがでしょうか?

 

 

www.unrealengine.com

最後に

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

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

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

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