MIF_E31222398/Assets/Script/Damageable.cs

146 lines
3.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class Damageable : MonoBehaviour
{
public UnityEvent<int, Vector2> damageableHit;
public UnityEvent<int, int> 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<Animator>();
}
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;
}
}
}