using System; using System.Collections.Generic; using UnityEngine; public class Health : MonoBehaviour { public float Hp { get; private set; } public float MaxHp { get; private set; } public float HpPercent => Hp / MaxHp; public event Action HealthChanged; public event Action Damaged; //public event Action Healed; public event Action Died; public bool Alive { get; private set; } private bool Initialized = false; private List CachedHitboxes; public void Initialize(float maxHp, List hitboxes) { if(Initialized) return; Hp = maxHp; MaxHp = maxHp; Alive = true; CachedHitboxes = hitboxes; SubscribeOnHitBoxes(); Initialized = true; } private void SubscribeOnHitBoxes() { foreach(var hitbox in CachedHitboxes) hitbox.OnDamage += TakeDamage; } private void UnsubscribeFromHitboxes() { if(CachedHitboxes == null) return; foreach (var hitbox in CachedHitboxes) hitbox.OnDamage -= TakeDamage; } private void TakeDamage(float damage, Vector3 damagePosition) { if (!Initialized) return; if (!Alive) return; if (damage <= 0) return; float oldHp = Hp; Hp = Math.Clamp(Hp - damage, 0, MaxHp); float consumedDamage = oldHp - Hp; if (Hp <= 0) { Alive = false; UnsubscribeFromHitboxes(); Died?.Invoke(damagePosition); } Damaged?.Invoke(consumedDamage); HealthChanged?.Invoke(Hp); } private void OnDestroy() { UnsubscribeFromHitboxes(); } }