| using UnityEngine; |
| using UnityEngine.Events; |
|
|
| namespace UnityAgent |
| { |
| |
| |
| |
| |
| public class HealthSystem : MonoBehaviour |
| { |
| [Header("Health")] |
| public float maxHealth = 100f; |
| public float currentHealth { get; private set; } |
| public float regenPerSecond = 1f; |
| public float regenDelay = 5f; |
|
|
| [Header("Events")] |
| public UnityEvent onDeath; |
| public UnityEvent<float> onDamaged; |
|
|
| private float _lastDamageTime; |
| private bool _dead; |
|
|
| public float Normalised => currentHealth / maxHealth; |
|
|
| private void Awake() |
| { |
| currentHealth = maxHealth; |
| } |
|
|
| private void Update() |
| { |
| if (_dead) return; |
| if (Time.time - _lastDamageTime > regenDelay && currentHealth < maxHealth) |
| { |
| currentHealth = Mathf.Min(maxHealth, currentHealth + regenPerSecond * Time.deltaTime); |
| } |
| } |
|
|
| public void TakeDamage(float amount) |
| { |
| if (_dead) return; |
| currentHealth = Mathf.Max(0f, currentHealth - amount); |
| _lastDamageTime = Time.time; |
| onDamaged?.Invoke(amount); |
| if (currentHealth <= 0f) Die(); |
| } |
|
|
| public void Heal(float amount) |
| { |
| if (_dead) return; |
| currentHealth = Mathf.Min(maxHealth, currentHealth + amount); |
| } |
|
|
| private void Die() |
| { |
| _dead = true; |
| onDeath?.Invoke(); |
| Destroy(gameObject, 0.5f); |
| } |
| } |
|
|
| |
| |
| |
| |
| public class HealthBar : MonoBehaviour |
| { |
| public HealthSystem source; |
| public UnityEngine.UI.Image fillImage; |
| public bool hideWhenFull = true; |
|
|
| private void Update() |
| { |
| if (source == null || fillImage == null) return; |
| float n = source.Normalised; |
| fillImage.fillAmount = n; |
| if (hideWhenFull) fillImage.transform.parent.gameObject.SetActive(n < 0.999f); |
| } |
| } |
| } |
|
|