【Unity】体力ゲージとダメージ処理を1分で実装する

ダメージ処理を実装して、ついでにHPゲージも表示したいけど、意外と作るのが難しいなあ……

柔軟性が高いのがUnityの長所だけど、それくらい最初から用意しといてよってものも多いよな。

色々なゲームで必要でありながら、実装が難しい……。
よろしい、ならば作ってやろう。

というわけで、主にGame Jamやモック版の制作向きな、手軽に実装できるテンプレートを作りました。

導入方法

ダウンロード

Githubにて公開中です。

unitypackageをダウンロードし、UnityのProjectビューへ放り込んでインポートしてください。

UniRxを導入する

動作にはUniRxという無料アセットが必要なので、アセットストアかGithubより入手してインポートしてください。

基本的にアセットストアからの入手で大丈夫ですが、Unityのバージョンによってはエラーを吐くので、その際はGithubより対応バージョンを入手してください。

なお、今回のテンプレートはUniRxの使用法を知らずとも使えるので、特にこの記事では解説しません。有名で便利なアセットなので、気になる方は調べてみてください。

動作確認

Sampleシーンを読み込めば、簡単な動作が確認できます。

使い方

README.mdに大まかな使い方は書いてありますが、一応解説します。

LifeObject.cs

ダメージを与える対象物に、 LifeObject.cs をアタッチしてください。
敵にダメージを与えたいなら、敵にアタッチします。

GetComponent<LifeObject>().ApplyDamage( ダメージ値 );
で、ダメージを与えます。
(当然ですが、実際に使う際は、LifeObjectコンポーネントを事前に取得してキャッシュしてください)

Sampleシーンでは、Damage ButtonのOnClickで呼び出しています。
Buttonが押されるたびに、10ダメージを与えるという記述です。

なるほど! プレイヤーの攻撃処理で呼び出せば、プレイヤーの攻撃時に敵にダメージを与えられるわけね。

Dieイベント

LifeObject.csのDieと書かれた部分では、対象が死亡した際に呼び出されるメソッドを登録できます。

Sampleでは、Damageボタンを操作不可にし、Respawnボタンを有効にしています。

ふむふむ。死亡アニメーションや効果音・パーティクルの再生をここに登録すれば、死亡演出ができるわけね。

他にも、 自分で用意した自爆処理を呼び出すとか、撃破数カウンターを増やすとか、使い方は色々だな。

After Death

Inspector上にも説明がありますが、After Deathの項目では、Dieイベント終了後の動作を指定できます。

DestoryアタッチされたGameObjectを破棄
InactiveアタッチされたGameObjectを 非アクティブ化

状況に応じて使い分けてください。Inactiveで非アクティブ化した際に、対象Objectを再び有効化すると、体力値は自動的に最大値に戻ります。

一度しか登場せず、死亡後はそのGameObjectを使わないならDestory。
死亡したObjectを再度使い回したい場合はInactiveを使うといいでしょう。
Sampleではリスポーンさせたいため、Inactiveにしています。

Death Wait

Dieイベント終了後、何秒でAfter Deathが実行されるかを指定します。

なお、遅れて実行されるのはAfter Death……つまりGameObjectの破棄か非アクティブ化のみであり、Dieイベントは即座に実行されます。

これは何に使うの?

死亡アニメーションの終了待ちや、ラグドール化して数秒後に非表示にしたい時などに使えるぞ。
特に必要ないなら0でいい。

スポンサードサーチ

HPゲージ

HPゲージを表示する

おまけ機能として、HPゲージの表示・更新機能があります。

正確に言うと、指定したSliderのValueを、現在の体力値と同期させる機能です。 Sliderであれば、ゲージの表示形式や位置は問いません。

ここでは、Sample同様にキャラクターの頭上に表示する方法を解説します。

HPゲージ用のUIを作る

以下の記事が大変分かりやすいです。

面倒な場合は、SampleフォルダのPrefab「HP Gauge Canvas」もご活用ください。

Canvasを設定する

キャラの頭上に表示する際は、一手間必要です。

  1. CanvasのRenderModeをWorld Cameraに変更
  2. CanvasにOnCharacterGUIをアタッチ
  3. CanvasをLifeObjectの子要素として配置

中を覗けば分かりますが、OnCharacterGUIはMain Cameraの角度と同期しているだけのシンプルなスクリプトです。
World CameraにするとGUIをゲーム空間に直に配置できるため、GameObjectに追従させたい時におすすめです。

CanvasをLifeObjectがアタッチされたGameObjectの子として配置することで、キャラの移動に合わせて追従するわけだね。

その通り。だが、それだけではキャラの回転に合わせてゲージも回転してペーパーマリオ状態になるので、OnCharacterGUIというスクリプトを用意して、常にMain Cameraを向くようにしているぞ。

LifeObjectを設定する

LifeObjectのHp Gaugeに、先ほど作成したSliderをアタッチすることで設定完了です。

後は特に設定することなく、体力値に応じてゲージが増減します。

まとめ

以上、使用法の簡単な解説でした。

Game Jamやモック版の動作確認など、攻撃処理を手早く実装したい時にどうぞ。

よく使う処理はまとめておくと、作業がはかどるね!

参考にした記事など

Unity開発で使える設計の話+Zenjectの紹介

44~51ページのオープン・クローズド原則を参考に実装しました。37ページからSOLID原則について大変分かりやすく解説しており、よく読み返しては全く学習せずにスパゲッティなコードを書いています。

記事をシェアする