PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 敵の頭上に表示されるHPバーの実装方法

環境

UE4.25.3

完成イメージ

f:id:PaperSloth:20200923191904p:plain

実装方法

Widgetの用意

まずはHPバーとなるWidgetを用意します。
今回は「WBP_HealthGauge」という名前でWidgetを作成しました。
「Progress Bar」を置くだけです。
f:id:PaperSloth:20200924013650p:plain

Anchorを中心に設定し、おおまかなサイズとAlignmentを設定しておきます。
f:id:PaperSloth:20200924021434p:plain

また、初回はHPゲージを満タンで表示したいため「Percent」を1.0に初期化しておきます
f:id:PaperSloth:20200924014936p:plain

後ほどBlueprintで更新処理を作成しますが、まずは見た目だけ。

敵のBlueprintにWidgetを設定

敵のBlueprintは既に存在するものとして進めます。

新規にComponent追加で「Widget」Componentを追加します。
f:id:PaperSloth:20200924013908p:plain

Widgetを追加したら、表示位置をちょうど敵のActorの頭上にくるように調整して
先程設定したWidgetWidget Classに設定します。
ここでは「WBP_HealthGauge」という名前で先程のWidgetを作成したためそれを設定します。
また、Speceの欄は「World」から「Screen」に変更しておきます。
f:id:PaperSloth:20200924015121p:plain

ここまでで実行すると以下のような感じになるかと思います。
f:id:PaperSloth:20200924015031p:plain

HPバーの更新処理

続いて敵のHPバーを更新をする処理を追加していきます。
まずは先程作成したWidgetのBlueprintを開き、新規に関数かCustom Eventを作成して以下のように処理を組みます。
ここでは「UpdateHealthProgress」というCustom Eventを追加しました。
f:id:PaperSloth:20200924014711p:plain

次は敵のBlueprintに戻ってHP更新処理を組んでいきます。
WidgetのBlueprintへの参照情報を取得したいため、「Get User Widget Object」でWidgetを取得して
「WBP_HealthGauge」にCastし、新規に「WBPHealthRef」という変数を作成して変数に保存しておきます。
f:id:PaperSloth:20200924015245p:plain

型情報とか諸々がよく分からないという場合もPin上で右クリックで変数に昇格することで自動的に型情報を補完してくれます。
f:id:PaperSloth:20200924015416p:plain

続いてHPと最大HPの変数を2つ追加します。
「Health」と「MaxHealth」を追加し、それぞれ100.0で初期化しました。
f:id:PaperSloth:20200924020039p:plain

f:id:PaperSloth:20200924020053p:plain

次に実際にダメージを受けた時の処理を組みます。
まずはダメージを受けると現在のHPから引いてHPを更新します。
「Max (0.0)」を挟むことで0以下になった場合には0になるように設定できます。
(0以下になったら0 にするという組み方でも何も問題はないです)
f:id:PaperSloth:20200924020345p:plain

スクショを撮る都合上長いのでMathExpressionでまとめておきます。
余談ですが、MathExpressionでは変数名をExpression内で使用すると自動的に参照してくれます。
f:id:PaperSloth:20200924020533p:plain

ダメージ計算後は死亡判定を行います。
残りHPが0 未満になった場合は0 になるように設定したため、Nearly Equal で0と近い値かどうかを判定します。
Trueの場合は死亡処理、Falseの場合はHPバーの更新処理を行うようにします。
f:id:PaperSloth:20200924020846p:plain

次にHPバーの更新処理と死亡処理です。
現在HPと最大HPの割合を計算してWidgetのProgress BarのPercentに設定しています。
f:id:PaperSloth:20200924021053p:plain

これもスクショ都合でMathExpressionにしておきます。
f:id:PaperSloth:20200924021241p:plain

最後にダメージ処理の全体像を貼っておきます。
f:id:PaperSloth:20200924021255p:plain

今回はダメージを与える側のBlueprintは省略します。

最終的に以下のような形になります。
f:id:PaperSloth:20200924022232g:plain

参考資料

Action RPGではこの方式でHPゲージが実装されています。
「BP_EnemyCharacter」に「WB_EnemyHP」のWidgetが関連付けられていますので
その2つのBlueprintを見ていただければと思います。
Action RPG:Epic Games:Epic Content - UE4 マーケットプレイス