using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class Damageable : MonoBehaviour { public UnityEvent damageableHit; public UnityEvent healthChanged; Animator animator; [SerializeField] public int _maxHealth = 100; public int MaxHealth { get { return _maxHealth; } private set { _maxHealth = value; } } public int _health = 100; public int Health { get { return _health; } private set { _health = value; healthChanged?.Invoke(_health, MaxHealth); // if health < 0 character no longer alive if (_health <= 0) { IsAlive = false; } } } public bool _isAlive = true; [SerializeField] private bool isInvincible = false; public bool IsHit { get { return animator.GetBool(AnimationStrings.isHit); } private set { animator.SetBool(AnimationStrings.isHit, value); } } private float timeSinceHit = 0; public float invincibilityTime = 0.25f; public bool IsAlive { get { return _isAlive; } private set { _isAlive = value; animator.SetBool(AnimationStrings.isAlive, value); } } public bool LockVelocity { get { return animator.GetBool(AnimationStrings.lockVelocity); } set { animator.SetBool(AnimationStrings.lockVelocity, value); } } private void Awake() { animator = GetComponent(); } private void Update() { if (isInvincible) { if (timeSinceHit > invincibilityTime) { isInvincible = false; timeSinceHit = 0; } timeSinceHit += Time.deltaTime; } } public bool Hit(int damage, Vector2 knockBack) { if (_isAlive && !isInvincible) { Health -= damage; isInvincible = true; // notify other cubscribed components that damageable animator.SetTrigger(AnimationStrings.hitTrigger); LockVelocity = true; damageableHit?.Invoke(damage, knockBack); //CharacterEvents.characterDamaged.Invoke(gameObject, damage); return true; } return false; } public bool Heal(int healthRestored) { if (IsAlive) { int maxHealth = Mathf.Max(MaxHealth - Health, 0); int actualHeal = Mathf.Min(maxHealth, healthRestored); Health += actualHeal; //CharacterEvents.characterHealed(gameObject, actualHeal); return true; } else { return false; } } }