BLOGブログ

2024.10.09UE5UE/ Blueprint

[UE5]チャージショットで弾のバリエーションを増やそう!

執筆バージョン: Unreal Engine 5.4.3

◆はじめに

みなさんこんにちは!エンジニアの山中です。

今回は主にシューティングゲーム等で活用できる
チャージショットの実装について一例をご紹介します。

シューティングゲームの基本挙動に関しては既に
「FirstPerson」テンプレートにて実装済みですので
追加アクションという形で実装していこうと思います。

◆事前確認

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

まずは本プロジェクトにおける単発ショットの実装を確認します。
左クリック、またはR2トリガーを押すと弾が発射されたので
「BP_FirstPersonProjectile」の生成タイミングから、弾発射の実装箇所を調べます。

①「BP_FirstPersonProjectile::BeginPlay」にブレークポイントを追加

BeginPlayイベントを追加し、ノードを右クリックしてブレークポイントを追加

②「BlueprintDebugger」を開く

③ゲームプレイし、弾を発射したところで停止するので、「BlueprintDebugger」のコールスタックを確認

「BP_Weapon_Component::EnhancedInputAction_IA_ChargeShot」に実装がありそうなのでダブルクリックでジャンプしてみます。
そしてイベントノードにカーソルを当てると親切な説明文を発見。

UE5で導入されたEnhancedInputを利用して実装されていることが分かりました。

公式ドキュメントのリンクはこちら

◆準備

①InputActionを追加する

既存の「IA_Shoot」を「Ctrl+D」で複製して新たに「IA_ChargeShot」を作成します。

アセットをダブルクリックで開き、設定を行います。
単発の場合は「ボタンを押した時」だけで良かったですが
チャージショットの場合は「ボタンを離した時」も処理する必要がある為
必要な項目として「Released」を追加します。

②InputMappingContextに設定を追加する

次に、今回追加したアクションをどのキーやボタンで実行するかを設定します。
Content内で「IMC」でワード検索するか、元々実装されていた「IA_Shoot」のReferenceViewerから
「IMC_Weapons」を見つけ出して開きましょう。

アセットを開くと「Mappings」の項目に既に「IA_Shoot」の項目が存在しているので
参考にしつつ「IA_ChargeShot」の項目を追加します。

③イベントを追加する

「BP_Weapon_Component」のグラフ内で「chargeshot」と入力すると
先程作成した「IA_ChargeShot」のイベントが表示されるので、試しに下記のようにノードを追加します。

ゲームプレイし、「IMC_Weapons」によって設定したキーを押したり離したりしてみて
画面上にログが表示されればOKです。

④弾の生成処理をイベント化する

単発での弾生成の処理を流用したい為、下記のように
新規でイベントを作成し、既存の処理に繋げておきます。

◆実装

実装箇所は「BP_Weapon_Component」のみで完結しました。
量もそこまで多くないのでそれぞれのピンの処理をサクッと解説します。

【Started】

押下時の処理です。最低限、溜めている最中であることが分かるように
発射アニメーションを少しいじった専用アニメーションを再生させていますが
無くても動作する為、詳細は割愛させていただきます。

【Ongoing】

押下中の処理です。「ElapsedSeconds」に押下時間が格納されているので画面左上にデバッグ表示を行っています。
「MaxTime」という変数を作成し、好きな時間を設定してください。(今回は「1.0」秒としています)
「Min」ノードについては次の段階で説明します。

【Completed】

ボタンが離された時の処理です。
最初に「Min」ノードを使用して、必ず溜め時間が「MaxTime」以下になるようにします。
その上で独自で作成した変数「PhaseUpSpan(今回は「0.2」秒)で割ることで
溜めれば溜めるほど沢山弾が発射されるようにしています。(最大5発)

あとは発射数を保持した独自変数「LeftCount」をデクリメントしつつ
Delayを利用して一定時間おきに弾を発射させることで速射を実現しています。
「ShotSpan」(「0.1」秒)は速射の間隔を設定する独自変数です。
間隔が短すぎると発射された弾同士がぶつかることがあった為、この数値にしています。

解説は以上です。↓がプレイ時の動画になります。(※音量注意)

発射数、発射時間を変更する他、溜めの後半になるほど発射数が延びる等
ゲームデザイン面でも色々工夫ができそうです。

◆おまけ

実装を少し変更することで、同時発射できるようにしてみました。(※音量注意)

溜めによって発射数を変えるのではなく
弾の性能が強化されるといった実装でも面白そうですね。

◆さいごに

いかがでしたが?

長押しで溜めて一気に発射!爽快感があって気持ち良いですよね。
溜め中のSE、パーティクル、UI等を実装することでプレイフィールはもっと良くなると思います。

今回はチャージショットに限定してご紹介しましたが
溜め操作自体は様々なジャンルのゲームで活用できるかと思います。
(バネでのジャンプ挙動、必殺技の予備動作、…等)

EnhancedInputを利用したアクションの実装も非常に楽でしたので
チャージ以外でも楽しいアクションを沢山実装してみてください。