Unityで敵にダメージを与えた時に少しづつHPを減らす機能を作成

今回は敵にダメージを与えた時に一気にダメージ分のHPを減らすのではなく1ずつHPを減らす演出を加えたいと思います。

HPがどういう風に減っていくかをわかりやすくする為に敵のHPを頭上に数値として表示しておきます。

Unityで敵キャラクターのHPを頭上に表示するUIを作成
Unityで敵キャラクターのHPを表すUIを頭上に表示してキャラクターと一緒に移動するようにします。

ではメーターで作成していますが、こちらのメーターでも同じように作成する事が出来ます。

まずは人型キャラクターの子要素にHP表示用UIを作成していきます。

スポンサーリンク

HP表示用UIの作成

HPを少しづつ減らす1

敵キャラクターの子要素で右クリック→UI→Canvasを作成し、名前をHPとします。
HPの子要素にUI→Panel、Panelの子要素にUI→Textを作成します。

HPを少しづつ減らす2

上がHPのインスペクタです。

CanvasのRenderModeをWorld Spaceにして、通常のゲームオブジェクトと同じように扱えるようにします。

SetHpTextスクリプトがテキストにHPを表示するスクリプトで、ShootTargetRotateスクリプトはHPのUIが常にカメラの方向を向くようにする為のスクリプトです(他で使っていたカメラを向かせる機能を使ったので名前が変になっています)。

スクリプトは後で作成します。

HPを少しづつ減らす3

上がHPの子要素のPanelのインスペクタです。
ColorのA(アルファ)を0にして背景色を透明にします。

HPを少しづつ減らす4

上がPanelの子要素のTextです。
表示されるテキストのサイズを敵キャラクターと比較しながら調整してください。

これで敵キャラクターのHP用のUIが完成しました。

HPを少しづつ減らす5

上が敵キャラクター(U_Character_REF)のインスペクタです。

EnemyStatus(敵のステータス管理スクリプト)とEnemyCon(敵の行動処理スクリプト)を新しく作り設定しておきます。
スクリプトは後で作成します。

HPを少しづつ減らす6

上のようにHPのUIが表示されるように配置します。

ここまで出来たら敵キャラクターをAssetsエリアにドラッグ&ドロップしてプレハブ化しておきます。
これでHPを表示するUIを持った敵キャラクターが量産出来ます。

HPのUIをカメラの向きにするShootTargetRotateの作成

それではさきほど登場したスクリプトを作成していきます。

まずはShootTargetRotateです。

HP表示用のUIの向きをカメラの向きに設定するだけです。

敵のステータス保持スクリプトEnemyStatusの作成

次はEnemyStatusを作成していきます。

EnemyStatusはHPを保持したり値を返したりするだけのスクリプトです。
本来は敵キャラクター操作スクリプト(EnemyCon)に敵を消す処理を記述するべきだと思いますが、HPが0以下になったら敵キャラクターのゲームオブジェクトを削除しています。

敵キャラクター操作スクリプトEnemyConの作成

次は敵キャラクター操作スクリプトEnemyConです。

敵キャラクター操作スクリプトと言っていますが、今回は動かす事はしないので、ダメージを受けた時の処理だけを記述しています。

Damage関数は敵の攻撃が当たった時に呼ばれる関数でダメージ値を受け取ります。
最初にHPのUIを少しづつ減らす処理を呼び出し、その後敵のステータスを設定します。

この呼び出しの順番にしてあるのは先にステータスを更新してしまうと元のHPから少しづつHPを減らす処理が出来ない為です。

次にEnemyConのDamage関数を呼び出す処理を追加していきます。

今回は

Unityのアクションゲームで物理的な弾を飛ばして敵との当たり判定をする
Unityのガンシューティングゲームなどで銃から弾を飛ばす場合にスクリプトで敵と接触したか判断するのではなく、物理的な弾を飛ばしその弾が当たったかどうかで判断させます

で弾が敵に当たった時にDamage関数を呼び出すようにします。
(近接攻撃等で敵を攻撃した時にDamage関数を呼び出す処理でも同じように作成してください。)

弾が敵に当たった時の処理BulletAttackにDamage関数を呼び出す処理を追加

それでは弾が敵に当たった時の処理BulletAttackにDamage関数を呼び出す処理を追加します。

弾のゲームオブジェクトを消す前にEnemyConのDamage関数に引数100(ダメージ値)を渡して呼び出します。
(今回の場合はダメージ値は常に100になります)

その後弾のゲームオブジェクトを消します。

HPを少しづつ減らしてテキストに表示するSetHpTextスクリプトを作成

最後に今回のメインの処理であるHPを少しづつ減らしてテキストに表示するSetHpTextスクリプトを作成します。

敵キャラクターが攻撃を受けた時に攻撃を受ける前のHPと与える全体のダメージ値をSetDamage関数で受け取り、nowHpとdamageに記憶します。

Update関数ではdamageの値が0より大きい時(減らすべきダメージが残っている時)にnowHpから1を減らし、それをHPの子要素であるTextの値に設定します。

ここで気になるのがダメージを受けてHPを減らしている最中にさらにダメージを受けた場合はどうなるのか?

という事ですが、

今回の仕様ではSetDamageを受け取った時にnowHpの値と与えるダメージは更新されるので、最初のダメージで700→600まで減らす途中の650の時に次の攻撃で100のダメージを受けた場合は、nowHpで600を受け取るのでテキストが600に一気に変わり500まで減らす処理がされる事になります。

少し解り辛いですが、敵のHPはEnemyStatusですでに更新されており、
このSetHpTextの処理はHPの表示処理をしているだけなので不都合は発生しません。

HPが少しづつ減るかどうかの確認

これで機能が完成したので敵を攻撃して試してみましょう。

HPを少しづつ減らす7

HPが少しづつ減っていくのが確認出来ます。
また、連続で攻撃が当たれば前の攻撃で受けたダメージ分は一気に計算されそこからまた少しづつ減るようになっています。

これでUnityで敵にダメージを与えた時に少しづつHPを減らす機能を作成が完了しました。

HPを減らしていく間隔時間を設定しましたが、あんまり使わないかも・・・・(^_^;)
間隔時間を0にしても早すぎるってことはなさそうですしね。