UE5の弾を撃つ方法について
UE5でのゲーム制作では操作キャラや敵が弾を撃つ動作を行う必要があることが多い。やり方を紹介していく。
④視点変更
Get・SetやSequenceやBranchといった基礎的なノードがわからない場合は先に以下記事を確認してほしい。
アンリアルエンジンのノードの一覧UE5の弾を撃つ方法の目次
Niagaraシステムで弾丸Niagara作成弾丸ブループリント
弾を撃つ処理
目次にもどる
Niagaraシステムで弾丸Niagara作成
まず、Niagaraシステムを使って弾丸エフェクトを作成していく。
コンテンツドロワー直下にNiagaraフォルダを作成する。
Niagaraフォルダ内で右クリックし、FX→Niagaraシステムのように選択する。
.jpg)
どんなNiagaraシステムを作成するか選択肢(テンプレート)が表示される。今回はDynamicBeam(ビームや光を飛ばすエフェクト)を選択する。
.jpg)
Niagaraシステムが作成されるので、今回は名前をbulletにしてダブルクリックして開く。
.jpg)
DynamicBeamノードのColorを選択し、右の詳細タブを確認してほしい。
.jpg)
Colorの項目を今回は赤10、青0.3、緑2に変更し、オレンジっぽい光にする。保存して閉じる。
目次にもどる弾丸ブループリントの作成
弾用のブループリントクラスを作っていく
任意のフォルダで右クリックしてブループリント→ブループリントクラスを選択する。
.jpg)
アクターを選択する。
.jpg)
ブループリント名をBP_bulletとする。ダブルクリックし開く。
コンポーネントタブで「追加」を選択し、Niagara Particle System Componentのコンポーネントを追加する。
.jpg)
Niagaraのコンポーネントを選択し、詳細タブのNiagara System Assetで先ほど制作したbulletを指定する。
.jpg)
.jpg)
コンポーネントタブで「追加」を選択しProjectileMovement(弾やビームといった物を飛ばすのに役立つ)を追加する(日本語だと投射物移動コンポーネントと表示されているかも)。

ProjectileMovementを選択して詳細タブを見てほしい。
プロジェクタイルのInitial Speedで初期弾速の設定が可能。

シミュレーションを選択すると、どのような速さで動くのか見られるので、自分の好きな数値に設定すればいい。
今回は値を3500とした。
プロジェクタイルのProjectile Gravity Scaleを0にする。

これは重力の設定。今回は重力をかけず真っ直ぐ弾を撃つようにしたいので0にする。
目次にもどる弾を撃つ処理
インプットアクションファイルを作る。名前をIA_shootingとする。

IA_shootingを開き、「Value Type」をDigital(bool)にする(トリガーされているかがTrue・falseで出力)。Triggersの+マークを押す(NoneのままでOK)。

Enhanced Inputについて、よくわからない場合は以下の記事を確認してほしい。
キー入力のイベントの作り方デフォルトでThirdPerson→inputのフォルダにあるIMC_Defaultを開く。
先ほど作成したIA_shootingを追加し、マウスの左ボタンでアクションが起こるように設定し保存。
.jpg)
以前の記事で作成したBP_Playerを開き、右クリック→「IA_」程度まで検索するとIA_shootingが出てくるので出す。
3.jpg)
右クリックし検索しSpawnActorClassを出し、Classの入力ノードをBP_bulletにする。ここで一旦別の作業に移る。

①銃の持ち方でキャラに銃を持たせたが、その際に使用した銃のスタティックメッシュアセットにソケット(スタティックメッシュにとりつけられる)をつけていく。
ソケットはメッシュの特定の位置から何かアクションをさせたい場合に使える。例えばソケットを取りつけ、その位置から弾を飛ばすことができる。
まず、プレイヤーのWEAPONコンポーネント(以前の記事で作成したスタティックメッシュ)を選択する。
.jpg)
詳細画面をみてスタティックメッシュの以下のマークを選択すれば、使用されているスタティックメッシュのファイルまで飛べる。
.jpg)
そのファイルをダブルクリックして開き、ソケットマネージャータブを選択し、+マークを選択してソケットを追加する。ソケットの名前はMuzzleにする。
.jpg)
ソケットの位置や向きを調整する。以下のようにソケットを銃口まで移動させ、赤矢印(X軸・前方)、緑矢印(Y軸・右)軸、青矢印(Z軸・上)が正しくなるように向きを調整しよう。
.jpg)
コンポーネントタブからWeaponをドラッグ&ドロップしてワイヤーを伸ばし、Get Socket Transformを出す。
入力のin Socket Nameからワイヤーを伸ばしPromote to Variableする。変数名はMuzzleとしコンパイルする。
変数Muzzleを選択し、詳細タブのデフォルト値をMuzzleとする。
以下のようにIA_shootingとSpawnActorClassとGet Socket Transformを以下のようにつなげる。
.jpg)
これでWeaponのMuzzleのトランスフォームを取得し、その位置・向きにBP_bulletを出現させ、飛ばすことができる。
以上で弾を撃つ処理は完了。撃った弾を消すために、DelayとDestroy Actorを出し以下のようにつなげる。
.jpg)
DelayのDurationの値を0.5にしているので、実行ピンにつながっているDestroy Actor(その名の通りアクターの破壊)の処理は0.5秒後に行われる。
SpawnActorClassのReturn Valueからオブジェクト(弾丸アクター)を参照できるので、それをDestroy ActorのTarget入力ピンにつなぐのを忘れずに
再生してマウス左ボタンを押すと以下のように弾を撃つことができる。
この方式にした場合の問題点は弾速が速い(この動画の場合はInitial Speedが3500)場合に以下のように銃身の先(ソケット配置位置)と弾が表示される地点が離れてしまうことだ。恐らく弾をスポーンさせてからNiagaraが表示されるまでのわずかな間に弾が動いてしまうのだろう。

もっと弾速が遅い攻撃であれば銃身から弾が出るようにちゃんと見えるので問題ない。
弾速が速い場合には、Initial Speedを0にしてスポーンさせた後に1フレームのディレイを入れて改めてスピードを設定するようにすればOKだ。
Delayノードで0.0とすれば1フレームのディレイが可能。
