BLOGブログ

2025.05.21UE5UE/ Blueprint

[UE5]【続】弾のバリエーションを増やそう!~速射編~

執筆バージョン: Unreal Engine 5.5.3

◆はじめに

こんにちは、エンジニアの山中です。

前回記事ではチャージショット(バースト、同時発射)の実装についてご紹介しましたが
今回は更にバリエーションを増やす為に「速射(フルオートマチック)」を実装しようと思います。

ボタンを押している間は常に弾が発射され続けます

◆準備

前回と同様、「FirstPerson」テンプレートを使用し、新規プロジェクトを作成します。

いつもの画面

今回もEnhancedInputを利用して実装を行いますが
既にテンプレートに実装されている「Shoot」アクションを変更する形で対応します。

その場合、前回行ったような「InputActionの追加」「InputMappingContextへの設定追加」「イベントの追加」は不要です!
ただ、現状の設定ではボタンを押下中のイベントが処理されない為
「IA_Shot」の設定画面にて「Released」を追加します。

◆実装

「BP_Weapon_Component」のイベントグラフを開きます。

入力が発生したら弾を発射する処理

「EnhancedInputAction IA_Shoot」ノードの「Triggered」はボタン押下時に1度だけ呼ばれるピンです。
今回使用するのは「Ongoing(押下中に継続して呼ばれるピン)」ですので
ノードの下部を押してピンを繋ぎ直してみましょう。

これで速射完成です!プレイして発射してみましょう!(※音量注意)

・・・もの凄い数の弾が発射されてしまいました。
現状は「Ongoing」が実行される度に弾を発射している為
お好みの発射間隔で発射できるよう、処理を変更していきましょう。

まずは弾の発射処理をイベント化します。

「Ongoing」に依存せず、いつでも呼び出せるように!

ここから一気に処理を実装していったものが↓になります。

ざっくり説明すると下記の通りです。

①「EnhancedInputAction IA_Shoot」イベントから取得できる経過時間を元に
 前回処理からの経過時間(差分)を算出します。
 一定間隔毎に何かをする場合、差分の累計で判定する方が処理が簡潔になる為です。
 (0.5秒経過したら、1.0秒経過したら、1.5秒経過したら…と処理するより、0.5秒毎に!の方が分かりやすいですよね)

②設定したインターバル分経過したら、先程イベント化した弾発射処理を呼びます。

③「Completed(ボタンを離した時に呼ばれるピン)」で、処理に必要だった情報を初期化します。
 インターバルの設定は初期化しないようにご注意ください!

(2回目)これで速射完成です!プレイして発射してみましょう!(※音量注意)

このままでも良いのですが、もう1工夫してみましょう。
撃ち始めは遅く、押し続けていれば徐々に早くなっていくような速射を実装します。

変数名がややこしくなってしまいましたが、ざっくり下記のような実装を追加しました。

・弾の発射処理は一切変更せず、発射間隔を一定時間毎に更新する処理を追加。

・「Started(ボタンを押した時に呼ばれるピン)」に発射間隔を初期化する処理を追加。

・「Completed」に初期化処理を追加

(3回目)これで速射完成です!プレイして発射してみましょう!(※音量注意)

発射に緩急が付いて爽快感が上がったかと思います!
ゲームデザイン的な意味でも発射間隔の変化は重要ですね。

◆さいごに

いかがでしたか?

「押した瞬間」「押している間」「離した瞬間」
アクションの基本となる3つのタイミングですが
上手く活用すれば様々な挙動が実装できるかと思います。

また、発射間隔を変化させたように
ほんの1要素足すだけでアクションに磨きがかかることがあるので
物足りなさを感じた際には是非試してみてください!