PR

【UE5】「Fab版」射撃システムを作ってみようその3:銃を撃ってみよう!【TPSゲーム制作】

UnrealEngine5

本記事は「UE5_Ver5.3.2」で制作しているよ

【注意】エフェクトにて不具合「マズルフラッシュの位置ズレ」が起きているよ
    本記事を閲覧する際はそれを了承のもと制作していってね

こんにちは!ウンパッパです!

今回は「TPSシューター」を作ってみよう第3回
「銃を撃つ」を作っていくよ!

もし前回の記事を見ていないなら、ぜひ見て行ってね

制作する前に、この記事で最終的に何が出来上がるのかを見てみよう!

「銃を撃つアニメーション」から「マズルエフェクト」、「銃撃SE」までできているね

「弾丸は?」って思うかもしれないけど
それを作るまでもう1記事分解説しなきゃいけないので、それは次回に置いてお置くよ

それでは早速「銃を撃つ」、作っていこう!

正しく「ボタン入力」を設定しよう

まずは「射撃」の「ボタン入力」を設定したいと思うよ

前回「ダッシュ」を実装したときに「Shiftボタンの入力ノード」を作ったと思うんだけど
じつはこれ「簡易型の入力ノード」で「正式な入力ノードじゃないんだ」

2つの「ノード」の違いとしては 「複雑な入力」に対応できるかどうか

アクションゲームを作るなら「複雑な入力」はとても重要な要素なので
是非とも覚えて行ってみよう!

まずは
「コンテンツブラウザ」⇒「Third Person」⇒「Input」を見つけてね

この「Input」フォルダが入力システムを取り扱っているんだ

見つけたら「Inputフォルダ」を「コンテンツフォルダ」に「移動」させるよ

こうなったらOK

まずは「コンテンツ」⇒「Input」を開いてね

「IMC_Default」という「入力コンテキスト」が確認できるね

確認出来たら次に「Action」のフォルダを開いてね

そしたら「IA_Jump」や「IA_Move」などの「入力アクション」が出てくると思うんだけど

これは「入力した結果できるアクション」を定義した「データアセット」なんだ

【軽く解説】

この「Inputフォルダ」内で行われている「Enhanced Inputシステム」というのは
ザックリ言えば 「入力アクション」でそのアクションを定義して
「入力コンテキスト」で定義したアクションに「ボタンを割り振る」
というシステムだよ

ずは「アクション(結果)」から考えてるシステムなので

「このアクションは、この「キー入力」と「コントローラのボタン」でできる!」
=「そのアクションのシステム」に複数の「入力ノード」を割り当てなくていい

「このアクションは、「この状況になったとき」にボタンを入力するとできる!」
=そのアクションを行いためにたくさん「状況であるかどうか?」を判別させなくていい

などの「どんどん増えてく複雑なアクション」の「一覧」に「入力」を配置するとき
とてシンプルに分かりやすく「入力」を「アクション」に割り当てることができるんだ

今回は「ダッシュ」と「射撃」の「入力アクション」を作るよ

まずは「右クリック」で「入力」⇒「入力アクション」をクリック

できた「入力アクション」を命名しよう

2つ作って
「ダッシュ」を「IA_Run」
「射撃」を「IA_Fire」
と命名

これで「入力アクション」はOK

次にこの「入力アクション」を「入力コンテキスト」に差し込んでいくよ

「コンテンツ」⇒「Input」にある「IMC_Default」をクリックして開く
開いたら「Mapping」⇒にある「+」を押してデータを追加

追加できたデータにさっき作った「IA_Run」を割り当てて
「入力」を「Shiftキー」にする

これで「走る」の入力はOK

同じようにデータを作って「IA_Fire」を割り当てて
「左クリック」をくっつければ 「射撃」もOK

これで入力の設定は完了だ!

準備ができたので早速「ダッシュ」の入力を差し替えて行こう

まずは「BP_PC」を開いて 「イベントグラフ」にて「右クリック」⇒「IA_ 」と検索し
「IA_Run」をクリック

