using System; using UnityEngine; // 攻撃の的になる最小構成の敵 [RequireComponent(typeof(DamageReceiver))] public class Enemy : MonoBehaviour { // Scene上の全Enemyで共有する撃破通知。 // GameManagerはこの自作Enemyクラスのイベントを購読する。 public static event Action Defeated; [Tooltip("この敵の体力を表示するゲージ")] [SerializeField] private HealthGauge healthGauge; [Tooltip("死亡してから破棄するまでの時間")] [SerializeField] private float destroyDelay = 0.5f; private DamageReceiver _damageReceiver; // HPの状態を取得するためのコンポーネントを取得する private void Awake() { _damageReceiver = GetComponent(); } // 有効になったときにHP変更イベントの購読を開始する private void OnEnable() { _damageReceiver = GetComponent(); _damageReceiver.Damaged += OnDamaged; _damageReceiver.Healed += OnHealed; _damageReceiver.Died += OnDied; } // 無効になったときにHP変更イベントの購読を解除する private void OnDisable() { _damageReceiver.Damaged -= OnDamaged; _damageReceiver.Healed -= OnHealed; _damageReceiver.Died -= OnDied; } // ゲージを減らす private void OnDamaged(int damage, int maxHealth) { healthGauge.TakeDamage((float)damage / maxHealth); } // 回復量をHPゲージへ反映する private void OnHealed(int heal, int maxHealth) { healthGauge.Heal((float)heal / maxHealth); } // 死亡を通知し、破棄を予約する private void OnDied() { Defeated?.Invoke(this); Destroy(gameObject, destroyDelay); } }