35.シューティングゲームを作る④カウントダウンのタイマーを実装する
このページで実装する機能↓(完成形)
https://youtu.be/3vRjCVzHgY0
今回実装する機能は以下になります。
①カウントダウンするタイマーを実装して、20秒経過したら的の生成を終了させる。
②最後に最終スコアを表示させる。
😺では作成していきましょう!
Step1:カウントダウンするタイマーを作成する
まずは20秒のカウントダウンタイマーを作成していきます。
GameModeを開きます。ここに追加していきます。
https://scrapbox.io/files/65c024b600d26d002495cd8d.jpg
変数を作成します。名前をCountdownTimeにしてInteger型にします。コンパイルして初期値を20にします。
https://scrapbox.io/files/65c024db86e94a0025a68bcf.jpg
この変数はカウントダウンの秒数(20秒)として使用します。
同じくレベルブループリントに以下のTickノードを追加していきます。イベントTickからDelayノードを作成しDelayには1と入力します。さらに「--」と検索すると出てくるDecrementIntノードを作成します。最後にPrintStringノードを追加します。
https://scrapbox.io/files/65c02594d2c2a60026d03ab6.jpg
一旦ここまで作成しましょう。解説は後で行います。
一旦プレイしてみてどうなるか試してみましょう。
https://scrapbox.io/files/65c025baf5e74900258e244c.gif
作成したノード解説
https://scrapbox.io/files/65c0265d7cfe590024b61f9d.jpg
まずTickノードは毎フレーム実行するイベントノードです。その後にDelayノードで指定時間遅らせています。この場合どうなるのかというとDelayノードは指定の時間遅らせている間再度実行されないという仕様になっています。なのでTickノードでDelayノードは毎フレームは実行されずに、1秒毎にDelayから後続のノードが実行される訳です。DecrementIntノードは整数データを-1してセットするノードです。なので結果的に一秒毎にCountdownTimeを-1してテキスト表示するという機能になるという事です。
🐱なおカウントダウンの実装方法は色々ありますが、今回は簡単に実装できる方法で作りました。では次に現在の状態だとカウントダウンは0秒を越して「-1」「-2」と表示されてしまうので、0秒になったらカウントダウンを終了させましょう。
一旦PrintStringは削除しておきます。
https://scrapbox.io/files/65c02701c3b40e0024c133d7.gif
DecrementIntノードからブランチノードを作り、そこから「>」と検索してGreater(より大きい)ノードを作成します。下に0と入力します。
https://scrapbox.io/files/65c0271e5932db0026382623.jpg
ブランチのTrue側にPrintStringを作成して、詳細設定を開いてTextColorを赤にしておきます。GetでCountdownTimeを追加してInStringに接続します。
https://scrapbox.io/files/65c0276f5932db0026382a87.jpg
ブランチのFalse側にはDoOnceノードを作成し、PrintStringを追加します。「FINISH!」と記載します。
https://scrapbox.io/files/65c027a3f5e74900258e3e62.jpg
DoOnceノードとは?
DoOnceノードは後続のノードをゲーム中に一度しか実行させないノードです。「FINISH!」と記載したPrintStringはDoOnceノードによって一度しか実行されなくなります。
これでタイマーとなるノードは完成しました!
https://scrapbox.io/files/65c027e7b55268002544f9b6.jpg
プレイしてみてタイマーを確認してみます。
タイマーが0になったらFINISHと表示されるようになりました
https://scrapbox.io/files/65c02800b9f33f00251b51a5.gif
作ったノード解説
https://scrapbox.io/files/65c0283fbd7e2300252f995c.jpg
まず一秒ごとに秒数となるCountdownTimeを1減らしています。デフォルト値は20なので二十秒間は秒数をテキスト表示します。CountdownTimeが0以下になったら秒数表示ではなく、FINISHとテキスト表示します。
ではタイマー終了時に的の生成が止まるようにしましょう。
Step2:タイマー終了時に的の生成を停止する
ではカウントダウンのタイマー終了時になったら的の生成を停止します。
GameModeを開きます。
Boolean型のFinishSpawnBP_Targetという変数を作成します。デフォルト値はそのまま(false)で良いです。
https://scrapbox.io/files/65c02a3e82ecbb0025df5fc0.jpg
ではTickノードから繋がるDecrementIntノードとブランチノードを一度Alt+クリックで切断し、後続のノードは脇に置いておきます。
DecrementIntノードからブランチを作成して「>」と検索してより大きい(Greater)ノードを追加します。より大きい(Greater)ノードの下には5と入力して、ブランチのfalseからはFinishSpawnBP_Targetをtrueにします。
https://scrapbox.io/files/65c02a8680ae9f00246b9952.jpg
ノード解説
これでCountdownTimeが5秒以下になった場合にFinishSpawnBP_Targetをtrueにします。このノードは的の生成終了のタイミングを取るために作成しました。
続いて先ほど切り離したブランチノードへ、ワイヤーを繋げます。
https://scrapbox.io/files/65c02ad6868ce5002413c659.jpg
全体図です↓
https://scrapbox.io/files/65c02aff4ba3e600246ae310.jpg
CountdownTimeをGetで追加して接続します。
https://scrapbox.io/files/65c02b2151c87900254453be.jpg
これでイベントTickから繋がるノードは完成です。5秒の時点で的の生成終了のタイミングをとることができました。
https://scrapbox.io/files/65c02b5564b00d00247015ae.jpg
続いて同じくGameModeのBeginPlayから編集していきます。
https://scrapbox.io/files/65c02bfafdbfd90024ab55cb.jpg
SpawnBP_Targetとブランチの間に、もう一つブランチを追加します。GetのFinishSpawnBP_Targetを追加します。ブランチのfalseから後続のブランチへ繋ぎます。
https://scrapbox.io/files/65c02c1f00d26d0024962fe3.jpg
ノード解説
イベントTick側でCountdownTimeが5以下になった時にFinishSpawnBP_Targetはtrueとなります。そしてSpawn BP_Targetは0.5秒毎に実行されるノードですがFinishSpawnBP_Targetはtrueの場合は後続の的を生成するというノードが実行されなくなります。
これで5秒以下になった時に的の生成を終了させるノードが作れました。
プレイして試してみましょう。タイマーが5秒になった時に的の生成が停止して、0秒になった時には的はステージ上から無くなるようになりました。
https://scrapbox.io/files/65c03167b55268002545a21b.gif
ノードの解説
https://scrapbox.io/files/65c0317413c2360024294210.jpg
CountdownTimeが5以下、つまり5秒以下になったらFinishSpawnBP_Targetをtrueにしています。SpawnBP_Targetのカスタムイベントは0.5秒毎に実行されますが、FinishSpawnBP_Targetがfalseである場合にのみ的の生成をし続けます。つまりFinishSpawnBP_Targetがtrueになったら的の生成は終了させます。
③最終スコアを表示させる
では、続いて最終スコアを表示させましょう。
同じくレベルブループリントのイベントtick最後のFINISH!と記載したPrintStringノードから作成していきます。
https://scrapbox.io/files/65c031f0bd7e230025304deb.jpg
PrintStringノードから以下のノードを作成します。CastToBP_FirstPersonCharacterノードとGetPlayerCharacterノードを作成します。As~ピンから「Get TargetHitScore」と検索して追加します。
https://scrapbox.io/files/65c0321213c2360024294c5f.jpg
CastToBP_FirstPersonCharacterノードからPrintStringノードを追加します。最終スコアを長めに表示させるために、PrintStringnのDuration(表示時間)は100にしておきます。InStringからAppedノードを追加して、Aに「最終スコア:」と記載します。BにTargetHitScoreから接続します。
https://scrapbox.io/files/65c0327100d26d002496c3c1.jpg
プレイしてみるとタイマーのカウントが0になったら「FINISH!」「最終スコア:的に当てた回数×10の数値」と表示されるようになりました。
https://scrapbox.io/files/65c03376720f900026c2ef9a.gif
もう少し的を増やしても良い感じがするので、レベルブループリントのSetTimebyEventのTimeを0.4にして的の生成間隔を0.4秒にします。ここはお好きにどうぞ。
https://scrapbox.io/files/65c03464cbe3200025cc28c3.jpg
ノードが長くなったので折り畳んでおきます。Tickノードから後続ノード全てを選択します。
https://scrapbox.io/files/65c03393c027f600258bf99b.jpg
選択したノードの上で右クリック > ノードを折りたたむ(Collapse)を選択します。名前をCountdownTimerにしておきます。
https://scrapbox.io/files/65c033af06e9880024d74d1f.jpg
Cキーでコメントを追加します。「カウントダウンと最終スコアの表示」と記載しておきます。
https://scrapbox.io/files/65c033beb4810800241e93a1.jpg
SetTimerbyEventからのノードをコメントで「一定時間毎に的を生成」と記載します。
https://scrapbox.io/files/65c034b098d8540025f4a410.jpg
同じくBeginPlayの方もコメントで「準備時間」と記載します。
https://scrapbox.io/files/65c034d97cfe590024b73053.jpg
④敷居を作成してジャンプできなくする
既存の壁をAltキーを押しながら移動させて複製します。
https://scrapbox.io/files/65c035118c093200246119e6.gif
トランスフォームの位置は大体「0,1400,-300」の位置にしました。
https://scrapbox.io/files/65c03530f5e74900258f3b41.jpg
次にジャンプの処理をできないようにします。FirstPerson > Blueprints > BP_FirstPersonCharacterを開きます。
https://scrapbox.io/files/65c035527cfe590024b73b00.jpg
Jumpと書かれたノードを見つけてAltキー押しながらピンをクリックで接続解除します。
https://scrapbox.io/files/65c035a5f0fc4e0024e2f88c.jpg
これで敷居ができて、ジャンプができなくなり近づきすぎる事がなくなりました。
https://scrapbox.io/files/65c035c0d2c2a60026d16a2b.gif
《実践演習》
FirstPersonCharacterクラスに『ControlActive』というBoolean型の変数を作成(Defalut値はTrue)し、
ゲームが終了したら、ControlActiveをFalseにして、弾丸を発射できなくするように制御しましょう。
ヒント:弾丸の発射は、BP_Weapon_Componentで制御しています。
※WeaponComponentですが、バージョン5.1以上から実装されたようです。5.0以下の方はRifleのほうを編集してください。
Step6:ゲームの完成🎉🎉
これでシューティングゲームが完成しました。
しかし、これだけだと味気ないですよね。
せっかくなので、ゲーム性を向上させるために、ゲームを改良しましょう!
《実践演習①》
✅アセットを使って、環境を変える。(草原や西部劇の荒野などにする)
マーケットプレイスから、的あてゲームとマッチしたアセットをインポートしてきましょう。
ヒント:もしもY方向にターゲットが流れてほしいなら、BP_TargetのXにつながっている箇所をすべてYにつなぎなおしましょう。
《実践演習②》
✅残弾数とリロードシステムを追加しましょう。
Rキーでリロードをできるようにします。
テキストで『リロード中…』と表示
BP_WeaponComponent (プレイヤーキャラクタークラス)に処理を追加します。
使用する変数
現在の弾数: CurrentAmmo
最大弾数: MaxAmmo
リロード中フラグ: IsReloading
《実践演習③》
・ターゲットの種類を増やし、種類によって点数や色、移動速度を変動させましょう。
ターゲットの取得ポイント数
ターゲットの色(赤、青、緑、黄)
ターゲットの移動速度
↓こちらが要素を追加した世界の景観です。
https://scrapbox.io/files/66778fb9b298a0001d874b37.png
《実践演習:リロードシステムの答え》
https://blueprintue.com/blueprint/-mz017cw/
《実践演習:ターゲットの種類を増やす》
https://blueprintue.com/blueprint/4-ugwx-5/