出てきた「入力ノード」にこんな感じにノードをつなげて
「コンパイル」すればOK

準備ができたら「プレイ」をしてみよう

うん、しっかり走れてるね!

これで入力の差し替えはOKだ!

射撃時「射撃アニメーション」をする

まずは射撃アニメーションを用意しよう

「コンテンツブラウザ」から「MM_Rifle_Fire」を検索

「MM_Rifle_Fire」を 「右クリック」⇒「Create」⇒「Create AnimMontage」を選択

「MM_Rifle_Fire_Montage」という名前のデータがあればOKだ

その後「BP_PC」を開いて

「イベントグラフ」にてこんな感じにノードを組む

組んだら「コンポーネント」の「Mesh」をイベントグラフに「ドラッグ&ドロップ」して
でてきた「Meshノード」を「PlayMontage」につなげる

その後
「Play Montageノード」の「Montage to Play」にて

さっき作った「MM_Rifle_Fire_Montage」を当てはめる

出来たら「コンパイル」して「プレイ」だ

左クリックを押すたびに銃を肩に押さえるね
これで「射撃モーション」の実装はOKだ!

でも、歩きながら銃を撃つと下半身の挙動が変だし、

連続でガタガタしないし迫力もない
そんな感じで色々と物足りないから、順番に1個ずつ修正していこう

「射撃時」の「歩行アニメーション」を修正する

方法としては「射撃アニメーション」と「移動アニメーション」を
「上半身」と「下半身」で動きを混ぜて一つのアニメーションにする方法だよ

それでは早速やってみよう!

まずは「ABP_PC」⇒「マイブループリント」⇒「Anim Graph」にて

「MainStatesノード」を切断して「ピン」からノードを引っ張り「save」と検索

出てきた「New Save cached pose」を選択しよう

出てきたノードの名前を「Maine States」にするよ

次にこんな感じにノードを組もう

その後「Layered blend per bone」を選択し

別々のアニメを動かす境目である「ボーン」を設定しよう

今回の境目は「spine_03」にするよ

ちなみに「spaine_03」の場所はここ

「SK_Mannequin」から確認できるよ

最後に「Layered blend per bone」の「MeshSpace Rotation Blend」をチェック

これで設定OKだ!

「コンパイル」して「プレイ」してみよう!

歩きながら銃を撃っても足をぴくぴくさせなくなったね

これでOKだ!

マズルフラッシュのエフェクトを出す

まず、どこから弾丸が出てくるのかを確認しよう

「コンテンツ」⇒「Send_Asset」⇒「Rifle」⇒「Mesh」内にある

「SK_Rifle」をダブルクリック

画面が開いたら
画面右側にある「スケルトンツリー」にて「Muzzle」を選択してね

プレビューでは銃口が「Muzzle」になっているね

ここが弾丸が出てくる場所になるよ

なので、銃口を設定するためにこの「Muzzle」の名前を覚えておこう

次に

「BP_CP」にてこんな感じにノードを組んでね

ちなみに「エフェクト」の「スケール」等細かくいじってるからノードの数字をよく見てね

組み終わったら「Spawn Emitter at Location」の「Emitter Template」にて

「Muzzle」と検索して一番上のエフェクトを選んでね

出来たら「コンパイル」してプレイしてみよう

うん、エフェクトが出てる

いい感じだね!

でも音がないと寂しいから次は「SE」を割り当てに行こう!

エフェクトの不具合について

今現在、
エフェクトを生成しながら移動すると「エフェクトの位置が変化する不具合」が発生しているよ

修正する予定なので終わるまで待っててね

射撃SEを出す

まず、射撃音をランダムで出すための「サウンドキュー」をつくろう

まず「コンテンツ」⇒「Send_Asset」⇒「Rifle」⇒「Sounds」にて

「右クリック」⇒「オーディオ」⇒「サウンドキュー」をクリックしてね

出来た「サウンドキュー」の名前を「SC_Rifle_Fire」としよう

名前を付けたら開いて

「コンテンツブラウザ」で
「Weapons_Rifle_Punch-Distant」と「Weapons_Rifle_Noise-Exterior-Distant」
検索して

