🔫

テンプレ通りのゲーム制作 FPS②連射とリロード

2024/10/21に公開

プレイヤーのブループリントを見てみる

前回の続きからやっていこうかと思います。今回はプレイヤーの性能についていろいろと修正していきたいと思います。前回の記事は以下の通りです。

https://zenn.dev/yukumoto/articles/1770e03cca0c18

前回冒頭で弾のクラスブループリントである「BP_FirstPersonProjectile」のスピードを変えたり、ライフスパンを変更したりしました。まだプレイヤーのブループリントの内容やその他の項目については触れていませんので修正していきます。

プレイヤーのBPをみてみる

FPSテンプレートのプレイヤーのブループリントを見てみます。下記の場所のクラスブループリントをダブルクリックしてBPエディタを立ち上げます。

コンテンツ/Firstperson/Blueprints/BP_FirstPerson

エディタが開いたら「ビューポート」タグを押してみましょう。このテンプレートのプレイヤーの外観が見られます。カメラに手だけ生えてて異形ですね…。でもFPSはこれだけのパーツで十分なのです。

FPSテンプレートのプレイヤーの見た目

カメラから見ると手しか見えませんが、この手が銃を構えます。カメラの前にワイヤーフレームのカプセル状のものがありますがこれが自分の当たり判定です。さらに水色の矢印はプレイヤーの前方向を表します。

さてここからプレイヤーを作りこんでいきます。FPSテンプレートでは毎回目の前にある銃を取りに行かないといけないので今回はこれをあらかじめ入手しておきましょう。コンポーネントツールの一番ルート(根本)であるBP_FirstPersonCharacterをクリックしておきます。

追加ボタンを押して「BP_」と入力して候補に現れる「BP_Weapon_Component」を追加します。これは銃のクラスブループリントですが、あらかじめ取り込んでおくことで銃を入手済みにしておけます。

銃のクラスブループリントをコンポーネントとして取り込む



最初から銃を持ってる状態にできます

これで最初から銃を持っている状態になりました。

マシンガンをぶっ放す

いまはマウス左クリックやゲームパッド右ボタンで弾を発射しますが単発です。これをフルオートにしてみます。下記の階層の「IMC_Weapons」という入力マッピングコンテキストをダブルクリックして開きます。これは入力を受け付けるキーを割付を行うファイルです。

開いたらマウスの左ボタンに関する項目に注目します。「Triggers」という項目の+ボタンを押して追加し、インデックスに「パルス」を選びます。

さらにインデックスを左の三角矢印をクリックして開き、中の項目の「Interval」を0.1にします。勘のいい方ならお気づきでしょうが、これが弾の発射間隔になります。設定出来たら再生してみましょう。


フルオートで撃てる!

ちなみにIntervalの下の「Trigger Limit」というところを3にすると、いわゆる3点バーストで3発ずつ打つことができます。パルスの設定をゲームパッドの方にも設定しておきましょう。

弾数制限を付ける

フルオートになったのは良いのですが、実際のFPSのように1マガジンの弾数制限を付けてみましょう。まずは発射のメカニズムを担っているブループリントを探してダブルクリックして開きます。
コンテンツ/Firstperson/Blueprints/BP_Weapon_Component

開いたら左のマイブループリントパネルで「EnhancedInputActionIS_Shoot」をダブルクリックして入力イベントをフォーカスします。このノードが射撃に関する入力があった際のイベントです。


入力イベントの下段にたくさん射撃に関するノードがありますが、とりあえず詳細はさておき右にブループリントを追加する準備をします。カスタムイベントを作りますが入力イベントの下で右クリックして「custome」と入力してAddCustomNode...(カスタムイベントを追加)を選びます。


CustomNodeはプログラマが任意に設定し呼び出せるイベントです。名前を「Shot」にしておき、先ほどの入力イベントから呼び出すようにします。下の図を参考にしてください。なぜこのようにするかというと右にこれからノードを追加していくからです。

Shotカスタムイベントを呼び出すノードを右に寄せて入力イベントとの間にBranchノードを追加します。入力イベントの実行ピンからワイヤを伸ばし、「Branch」と入力して間に入れます。

