34.シューティングゲームを作る③スコアと破壊を実装する
このページで実装する機能↓
的に弾が当たると爆発エフェクトが再生されて消えます。また同時にPrintStringでスコアを表示させます。
https://youtu.be/JoBE8EHR4eE
Step1:的の破壊を実装する
では、的は発射した弾が当たった時点で破壊されるようにしたいと思います。
的のブループリントクラス「BP_Target」を開きます。
https://scrapbox.io/files/65c00601dce7c700246a2583.jpg
では既存のブループリントの下あたりにイベントHit(Event Hit)ノードを追加します。
https://scrapbox.io/files/65c0063336bdda00240bd2f3.jpg
イベントHitノードとは?
イベントHitノードとは他のアクタがこのアクタに衝突した時に、後続のノードを実行するものです。
https://scrapbox.io/files/65c0066791a90d0024bdb871.jpg
例えば上のノードの場合、他のアクタと衝突した瞬間にHelloとテキスト表示されます。下のgifのようにキューブのブループリントクラスに上のノードを実装した場合、他のアクタ(プレイヤーなど)が触れた瞬間にノードが実行されてテキストが表示されます。
https://scrapbox.io/files/65c00689a804600025c30e99.gif
では次にCastTo~というノードを作っていくのですが、発射する弾の名称を知っておく必要があります。なのでその対象のブループリントクラス名を調べます。FirstPerson > BP_FirstpersonProjectileという名前を確認しておきます。
https://scrapbox.io/files/65c006e7cbe3200025ca86ec.jpg
BP_Targetのイベントグラフに戻ります。CastTo BP_FirstPersonProjectileノードとDestroyActorノードを作成します。イベントHitのOtherからCastToノードのobjectにワイヤーを繋げておきます。
https://scrapbox.io/files/65c0071215b1ad00293ffaf6.jpg
Cast To BP_FirstPersonCharacterでは無く、Cast To BP_FirstPersonProjectileというノードであるという事に注意です。
CastToBP_FirstPersonProjectileノードとは?
このCastTo~ノードはObjectピンに入力されたオブジェクトと、指定のブループリントクラスが一致する場合、そのまま後続ノードを実行するノードです。なので今回の場合CastToの後の名前が「BP_FirstPersonProjectile」となっているので以下のブループリントクラス、銃の弾を示している訳になります。
作ったノードを解説
https://scrapbox.io/files/65c007bf730e1b0025974e14.jpg
①イベントHitでは的が他のアクタに衝突した瞬間に後続のノードが実行されます。
②そしてOtherピンからは衝突した他のアクタの参照データが出力されます。それをCastToのObjectピンに接続した事でCastToノードでは「衝突したアクタ = BP_FirstPersonProjectile」だった場合に後続のノードを実行するといった処理になります。
③処理を継続しされた場合は的を削除されます。
といった流れになります。
🐱まとめると、「的に衝突したアクタ = 弾のブループリントクラス」だった場合に的を削除するというノードができた訳になります。
試しにプレイしてみましょう。弾を当てると的は削除されます。
https://scrapbox.io/files/65c00f4a3318b700257ec791.gif
イベントHitノードではこのように、他のアクタと衝突した時に実行されるイベントノードになっています。またCastToノードと組み合わせる事で対象のブループリントクラスと衝突した時にのみ実行されるノードを作る事ができます。
Step2:的の爆発エフェクトと効果音を実装する
では今度は的が消えるタイミングで爆発エフェクトと効果音を追加していきましょう。
なおスターターコンテンツのアセットを使用していきます。コンテンツブラウザにStaterContentというフォルダが無い方はこちらからダウンロードしておきましょう。
https://scrapbox.io/files/65c00f9877bbf5002436cff7.jpg
パーティクルについて
今回使用するこういった↓爆発などのエフェクトの事をUnrealEngineにおいてパーティクルというのですが、今回はわかりやすくエフェクトと呼んでいきます。
https://scrapbox.io/files/65c00fb400a913002535e530.gif
使用するエフェクトと効果音のアセットについて
使用するアセットを紹介しておきます。
今回使用するのはStaterContents > Particles > P_Explosion。
https://scrapbox.io/files/65c00ff077bbf5002436d167.jpg
StaterContents > Audio > Explosion01というアセットを使用していきます。
https://scrapbox.io/files/65c0100f868ce5002412f24a.jpg
BP_Targetのイベントグラフを開いてイベントHitからノードを編集していきます。
一旦、Alt+ワイヤーをクリックでDestoryノードへのワイヤーを切り離します。
https://scrapbox.io/files/65c0109578c0bd002451756d.jpg
CastToノードからPlaySound2DとSpawnEmitteratLocationを接続します。さらにGetActorLocationノードを接続します。
https://scrapbox.io/files/65c010afb5526800254456e6.jpg
PlaySound2DのSoundにはExplosion01を、SpawnEmitteratLocationにはP_Explosionを選択します。
https://scrapbox.io/files/65c010fbba4bfb00231787db.jpg
PlaySound2Dノードとは?
指定の音を鳴らすノードです。
SpawnEmitteratLocationノードとは?
SpawnEmitteratLocationノードとはエフェクト(パーティクル)を指定の場所で再生するノードです。今回爆発のエフェクトをこのノードによって再生させます。
最後に切り離したDestroyノードを接続します。
https://scrapbox.io/files/65c0118c06e9880024d5d7a2.jpg
ノードの解説
https://scrapbox.io/files/65c011a3f5e74900258d9f48.jpg
①イベントHitで他アクタが触れた時にノードが実行
CastToBP_FirstPersonProjectileノードでは、触れたアクタが銃の弾(名前:BP_FirstPersonProjectile)ならノードの実行を継続。もし異なるアクタなら処理を中断。
②爆発音再生
③爆発エフェクト再生(GetActorLocationでどこの位置に表示するか決める)
④自身(的)を削除
プレイしてみて試してみましょう。弾が触れたら爆発音と爆発エフェクトが再生されてそして的は削除されるようになりました。
https://scrapbox.io/files/65c01241b9f33f00251acacb.gif
🐱なおPlaySound2Dノードではどこにプレイヤーがいても音の変化は無く、常に一定の音量で左右から対称に音が聞こえます(これを2Dサウンドと言います)。例えばプレイヤーから見て右方面で音がしたら右のイヤホンから聞こえるようにするといった事(3Dサウンド)を実装したい場合はPlaySoundatLocationノードと、音に減衰という設定を行う必要があります。
ではBP_Targetのノードを折り畳んで見やすくしておきましょう。CastToBP_FirstProjectileノードから後続のノードを範囲選択して右クリック > ノードを折りたたむ(Collapse)を選択します。
https://scrapbox.io/files/65c0126806e9880024d5da96.gif
名前を「Explosion And Destory」にします。
https://scrapbox.io/files/65c013dec027f600258a9a54.jpg
🐱ちなみに折りたたむ時にイベントHitノードなども一緒に折りたたむと何がきっかけで実行されるノードかわかりにくくなってしまうので、イベントノードは折り畳みに含めない事をおすすめします。
Step3:BGMの追加と音量の調整
次に簡単にBGMと音量の調整を行ってきます。
StaterContent > Audio > Stater_Wind06をドラッグでレベルに設置します。場所は関係ないのでどこでも良いです。
https://scrapbox.io/files/65c01782c027f600258aac6b.jpg
追加したStater_Wind06のアセットをダブルクリックで開いてサウンドのVolumeを0.3にしておきます。音量なので自身で調整してもらって構いません。調整したらプレイしてみて確認してみましょう。
https://scrapbox.io/files/65c017abce0fce002661bfcc.jpg
次に爆発音ですが、StaterContent > Audio > exploExplosion01があるのでダブルクリックで開いてVolumeを0.4にしておきます。
https://scrapbox.io/files/65c0166cf0fc4e0024e14ac8.jpg
次に銃の発射音の音量です。FPWeapon > Audio > FirstPersonTemplateWeaponFire02をダブルクリックで開いてVolumeを0.2にします。
https://scrapbox.io/files/65c016935932db0026379d8e.jpg
次に銃の発射音の音量です。FPWeapon > Audio > FirstPersonTemplateWeaponFire02をダブルクリックで開いてVolumeを0.2にします。
https://scrapbox.io/files/65c016935932db0026379d8e.jpg
④スコアを実装する
的に弾を当てて破壊した時に、スコアに+10して合計スコアをPrintStringで表示するという事をやっていきたいと思います。
ではスコアの変数を作成していくのですが、場所は操作するキャラクターのブループリントで作成しましょう。Firstpersonフォルダ > Blueprints > BP_FirstpersonCharacterをダブルクリックで開きます。
https://scrapbox.io/files/65c018cc987090002356d8b6.jpg
ファーストパーソンのイベントグラフが開かれました。既存のノードはそのままで良いです。
https://scrapbox.io/files/65c01993c027f600258aba2e.jpg
どこに何の機能を実装するべきか
プログラミングはわかりやすさが重要です。スコアの変数は誰が所有するべきなのか最もわかりやすい場所に作成しましょう。今回は正直どこでも良いですが、スコアを所有すべきなのは直感的にプレイヤーだとわかりやすいでしょう。なので今回はプレイヤー(BP_FirstpersonCharacter)にスコアを実装していきます。
Integer型のTargetHitScoreという変数を作成します。
https://scrapbox.io/files/65c01a4d15b1ad0029404a48.jpg
変数を作成したらコンパイルしておきます。
次に的(BP_Target)のイベントグラフを開きます。
https://scrapbox.io/files/65c01a8a730e1b002597ae54.jpg
イベントHitノードの最後にスコア処理を記載していきます。
https://scrapbox.io/files/65c01ab4987090002356eeb5.jpg
折り畳んだグラフ「Explosion And Destroy」をダブルクリックで開きます。
https://scrapbox.io/files/65c01aef64b00d00246f8bc2.jpg
DestroyActorノードからアウトプットへ接続します。
https://scrapbox.io/files/65c01b0eba4bfb002317b2e1.gif
イベントグラフをクリックして戻ります。折り畳まれた「Explosion And Destroy」ノードに実行ピンが追加されているのが確認できます。
こんな感じに追加されています↓
https://scrapbox.io/files/65c01b61dfa0f800259c0795.jpg
DestroyAndExplosionノードからCastToBP_FirstPersonCharacterノードを作成して、GetPlayerCharacterノードを追加します。
https://scrapbox.io/files/65c012efea8bc50024219ed3.jpg
ノード解説
GetPlayerCharacterノードはゲーム中のプレイヤーを取得するものです。CastToノードで取得したプレイヤーがBP_FirstPersonCharacterである事を確かめて一致する場合は後続のノードを実行して参照を行います。
CastToBP_FirstPersonCharacterノードから、まず以下のように接続します。まずCastToBP_FirstPersonCharacterノードのAsFirstPersonCharacterピンから「get TargetHitScore」と検索してゲットノードを追加します。その後「+」と検索してAdd(加算する)ノードを作成して10と入力します。
https://scrapbox.io/files/65c01bdfc027f600258ac520.jpg
この10が獲得するスコアになります。
以下のgifのようにAsFirstPersonCharacterピンから「set TargetHitScore」と検索してセットノードを追加します。さらにダブルクリックのピン留めで見やすくしておきましょう。
https://scrapbox.io/files/65c01c2077bbf500243714ec.gif
最終的にこうなります↓
https://scrapbox.io/files/65c01c81a804600025c3640e.jpg
スコアを表示するためにセットノードからPrintStringを追加しておきます。
https://scrapbox.io/files/65c01cad60347c0023b997fd.jpg
作成したノード解説
https://scrapbox.io/files/65c01cedc027f600258aca41.jpg
CastToノードでプレイヤー(BP_FirstpersonCharacter)を参照します。参照によりTargetHitScoreの変数を的のブループリントから変更できるようになります。
TargetHitScoreをGetで取得してそこに10を足します。
SetTargetHitScoreでスコアをセットします。そしてそのセットしたスコアをテキスト表示するというノードになっています。
Explosion And Destroyノードからの後続のノード全てを折りたたみます。
https://scrapbox.io/files/65c01d71c027f600258acc3a.gif
折り畳んだノードの名前をAddScoreとします。
https://scrapbox.io/files/65c01da036bdda00240c49b8.jpg
プレイしてみましょう。的に弾を当てるたびにスコアが+10されてテキスト表示されるようになりました↓
https://youtu.be/w-itKUhkdSM
《実践演習》
現在、スコアは数値しかデバッグに表示されていないので、Print Stringを改造し、『現在の得点は○○ポイントです』と表示されるようにしましょう。