146 lines
3.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|