無事にHpBarを表示することができました。ですがこのままでは、前回の索敵範囲と同様に処理が独立しまっており、
敵のHPが減少してもHpBarが一緒に減少しません。HpBarと敵のHPとをリンクさせて、攻撃を受けてHPが減少したら、HpBarも動くようにしましょう。
設計を考えてみます。敵のHPの情報をHpBarに送ることが出来れば、ちゃんと情報がリンクでき、HpBarが動くように出来そうですね。
やり方としては、EnemyControlerクラスにてHpBarの処理をするのか、あるいは先ほど作ったHpBarクラスで処理を行うようにするのか、
どちらの方法でも対応できると思います。
ここではHpBarInfoクラスにてHpBarの処理を行う方法を実装していきます。
まずはHpBarInfpクラスを修正していきます。
<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。
using UnityEngine;
using UnityEngine.UI;
public class HpBarInfo : MonoBehaviour
{
public Slider sliderHp;
void Start() {
// HpBarのゲージ(value)を最大値にする
sliderHp.value = 1.0f;
}
void LateUpdate() {
// HpBar用Canvasの向きを常にカメラの方向に向ける
LookHpBarToCamera();
}
/// <summary>
/// HpBar用Canvasの向きを常にカメラの方向に向ける
/// </summary>
private void LookHpBarToCamera() {
transform.rotation = Camera.main.transform.rotation;
}
/// <summary>
/// 敵のHPの現在値とHpbarのvalueを同期させる
/// </summary>
public void UpdatedHpBarValue(int hp, int maxHp) {
sliderHp.value = (float)hp / (float)maxHp;
}
/// <summary>
/// 敵が倒された時にHpBarを隠す
/// </summary>
public void HideHpBar() {
gameObject.SetActive(false);
}
}
つづいてEnemyControlerクラスも修正します。こちらからHpBarInfoクラスに作成したメソッドを呼び出して、HpとHpbarとの同期を行います。
またHpが0になった場合にはHpBarを非表示にする処理も追加しておきます。
下記のスクリプトはEnemyControlerクラスを抜粋したです。OnTriggerEnterメソッドの該当部分に追加します。
<= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。
// HPからdamage分だけ減算
hp -= damage;
Debug.Log("残りHP : " + hp);
// HpbarをHPの値と同期
hpBarInfo.UpdatedHpBarValue(hp, maxHp); // 追加
// 残りHPの確認
if (hp <= 0) {
Debug.Log("破壊した");
// HpBarを隠す
hpBarInfo.HideHpBar(); // 追加
// オブジェクトの破壊時の処理
DestroyObject();
}
サンプル動画
https://gyazo.com/8776f4467c0a1db7e77ac7c42950b3c9
それでは実際に動かしてみましょう。プレイヤーの攻撃を受けた際に、敵のHpBarが減少すれば処理は成功です。
敵が倒れたアニメ処理を追加する場合には、破壊されるまで時間がかかりますので、その前にHpBarを非表示にする処理を追加しましょう。