74 lines
1.7 KiB
C#
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;
|
|
Damaged?.Invoke(consumedDamage);
|
|
|
|
if (Hp <= 0)
|
|
{
|
|
Alive = false;
|
|
UnsubscribeFromHitboxes();
|
|
Died?.Invoke(damagePosition);
|
|
}
|
|
|
|
HealthChanged?.Invoke(Hp);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
UnsubscribeFromHitboxes();
|
|
}
|
|
}
|