33.シューティングゲームを作る②的を一定時間ごとに生成する
このページで実装する機能↓
前回作成した移動する的を一定間隔で左右に生成させます。
https://youtu.be/B7gdwzCbHMM
Step1:プレイヤーのスタート位置を変更する
まずはプレイヤーのスタート位置を変えていきます。
PlayerStart(プレイヤースタート)のトランスフォームを大体でよいので銃の真後ろあたりに配置します。これでプレイヤーのスタート位置が変更されました。
https://scrapbox.io/files/65bff4fd93fb0d0025eee0cb.jpg
なおPlayerStartの水色の矢印がプレイヤーの向きを表しています。
https://scrapbox.io/files/65bff4ef46e67b00244174f0.jpg
Step2:的を一定間隔で生成する
では的を生成する処理を作っていくのですが、ブループリントを作る場所の候補としてはレベルブループリントとゲームモード(GameMode)のどちらかになります。簡単に紹介しておくとゲームモードはスコアやタイマーなどゲームのルールとなる処理を作りたい時に基本的に使用するブループリントになります。レベルブループリントはレベルのアクタを参照したい時やレベル全体に関わる処理などを作ります。正直今回の場合はどちらでもよいのでレベルブループリントに処理を記載していきます。後のページでゲームモードについては詳しく紹介していきます。
まずはゲーム開始1秒後にPrintStringでSTART!と表示させて、そこから自動生成を行いたいと思います。
レベルブループリントを開きます。
https://scrapbox.io/files/65bff56f13c236002427a507.jpg
以下のノードを作っていきます。BeginPlayからDelay⇒PrintStringと作成します。Delayには1,PrintStringにはSTART!と入力します。
https://scrapbox.io/files/65bff59c160196002304547d.jpg
一旦プレイしてみましょう。1秒後にSTART!と表示されます。このタイミングで的を自動生成を開始していきます。
https://scrapbox.io/files/65bff5c500a91300253592c9.jpg
では次に的を一定の時間ごとに生成していきます。生成位置はまずは左側ステージの外(アクタを配置した場所辺り)にします。
https://scrapbox.io/files/65bff5ebd9223400289ccc90.jpg
レベルブループリントを開きます。
PrintStringからSetTimerbyEventノードを作成します。Timeに1と入力しLoopingにチェックを入れます。
SetTimerbyEventノードとは?
SetTimerbyEventノードとは一定間隔の時間毎に処理を行えるノードです。Timeで間隔時間を決めてLoopingにチェックを入れると、Eventピンに繋げたカスタムイベントを一定時間毎にゲーム中繰り返し実行します。つまりSetTimerbyEventノードとは一定時間毎にEventに繋げたノードを実行するものです。
https://scrapbox.io/files/65b9d9b1ce57960024703686.jpg
SetTimerbyEventノードはゲーム開始時に一度実行すればあとは一定の時間毎に処理してくれます。例えば上のノードをプレイするとこんな感じ↓に0.5秒毎にHelloと表示されます。
https://scrapbox.io/files/65b9d9d2037c6f0025ae1176.gif
つまりSetTimerbyEventでは、指定の時間毎に何かのイベントを発動させる事ができます。今回のように一定時間毎に処理を実行したい時にはこのノードを使用したりします。
Eventからワイヤーを伸ばし、customと検索してカスタムイベントを追加します。名前を「Spawn BP_Target」とします。
https://scrapbox.io/files/65bff76a08d7750025a06a48.gif
次に「spawn actor」と検索してSpawnActorfromClass(クラスからアクタをスポーン)ノードを作成します。その後SpawnTransfomm上で右クリックして構造体ピンの分割を選択 > SpawnLocationXで右クリックして構造体ピンの分割を選択します。gifを参考にしてください↓
https://scrapbox.io/files/65bff79791a90d0024bd7dbe.gif
SpawnActorfromClassノードとは?
SpawnActorfromClassノードはアクタを生成するノードです。生成するブループリントクラスと生成するトランスフォームを設定する必要があります。今回トランスフォームはTransform型という一個のデータにまとまったものでしたが、入力するのはトランスフォームの位置だけでよかったので分割しました。
まずはこのトランスフォームの位置に的を生成していきましょう。
SpawnActorfromClassのClassに「BP_Target」のブループリントクラスをセットします。次にLocationX,Y,Zに先ほどのアクタのトランスフォームを入力します。大体で良いですが3200,1810,220と一旦しておきます。
https://scrapbox.io/files/65bffc1c91a90d0024bd9929.jpg
プレイしてみると、ゲーム開始時1秒後からアクタが一定間隔で生成されてるようになりました。
https://scrapbox.io/files/65bffc59f5e74900258d59b4.gif
作ったノード解説
https://scrapbox.io/files/65bffc831601960023046473.jpg
BeginとDelayでゲーム開始一秒後に後続のノードが実行されます。SetTimerbyEventはEventに繋げたカスタムイベントノードを一定の時間毎に実行します。1と入力したのでSpawn BP_Targetのカスタムイベントから後続のノードがゲーム中一秒毎に実行されます。SpawnActorノードでBP_Targetを指定位置に生成しています。
Step3:的を生成する場所をランダムにする
では以下のgifのように縦のY軸と、奥のZ軸をランダムになるようにして生成していきたいと思います。
https://scrapbox.io/files/65bffd5582eb660024a94e08.gif
Random Float in Rangeノードを二つ作成します。Y軸は2000,3000とします。Z軸は50,400とします。
Yが奥行きで、Zが高さです。
https://scrapbox.io/files/65bffd75ce0fce0026615328.jpg
RandomFloatinRangeノードとは?
Minの値からMaxの値の間でランダムなFloat型の小数点含む数値を作成します。つまりMin100,Max200にした場合は133.4235や、199.5555などの小数をランダムで生成します。Y軸には2000~3000の間の小数,Z軸には50~400の間の小数がランダムで出力されます。
プレイしてみます。良い感じに奥行きと高さがランダムで生成されるようになりました。
https://scrapbox.io/files/65bffe2f5932db0026374fa7.gif
では生成されいている瞬間を確認したいと思います。プレイします > プレイボタン右にあるこのボタン↓からエディタ操作に切り替える事ができます(F8でも可能)。
https://scrapbox.io/files/65bffe7c08d7750025a0a34e.gif
生成場所のランダム範囲の数値は自身で決めてもらっても構いませんし、的の移動速度なども自身で決めて貰って構いません。実際のゲーム開発では自身で調整→プレイ→調整を何度も繰り返して最適な値を決めていく事になります。
Step4:右側でも的が生成されるようにする
では、左側に的は生成はできたので右側にも的を生成しましょう。
GameModeを開きます。
Spawn BP_TargetのカスタムイベントからのワイヤーをAltを押しながらピンまたはワイヤーをクリックして、ワイヤーを切り離します。その後一旦SpawnActorとRandomFloatノードは脇においておきます。
https://scrapbox.io/files/65bfff568c093200245f59e8.gif
SpawnTargetからブランチ(Branch)ノード,RandomBoolを作成します。
https://scrapbox.io/files/65bfffc4fc779b0023860e90.jpg
RandomBoolノードとは?
RandomBoolノードとはtrue,またはfalseをランダムで出力するノードです。つまり上画像のノードでtrueまたはfalseをどちらかをランダムで出力されるので、それに応じてブランチではtrue側かfalse側どちらかに繋げたノードが実行されます。
ブランチのTrueから脇に置いていたSpawnActorノードに接続します。
https://scrapbox.io/files/65bffff306e9880024d58941.jpg
🐈:これで2分の1の確率でブランチのTrue側の「左側に的を生成する」ノードが実行されます。では右側も生成されるように組んでいきましょう。
SpawnActorとRandomノードをドラッグで範囲選択して、Ctrl+CとCtrl+Vでコピペします。ブランチのfalseからペーストした方に接続しておきます。
https://scrapbox.io/files/65c00049720f900026c13928.jpg
今度はゲーム右側となるように生成するX座標を-180にします。
https://scrapbox.io/files/65c000837cfe590024b561ab.jpg
ピン留めとなるRerouteノードをダブルクリックで作成して、ワイヤーを見やすくしておきます。
https://scrapbox.io/files/65c000c0990cf800245fe60b.gif
作ったノード解説
https://scrapbox.io/files/65c000dabd7e2300252eda1a.jpg
まずSpawn BP_Targetのカスタムイベントは一秒毎に実行されます。RandomBoolでtrueまたはfalseどちらかがランダム生成されて、ブランチに渡されます。ブランチではtrueを受け取ったらtrue側のノードが実行されて、falseを受け取ったらfalse側が実行されます。trueには左側に的をスポーンさせる処理、falseには右側に的をスポーンする処理が記載されているので、一秒ごとに左または右に的をスポーンさせるという処理ができたという事になります。
プレイしてみましょう。1秒毎にランダムで左右から的が生成されるようになりました。
https://scrapbox.io/files/65c0015964b00d00246f2083.gif
もう少し生成される間隔を短くしたいと思います。SetTimerByEventのTimeを0.5にして、0.5秒毎に左右にランダム生成させます。
https://scrapbox.io/files/65c00183dce7c700246a106f.jpg
レベルにテスト用として配置した左右の的はもういらないので両方削除します。
https://scrapbox.io/files/65c0019260347c0023b92451.jpg
⑤ノードを折りたたんで、見やすくしておく
では少しノードが広がって見にくくなってきたのでノードを折り畳んで見やすくしていきます。
BranchのTrue側のノードを選択して右クリック > ノードを折りたたむ(CollapseNodes) を選択します。名前は「Spawn BP_Target at left」とします。
https://scrapbox.io/files/65c001e2868ce5002412c34e.gif
同じようにfalse側のノードも折りたたんで「Spawn BP_Target at right」とします。
https://scrapbox.io/files/65c001f936bdda00240bc9f6.jpg
なお折り畳んだノードの中身を見るにはダブルクリックで開く事ができて、
元のイベントグラフに戻る時には上の「イベントグラフ」をクリックする事で戻れます。
《実践演習》
新規で『RightMarkerPosition』と『LeftMarkerPosition』というブループリントを作成して、生成位置を決定できるようにして、Yをマーカーのある位置の±500の値に設定し、Zをマーカーのある位置の±200の値で生成されるようにしましょう。
二つのブループリントには、billboardコンポーネントを追加します。
https://scrapbox.io/files/666e496dae410b001c3400d8.png
《答え》