🏥

テンプレ通りのゲーム制作 FPS⑧プレイヤーHPとダメージ処理

2025/01/27に公開

プレイヤーHPのパラメータを持たせる

前回は継承の概念を使ってターゲットにバリエーションを持たせました。耐久力を持たせて破壊しづらいターゲットを作りましたね。今度は自身にもHP(ヒットポイント)を持たせてダメージを受ける仕組みを作りましょう。前回の記事はこちらです。

https://zenn.dev/yukumoto/articles/51bfc29fcee299

コンテンツ/FirstPerson/Blueprintsの「BP_FirstPersonCharacter」を開きます。

左側の変数の項目のプラスボタンを押して変数を作ります。Integer型にして「PlayerHP」(プレイヤーヒットポイント)という変数名にします。コンパイルして詳細パネル下部のデフォルト値を「100」にしておきます。

プレイヤーからHPを奪う

飛んでくるキューブに攻撃力を与えます。FloatingTargetだけに与えてもいいのですが、今回は親クラスに共通で攻撃力を付加します。
コンテンツ/Blueprintsの「BP_TargetBase」を開きます。

左側の変数の項目のプラスボタンを押して変数を作ります。Integer型にして「AP」(アタックポイント)という変数名にします。コンパイルして詳細パネル下部のデフォルト値を「10」にしておきます。


TargetBase側にAPが設定出来たらBP_FirstPersonCharacterに戻ります。
上部のタブをビューポートに切り替えてCapsuleComponentをクリックします。

詳細パネルでコリジョンの項目を探し、Simulation Generates Hit Eventsにチェックを入れます。この設定はヒットイベントを生成する事になります。

左上のコンポーネントパネルでCapsuleComponentを右クリックして、
イベントを追加/OnComponentHitを追加を選びます。

このイベントはカプセルコンポーネントに「何らかのアクターがヒット」が起こった!という事を検知するイベントです。次にカプセルコンポーネントにヒットした対象がBP_TargetBaseであるか調べるためにOtherActorピンからワイヤを伸ばしてキャストします。Cast To BP_TargetBaseを作ってください。

キャストを行う理由は「ヒットやオーバーラップ対象が目的のクラスか調べる目的」と「キャスト対象のクラスの変数や関数にアクセスする目的」があります。

As BP TargetBaseからワイヤを伸ばしGet APしてAP変数にアクセスします。

ヒットしたターゲットの攻撃力であるAPにアクセスできましたので、プレイヤーのHPにゲットしてAPを引き(Subtract)HPにセットします。画像のようにノードを組んでください。ダメージが入ったのが分かりやすいように計算後に実行ピンから伸ばして最後にPrintStringを入れています。緑のピンとピンクのピンは直接接続すれば変換ノードが自動的に作られます。

組めたら実行してみましょう。
ダメージが連続で入ってる?!

左上に簡易的なデバッグ表示ではありますがテキストが表示されます。ダメージを受けたときにプレイヤーの残りHPを表示してくれるのですが、当たった瞬間にダメージが2回以上入ってるのが分かります。これではすぐにHPが無くなってしまいますね。これを改善していきましょう。

まず、キャストのすぐ後の実行ピンからワイヤを重ねるように伸ばしてDo Onceノードを追加します。さらにそのうしろにSet Timer by Eventノードを追加します。時間は5.0秒にします。

SetTimerノードのEventピンから左下にワイヤを伸ばし、Add Custom Eventと入力します。

カスタムイベント名を「Reset」と名前を付けて実行ピンをDo OnceのResetピンに接続します。画像のように組んでください。

完成したらプレイしてみましょう。

連続ヒットしなくなった

これで連続でダメージが入らなくなった筈です。5.0秒は無敵時間がちょっと長いかもしれませんが適宜調整してみてください。

プログレスバーを設置する

つぎにHPの表示を簡易表示ではなく、視覚的にわかりやすいようにプログレスバーを追加しましょう。
コンテンツ/UIの「UI_GameMain」を開きます。※以前UI_Bulletという名前を改名しました。

エディタが開いたらレイアウトの左上あたりにパレットの一般カテゴリからProgressBarをドラッグアンドドロップします。プログレスバーの周りのハンドルを使って大きさを調整してください。

プログレスバーを選択している状態で詳細パネルのプログレスカテゴリのPercent項目のバインドプルダウンからバインディングを作成を選びます。

BPエディタが開きます。Get Percentから始まるノードが表示されますのでその間にBP_FirstPersonCharacterのキャストノードを入れてPlayerHPにアクセスしてReturnValueにつなげます。これでプログレスバーにプレイヤーHPの内容を送れます。プレイしてみましょう

青いまま!?
あれれ、変わりませんね。これはPercentが「0%~100%」みたいな百分率ではなく割合の0.0~1.0の間の値で数値を受け付けるからです。下のようにノードを組み替えます。

上記のようなノードを組む際に割り算(Divide)ノードを作る時に気を付けることがあります。割られる数であるPlayerHPはInteger型になっているので整数値です。割合にするために100で割ると例えば「90」のPlayerHPを100で割ると「0.9」となって欲しいところが整数値の「0」になって小数点以下の値が失われてしまいます。そのためにDivideノードを作った際に左下のピンを右クリックして浮動小数点(倍精度)へを選んで「100.0」の実数値で割ります。すると計算結果も実数である「0.9」が出力できます。
デフォルトではInteger型をInteger型で割るDivideノード
左下のピンを右クリックして浮動小数点(倍精度)に変換
100.0で割れるようになった

プレイしてみましょう。
プログレスバーが正しく表示できた!
プログレスバーがきちんとPlayerHPの割合の表示が出来るようになりました。これでUIが見やすくなりましたね。プログレスバーが表示できるようになったのでBP_FirstPersonCharacterのPrintStringは削除しておきましょう。

次回はさらにダメージの演出を追加していきます。

Discussion