using UnityEngine; using UnityEngine.Events; namespace GameDev.CoreSystems { public class Damageable : MonoBehaviour, IDamageable { [Header("RuntimeSet")] [SerializeField] private SoDamageableRuntimeSet _activeDamageableRuntimeSet; [field: Header("Health")] [field: SerializeField] public int CurrentHealth { get; private set; } [field: SerializeField] public int MaxHealth { get; private set; } [field: Header("Modifiers")] [field: SerializeField] public bool IsInvulnerable { get; private set; } public UnityEvent DeathEvent; private void OnEnable() { _activeDamageableRuntimeSet.Add(this); } private void OnDisable() { _activeDamageableRuntimeSet.Remove(this); } #region Methods public void ModifyHealth(int healthChange) { if (IsInvulnerable) return; CurrentHealth += healthChange; if (CurrentHealth >= 0) return; print($"{transform.parent.parent.name} died"); DeathEvent.Invoke(); } #endregion #region Setters public void SetCurrentHealth(int newHealth) => CurrentHealth = newHealth; public void SetMaxHealth(int newHealth) => MaxHealth = newHealth; public void SetInvulnerable(bool newState) => IsInvulnerable = newState; #endregion #region Getters public int GetCurrentHealth() => CurrentHealth; public int GetMaxHealth() => MaxHealth; public float GetHealthFactor() => (float)CurrentHealth / (float)MaxHealth; #endregion } }