本記事は「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になったら消滅させる」
を実装してみたいと思うよ!
下のボタンから次のページに進めるよから
よかったら見ていってね!
コメント