ぽいぽいと「サウンドキュー」の「グラフエディタ」に放り込んでね

「Weapons_Rifle_Punch-Distant」と
「Weapons_Rifle_Noise-Exterior-Distant」は

6個ずつあればOKだ

あとはこんな感じにノードを組んでね

できたら試しに音を再生してみてね

画面上側にある
「キューを再生」で音が聞けるよ

鳴らしてみるとこんな感じ

うん!いいかんじだね!

ではこれを「BP_PC」に組み込んで銃を撃つと鳴るようにしよう

まずは「BP_CP」をひらいて「イベントグラフ」にてこんな感じにノードを組んでね

組み終わったら「コンパイル」して「プレイ」してみよう!

※ちなみに音量には気を付けてね

うるせぇ!

発射間隔が短すぎて音が重なって大きく聞こえる

これじゃあ銃撃音ではなく爆竹の音だ
とてもよろしくない

というわけで「発射間隔」を実装して一定間隔で銃を撃てるようにしよう

「発射間隔」を実装する

まずは「BP_PC」の「ブループリント」にて「カスタムイベント ノード」を作ろう

「右クリック」⇒「Custom Event」と検索すれば出てくるぞ
(ちなみにカタカナの「カスタム」でも出てくるよ)

できたカスタムイベントを「Fire」と改名しよう

そしたらこんな感じに組んでね

次に「IA_Fire」に
「Set Timer by Function」と「Clear and Invalidate Timer Handle」
を作ってくっつけよう

「Set Timer by Function」及び「Set Timer by ○○○○シリーズ」
入力された「カスタムイベント」もしくは「関数」を
入力された間隔で起動してくれる機能だよ

機能自体は「Timer Handle変数」で管理されていて
「変数」に「入力」が入ると起動

「Clear and Invalidate Timer Handle」で「変数」の状態を初期化させると
機能が停止するんだ

主に「システムをループ」させたいときに使えるよ!

「Set Timer by Function」の「Function Name」を「Fire」と記入

「Time」を「0.1」にしよう この「0.1」が「発射間隔」になるよ

これで「Set Timer by Function」が
「Fireのカスタムイベント」を「0.1秒の間隔」で起動するようになったよ

最後に「Timer Handle変数」を作ろう

「Set Timer by Function」の「Return Value」を「右クリック」して「変数へ昇格」

最後に、画面左側に「変数」⇒「Fire Timer Handle」が出ているので

「ドラッグ&ドロップ」⇒「Get」で「Get Fire Timer Handleノード」を生成し

「Clear and Invalidate Timer Handle」の「Handleピン」につなげよう

これでノードの組み立てOKだ

では「コンパイル」して「プレイしてみよう!」

うん、ちゃんと一定間隔で射撃できてる!
とても銃らしくなったね!

あとは「弾丸」さえ飛び出てくれれば完璧だ!

とてもワクワクしてくるね!

次回!作ってみようその4:弾丸を発射してみよう!

以上、
射撃システムを作ってみようその3:銃を撃ってみよう!
でした!

ここまで読んでくれてありがとね!
次回は「弾丸を発射して、当たった的のHPが0になったら消滅させる」
を実装してみたいと思うよ!

下のボタンから次のページに進めるよから

よかったら見ていってね!

コメント

unpappa

3Dとゲーム制作を趣味でたしなむ遊び人
ロボットアニメとアニメ調のキャラが好きで趣味でちょこちょこ作ります
人生の目標は「オリジナルのロボゲー」を1本作る事!
初心者だからこそ、いろいろな荒波がやってくるけど、それらを学びに変えて
「最もわかりやすいクリエイティブブログ」を目指してます!どうぞ良しなに!

unpappaをフォローする
Ci-enを始めました!あなたの応援で本サイトの記事の投稿頻度と質を向上させることができます!
詳しく見る!
Ci-enを始めました!あなたの応援で本サイトの記事の投稿頻度と質を向上させることができます!
詳しく見る!
タイトルとURLをコピーしました