左のマイブループリントパネルで「変数」の項目の右の+ボタンを押します。「変数」とはデータの入れ物です。今回は発射した弾の数を記憶させておく変数を用意します。名前を「NumOfShot」プルダウンで選べる変数の種類を「Integer」にします。Integerをは小数点以下のつかない「整数値」を意味します。弾の数は1発2発…と数えるので小数点は要りませんね。

変数を作ったらすぐに上部コンパイルボタンを押します。右下の変数の初期値にゼロを入れておきましょう。

作った変数の名前の部分をBranchの左下あたりにドラッグし、「Get NumOfShot」を選びます。変数の中身を取得するGetノードが出来ます。

Getノードが出来たら右にワイヤを伸ばし「<」キーを押し「<」ノードを作ってBranchノードにつなぎます。>=ノードの下段は30にしてマガジンの装弾数を30発にします。

右側のShotカスタムイベントを呼び出すノードの右からワイヤを伸ばし、「++」と入力してインクリメント「1加算」ノードを作ります。左下に先ほどと同じ要領でNumOfShot変数のゲットノードをつなぎます。

できあがったら撃ってみましょう。トリガーを引きっぱなしだと30発撃った後に射撃できなくなると思います。これで残弾数の概念が作れました。ただ、トリガーを離してもう一度押しても発射できなくなりました。これでは困るのでリロードの仕組みが必要です。これは次のところで扱います。

30発撃ったら撃てなくなる

リロードする仕組みを作る

現状では30発撃ったら撃てなくなります。この状態は弾切れという事にしておいてでは再装填するには操作が必要になるようにアクションを加えましょう。コンテンツブラウザ内で下記の階層を開いてください。

コンテンツ/FirstPerson/Input/Actions/

インプットアクションが保管されている階層

この階層はインプットアクションと呼ばれるデバイスによる入力を管理するファイルが置いてあります。弾を撃つ際に使用した「IA_Shoot」もありますね。これに追加して「IA_Reload」を作ります。フォルダ内の空いているところをクリックし入力/入力アクションを作り、「IA_Reload」と名前を付けます。ダブルクリックして開きます。


リロードはマウスの中ボタン、ゲームパッドのYボタンに割り付ける予定ですが、ここではValue Typeが「Digital(bool)」になっているのを確認します。保存して閉じます。

バリュー(入力値)タイプがDigital入力なのを確認

次に1階層上にあがって下記の階層を開きます。
コンテンツ/FirstPerson/Input/

「IMC_Weapons」をダブルクリックします。ファイルが開いたら「Mappings」の横の+ボタンを押し、IA_Reloadをプルダウンを開いて選びます。

選んだあと、リロードが出来るキーやボタンを割り振ります。今回はマウス中ボタンとゲームパッドYボタンを割付けました。

さて、今度はこの入力アクションを呼ぶ必要があります。さきほどのBP_Weapon_Componentを開きます。空いているところを右クリックして「IA_Reload」の入力イベントを作ります。その右にNumOfShot変数をドラッグしてSet ノードをつくり0を入力します。これでリロードが出来るようになります。


さらにリロード音を付けてみましょう。UnrealEngineで利用できる音声形式はWavファイルです。リロード音に適した音を用意して、フォルダを作りドラッグアンドドロップしてインポートします。インポートしたファイルを右クリックしてCueファイルを作っておきます。

先ほどの発射弾数を0に戻すSetノードの右側に「PlaySound2D」というノードを追加して、リロード音のキューを選びます。PlaySound2Dは音の発生場所を考慮せずに鳴らすノードで、今回はこちらを使っています。これでOKかと思いきや…音が何回も再生されていることに気が付きます。これを改善するには入力アクションのノードを開いて画像のように「Triggered」から「Complete」へCTRLを押しながらピンをドラッグしてワイヤを付け替えます。

CTRLドラッグですでに張られているワイヤを付け替えられる
これでボタンを押して離した1回だけ入力アクションが実行されます。

連射とリロードの仕組みが出来ました。変数の作成や条件を付けるBranchノード、入力アクションについて勉強してきました。次はさらにプレイヤーを作りこんでいきます。

Discussion