ゲーム開発備忘録

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

【ゼロからアンリアルエンジン5】〔AI編〕⑩NPCの注意をそらすアイテムを投げる仕組みを作ろう~予測線と投擲システム~

目次

 

はじめに

 

注意

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

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

 

弾道予測と投擲システムを解説します。

 

前回

namiton.hatenablog.jp

 

解説

①弾道予測関数を作る

弾道システムは以前こちらの記事でやりましたので、

これを応用して実装します。

namiton.hatenablog.jp

 

BP_ThirdPersonCharacterを開きます。

 

関数TrajectoryCalculationを作成します。

 

リターンノードを追加して画像のように組みます。

 

②ソケットを追加する

投げるアイテムの位置を決めるためにソケットを追加します。

 

SK_Mannequinを開きます。

hand_rを右クリックしてソケットを追加します。

名前はSocket_hand_rとします。

 

Previewアニメーションから投げるポーズを選択して

 

作成したsocketにPreviewアセットのCylinderを追加

 

持ってる風になるように位置合わせをします。

 

位置合わせが完了したら、プレビューアセットを取り除きます。

 

念のためスケールは戻しておきましょう。

 

 

③予測線を出す

作成した関数を使って予測線を出します。

 

カスタムイベントThrowTrajectoryを作ります。

 

画像のように組みます。

作成したソケットの位置からカメラの距離を元に目的地を作成して弾道を表示します。

ActorsToIgoneにSelfを入れることでプレイヤーキャラが弾道をブロックしないようにしています。


イベントの呼び出し
DoFの呼び出しを変更してこのイベントを呼べるようにします。

 

実行してみましょう。

予測線が出ていたら成功です。

またカメラのベクターの掛け算から投げる強さと方向を変更できます。

設定しやすいように変数化しておきましょう。

山なり具合を変更することもできます。

 

⑤ノイズ軽減用のフラグを作る

構えた状態で連続して投げるモーションをすると、画像のように一瞬関係のない予測線が表示されます。

 

原因はアニメーションブレンドです。

予測線のフラグはアニメーション通知のAC_ThrowEndを見ていますが、アニメーションを綺麗につなげるために0.2秒構えるまでにラグがあります。

 

そのため完全に構え終わったフラグを作成して、ラグを考慮するようにします。

 

投げられるかどうかのCanThrowを作ります。

 

投げるられるかの確認フラグに変更

ラグ(0.2秒)を考慮して0.25秒遅らせます。

予測のフラグにCanThrowを使います。

実行してブレンド中は表示されないことを確認しましょう。

 

⑤予測線のカスタマイズ

こちらの記事で紹介した通りです。

namiton.hatenablog.jp

 

▼全体像

⑥ガビガビをなくす

被写界深度を切っても、画面を激しく動かすと予測線がガビガビします。

これはモーションブラーのせいなので無効化します。

 

FollowCameraからMotionBlurを検索して0にします。

UpdateDoFにも設定しておきましょう。

ガビガビしなくなりました。

 

⑤予測線に色を付ける

こちらの記事を参考に

namiton.hatenablog.jp

 

半透明かつ影を落とさないようにします。

 

⑥BP_SparkGrenadeの編集

こちらの記事を参考に作ります。

namiton.hatenablog.jp

 

BP_SparkGrenadeを開きます。

コリジョンプリセットを編集します。

 

ループ処理を切断して、音が鳴ってから5秒後に自壊させます。

 

BeginPlayを削除してカスタムイベントThrowGranadeに変更します。

これで持っている間に爆発しなくなります。

 

予測線通りに飛ばすための仕組みを追記します。

 

⑦持つイベントの作成

 

BP_ThirdPersonCharacterにGrabItemをつくります。

 

インプットに持つか離すかのフラグを作って持っているものがあれば破棄するようにします。

 

その後、アクタを生成して用意したソケットにアタッチします。

Aimイベントに配置します。

 

自動でも再度持てるように追加します。

 


実行してみてアイテムを持つかどうか確認してみましょう。

 

⑧投げるイベントの作成

 

カスタムイベントThrowItemを作成します。

 

TrajectoryCalculationを開いて変数へ昇格します。



デタッチ後、BP_SparkGrenadeを呼び飛ばします。

 

⑨アニメーションにタイミングの指定

投げるイベントをアニメーション開始と同時に呼ぶとズレが出てしまうので遅延を入れてから呼び出します。

 

⑩キャラクターと干渉しないようにする

投げるアニメーションと投げるモノが干渉してしまうので、独自のコリジョンプリセットを作成して回避します。

 

プロジェクト設定を開きます。

 

コリジョンから新規オブジェクトチャンネルを押します。

 

PlayerPawnThrowItemを追加します。

 

新規プリセットからThrowItemPlayerPawnの二つを追加します。

それぞれが物理的に干渉しないようにします。

 

それぞれコリジョン設定を変更します。

▼BP_SparkGrenade

▼BP_ThirdPersonCharacter

・CapculeComponent

・Mesh

これで干渉しなくなります。

 

最後に

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

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

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

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