UE4でとりあえずヒットポイントとダメージ、ついでに画面にHPバーを実装する
はじめに
とりあえずハンズオン勉強会で習ったことの復習を兼ねた記事です。
シンプルな3Dアクションゲームを想定して作っていこうと思います。
UE4のガチ初心者なので、バッドノウハウとかあると思います。
手順や作業を整理して記事を書いてるわけではないので、拙い点はご容赦を。
プロジェクト的には↓を引き継いでます。
ゲームオーバー処理を行っているので、GameOverノードとかでてきたら、以下の記事を閲覧ください。(とはいっても、GameOverカスタムイベントがあるだけですが。)
何をやるのか
タイトル通り、キャラクターにHPを実装して、ダメージを受ける床を作ります。
ヒットポイントを実装しただけど見た目的によくわからないので、ついでに画面にHPバーも表示させます。
全体観
左上の青いゲージがHPバー、真っ赤な床がダメージ床です。
ヒットポイントを実装する
Third Personプロジェクトからプロジェクトを作っているので、プレイヤーの操作キャラクターのブループリント、「ThirdPersonCharacter」があるはずです。
コンテンツブラウザで検索して、コイツのブループリントにそのまま追加していきます。
とはいえ、HPの実装自体はたいしてやることがありません。Healthとか適当な名前をつけたfloat型の変数を作って編集可能にして置いておけば終わります。
早速ダメージとHPがなくなった時の死亡処理を作りましょう。
ダメージを受ける処理も簡単です。
AnyDamageイベントノードに、引き算のノードを書くだけです。
Health - Damageした値を、新たにHealthにセットしてダメージ後のHPに更新します。
ダメージ計算後のHPが0以下だった時、死亡処理を行います。
ダメージが0になった瞬間パッって消えるのも味気がないので、SpawnActorノードでBlueprint_Effect_Explosionをキャラクターの場所に表示させてみました。
本記事の本質ではないので、なくてもいいかと思いましたが、勉強会でもいれてましたし、私の好みでやってみました。
DestroyActorして、GameModeをGameOverに変えます。
前回の記事からプロジェクトを引き継いでいれば、GameOver画面が出るはずです。
このGameOverは私が作ったカスタムイベントです。残機制とかの場合は残機処理を挟むといい感じになると思いまsう。
ダメージ床を作る
ダメージの発生源がなければダメージを受けることができません。
なのでダメージの発生源を実装しましょう。
ひとまずいつものキューブにBoxコライダをのっけていい感じにします。
ちょっとダメージ床のマテリアルは凝ってます。
上の記事を参考に、マテリアル属性をTranslucentに変更。
オパシティ項目にDPanel_Opacityというパラメータを0.5にしてつなげます。
ユーザーがダメージ床に乗った時、DPanel_Opacityを1にすることでユーザーがダメージ床に乗っている感を出そうという目論見です。
コンストラクションスクリプトでCreateDynamicMaterialInstanceを作成して、DPanel_Opacityにアクセスできるようにしておきます。
落ちる床を作った時と同じですが、今回はパラメータ名に「DPanel_Opacity」を設定します。
イベントグラフもシンプルです。
OnComponentBeginOverlapイベントが発生した時、乗っていたアクターがプレイヤーであれば、DPanel_Opacityを1にして不透明にした後、ApplyDamageノードに通すだけです。
OnComponentEndOverlapでDPanel_Opacityを0.5に戻しています。
ポイントはThirdPersonCharacterにキャストしているところで、このノードを入れないと、落ちる床が落ちてダメージ床に触れた時にもダメージ発生エフェクトが発生してしまいます。(ダメージは落ちる床に発生しているのかな?バグの元っぽいので、弾いておきましょう)
おしまい!
プレーヤーが載ってる時、赤い床が奥のでっかいダメージ床と較べてくっきりしてるのがわかります。
HPゲージを表示する
記事のスクリーンショット的には既にHPゲージが出ていますが、これも自分で作らないといけません。
HUDという名前で、ユーザーインターフェースブループリントを作成しました。
ProgressBarしかない超シンプルなHUDです。
このProgressBarのPercentのところに、バインドしてプレイヤーのHealthと連動するっていう寸法です。
ひとまずイベントグラフで、プレイヤーへの参照を作ります。
ThirdPersonCharacterへキャストして、出てきたオブジェクトをMyCharaとかいう名前で変数にしておきます。
バインドした関数もシンプルです。
さっき作ったMyCharaからHelthをゲットしてきて、Health / 100して%にして戻すだけです。
おしまい!!
今回はちょっと記事短めです。
昨日はアイテムも実装しようと思ってましたが、また明日やります。
わかってないこと、疑問点、懸念事項
- ThirdPersonCharactorノードでプレイヤーを取得しているが、もっといい感じのプレイヤー取得の方法はないだろうか。
- HPが残り少なくなった時、HPゲージをピンク色とかに変えたい。バインドの関数を編集するのだろうか?
では、また。