70.プレイヤーのHPバーを作る①実践
😺では今回はプレイヤーのHPバーを作っていきます。FPSっぽく、敵の弾が当たったらHPを減らすという感じで作っていきます。2ページに渡るのですがこのページではまずは弾を自動で発射する銃を実装していき、次のページでUIのHPバー作成となります。
今回実装する機能↓
https://youtu.be/mi6WWSVPR4E
敵に見立てて銃から弾を自動発射させて、その弾にヒットすると左下のHPバーが変更されるという仕様です。
①発射する弾を作る|実践
なお確認ですがUnrealEngineのバージョンは5.0.3で進めていきます。
ファーストパーソンのテンプレートプロジェクトを作成します。スターターコンテンツは無しで良いです。
https://scrapbox.io/files/65cb5f66b92ba100235eae4b.jpg
作成するのはファーストパーソンのテンプレートなので注意です。
https://scrapbox.io/files/65cb60eedb2a850024afadef.jpg
まずは撃つ弾を作っていきます。銃と弾はファーストパーソンのアセットとして既にあるのですが、今回はそれらとは別で1から作成します。Blueprintsフォルダを作成してブループリントクラス > アクタで作成します。名前をBP_Bulletにします。
https://scrapbox.io/files/65cb60feb7703800253b81b1.jpg
BP_Bulletを開いて、追加からメッシュのSphere(球)を追加します。
https://scrapbox.io/files/65cb610906bce50024833ece.jpg
Sphereを選択した状態でマテリアルからFistPersonProjectileMaterialを選択します。
https://scrapbox.io/files/65cb611b23a96c0025447d58.jpg
サイズをすべて0.2にします。拡大縮小隣の鍵マークで一括変更できます。
https://scrapbox.io/files/65cb61255f43c000253e8b78.jpg
重力はオンにしたいので物理からSimulataPhysicsにチェックを入れます。これで物理挙動が有効になり重力などが反映されます。
https://scrapbox.io/files/65cb612e754f3a0023ccf83c.jpg
😺ではこれで弾作成は一旦終わって、次にこの弾を発射する銃を作成していきます。HPバーに関してはもう少し後になります。
②弾を一定間隔で発射する銃を作る|実践
では弾を一定間隔で発射する銃を作成します。プレイヤーが発射された弾にヒットしたらHPバーを減っていくといった感じです。
銃となるブループリントクラスを作成します。ブループリントクラス > ActorでBP_Gunという名前にします。
https://scrapbox.io/files/65cb6145e4584500267880bb.jpg
BP_Gunを開いたらSkeltalMeshコンポーネントを追加します。メッシュからファーストパーソンの銃、SK_FPGunを選択します。
https://scrapbox.io/files/65cb616e23a96c0025448033.jpg
そのままBP_Gunのイベントグラフを開いて、BeginPlayからSetTimerbyEventノードを繋げます。Timeを0.5にして、loopingにチェックを入れます。
https://scrapbox.io/files/65cb617cef15080024c4e1ed.jpg
SetTimerbyEventノードとは?
SetTimerbyEventノードは一定間隔毎にEventに接続したカスタムイベントを実行させるノードです。Timeが間隔時間で、Loopingで接続したカスタムイベントをループさせる事ができます。
次にカスタムイベントを作成して名前をEventFireにします。
https://scrapbox.io/files/65cb61c8556d2b002557270c.gif
こんな感じになりました↓
https://scrapbox.io/files/65cb61f1ad7403002545c7d8.jpg
カスタムイベントからSpwanActorFromClass(日:クラスからアクタをスポーンします)を作成します。アクタを生成するノードです。Classに作成した弾のアクタ「BP_Bullet」を選択して、SpawnTransformから現在の銃の位置を取得するためのノードGetActorTransformを作成します。
https://scrapbox.io/files/65cb620bb7703800253b89ce.jpg
これで一定間隔でBullet(弾)が銃から発射されるようになりました。
レベルに戻ります。既存でレベルに配置されている銃を確認します。これは先ほど作成したBP_Gunではなくデフォルトで用意されている銃(BP_Rifle)なので注意です。
https://scrapbox.io/files/65cb625333b15a0027fc00c5.jpg
このデフォルトで配置されている銃をプレイヤースタートの目の前に移動させておきます。(時短のためです)
https://scrapbox.io/files/65cb6265b04732002367b7d3.jpg
次に作成したBP_Gunをレベルに追加します。
https://scrapbox.io/files/65cb62774a995c00244f902b.jpg
これで一旦プレイしてみます。銃(BP_Gun)の場所から一定間隔で弾が生成されているのが確認できます。
https://scrapbox.io/files/65cb628bb7703800253b8caa.gif
😺では次に弾を銃口から正面に向かって発射されるように実装していきましょう。
③弾を正面に向かって発射させる|実践
では弾を正面に向かって発射させる機能を弾に実装します。
作成したBP_Bullet(弾)のイベントグラフを開きます。
https://scrapbox.io/files/65cb62ac3f1cb20024479af2.jpg
beginplayからAdd Impulse at Location(Sphere)を作成します。Impulseのyを10000にします。
https://scrapbox.io/files/65cb62efc042090025b6de52.jpg
AddImpulseatLocationノードとは?
指定した方向に向かって対象のメッシュに力(衝撃)を加えるノードです。例えばですが人をドンっと押したり、爆発によって物が吹っ飛んだりする時の"力"の事を指します。今回はこのAddImpulseatLocationで、弾に衝撃を加えて前に吹っ飛ばしています。これで弾が生成されたと同時にBeginPlayで処理が起動して、AddImpulseatLocationでY方向に10000という力が加わって発射しているという形になります。
プレイしてみましょう。銃から弾が正面方向に向かって発射されるようになりました。
なお弾の発射位置が若干ずれていますが本題ではないので一旦これで進めていきます。
😺ではここからは、この弾がプレイヤーにヒットしてダメージを与える→プレイヤーのHPを減らす→HPバーの表示を変化させるという流れで機能を実装していきます。
④弾に当たったらHPを減らす|実践
先ほど作成した弾(BP_Bullet)を開きます。
https://scrapbox.io/files/65cb63e7d00d72002441e4e0.jpg
Sphereを選択した状態で、イベントからOnComponentHitをクリックします。
https://scrapbox.io/files/65cb63fcb7703800253b9662.jpg
OnComponentHitノードが作成されます。
https://scrapbox.io/files/65cb640e3cd3650024c3fe2c.jpg
OnComponentHitノードとは?
弾が他のアクタと衝突した時に発生するイベントです。
ここで忘れずにSphereを選択した状態でコリジョン > Simulation Generates Hit Eventsにチェックを入れます。
https://scrapbox.io/files/65cb6435e5482400250fae06.jpg
Simulation Generates Hit Eventsとは?
SimulatePhysicsにチェックを入れている場合(つまり物理挙動が有効になっている場合)、Hitイベント系のノードはデフォルトでは実行されません。つまりデフォルトではOnComponentHitノードは実行されないのですが、Simulation Generates Hit Eventsにチェックを入れる事で当たり判定が行われるようになります。
😺なので重力や外部の力を受ける物理挙動オンの状態でOnComponentHitを使用する場合はSimulation Generates Hit Eventsにチェックを入れるという事を忘れずに行いましょう。チェックを入れてないとOnComponentHitは実行されません。
なおここからノードを作成していきますが、わからなくなったら下のblueprintUEをご覧ください。
OnComponentHitからCastToBp_FirstPersonCharacterを作成します。Printstringを作成してテキストをHitにしておきます。
https://scrapbox.io/files/65cb6553bec91800235de88f.jpg
次にApplyDamageノードを作成してBaseDamageは10にしてDamagedActorにはBp_FirstPersonCharacterを接続します。さらにDestroyノードを追加します。
https://scrapbox.io/files/65cb657f754f3a0023cd1ce7.jpg
ApplyDamageノードとは?
ApplyDamageノードはDamagedActorに接続したアクタのイベントAnyDamageノードを実行するノードです。BaseDamageでダメージの値を渡す事ができます。イベントAnyDamageノードについては後から紹介します。簡単に言うとApplyDamageノードはダメージを伝えるノードです。
プレイしてみます。弾にぶつかりに行き、ひとまず左上にHitとテキスト表示されるか試しましょう。Hitと表示されたら問題なくヒットイベントが発動されています。
https://scrapbox.io/files/65cb65cff209eb002470b7b2.gif
https://scrapbox.io/files/65cb65ddbb092e0024e2e2b7.jpg
もしHitと表示されないのであればコリジョンプリセットとSimulation Generates Hit Eventsにチェックを入れたかなど手順を再確認してください。
⑥プレイヤーにHPを実装する|実践
ではプレイヤーにHPを実装します。
プレイヤーのBP_FirstPersonCharacterを開きます。
https://scrapbox.io/files/65cb661773bfe900246b0a33.jpg
Float型の変数を作成して名前をHPにします。
https://scrapbox.io/files/65cb66983228d500258fb229.jpg
コンパイルしてHPのデフォルト値を100にします。
https://scrapbox.io/files/65cb66a18c35ef0025963cf7.jpg
そのまま既存のノードはそのままで、BP_FirstPersonCharacterのイベントグラフに以下のノードを追加します。まずイベントAnyDamageを作成します。そこからMinus(減算)ノードを作成してSetHPを作成します。確認のためPrintStringで最後表示させます。
https://scrapbox.io/files/65cb66b774e9ab00251f1c7a.jpg
イベントAnyDamanageノードとは?
先ほどBP_Bulletに実装したApplyDamageノードによって実行されるのがイベントAnyDamanageノードになります。つまりApplyDamageとイベントAnyDamanageノードはセットで使うノードで、ダメージを伝えるのがApplyDamageノードでダメージを受け取るのがイベントAnyDamanageノードになります。イベントAnyDamanageノードのDamageからダメージ量を出力します。
BP_FirstPersonCharacterに追加したノードを確認する
プレイしてみます。弾にヒットするとHPが徐々に減っているのが確認できます。
https://youtu.be/w3-vLo9i1-A
https://scrapbox.io/files/65cb6719556d2b0025574e61.jpg
これでHPバーの基礎の部分となるHPを実装できました。
作成したノードの解説!
まずGun(銃)の方でBullet(弾)を0.5秒毎に生成しています。
https://scrapbox.io/files/65cb677c09faf4002468d2a7.jpg
Bulletは生成されたと同時にBeginPlayが実行されて、AddImpulseでワールドのY軸に対して衝撃が加わります。
https://scrapbox.io/files/65cb678e74e9ab00251f2351.jpg
OnComponentHitで弾と他のアクタが衝突した時に処理を実行します。CastToBP_FirstPesronCharacterでプレイヤーとヒットした場合にのみ後続のノードを実行します。プレイヤーだった場合はApplyDamageでダメージ数を指定してプレイヤー側でイベントAnyDamageノードを実行させます。
https://scrapbox.io/files/65cb67a2d9aff80024621bb2.jpg
BP_FirstPersonCharacterのイベントAnyDamageはApplyDamageノードが呼ばれたタイミングで実行されます。つまり弾がプレイヤーにヒットした瞬間実行されてHPから-10されて表示されます。
https://scrapbox.io/files/65cb67b6f209eb002470c371.jpg
今回実装した事を簡単に解説するとこんな感じです↓
😺という事で次回UIのHPバーを実装していきましょう!保存も忘れずにしておきましょう。今回は以上です。お疲れ様でした。