74 lines
1.7 KiB
C#

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<float> HealthChanged;
public event Action<float> Damaged;
//public event Action<float> Healed;
public event Action<Vector3> Died;
public bool Alive { get; private set; }
private bool Initialized = false;
private List<Hitbox> CachedHitboxes;
public void Initialize(float maxHp, List<Hitbox> 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();
}
}