166 lines
4.4 KiB
C#
166 lines
4.4 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public abstract class Entity : LevelObject
|
|
{
|
|
//Attribut
|
|
[SerializeField]
|
|
private int _hp;
|
|
[SerializeField]
|
|
private float _speed;
|
|
[SerializeField]
|
|
private int _attack_damage = 2;
|
|
[SerializeField]
|
|
private float _attack_interval = 2;
|
|
private float _attack_speed_wait = 0f;
|
|
private AnimationEntity _animation;
|
|
private Shader _shaderGUItext;
|
|
private Shader _shaderSpritesDefault;
|
|
private SpriteRenderer[] _spriteRenderers;
|
|
|
|
//Enemy Spotted
|
|
private bool _isEnemyDetected = false;
|
|
private Entity _enemy;
|
|
|
|
//Methods
|
|
public virtual void Start()
|
|
{
|
|
_spriteRenderers = GetComponentsInChildren<SpriteRenderer>();
|
|
Animation = gameObject.AddComponent<AnimationEntity>();
|
|
}
|
|
public virtual void Update()
|
|
{
|
|
Animation.AttackSpeedMultiplier = AttackSpeedMultiplier;
|
|
Animation.SpeedMultiplier = SpeedMultiplier;
|
|
}
|
|
//Start the animation of death and the fading of the entity
|
|
public virtual void Death()
|
|
{
|
|
_animation.PlayDieAnim();
|
|
Invoke("Dying", 0.1f);
|
|
}
|
|
|
|
//Recursive method that fade the dying entity
|
|
void Dying()
|
|
{
|
|
foreach (SpriteRenderer renderer in _spriteRenderers)
|
|
{
|
|
Color currentColor = renderer.color;
|
|
currentColor.a = currentColor.a - 0.1f;
|
|
renderer.color = currentColor;
|
|
}
|
|
|
|
if(_spriteRenderers[0].color.a > 0f) {
|
|
Invoke("Dying", 0.1f);
|
|
}else {
|
|
Destroy(gameObject);
|
|
}
|
|
|
|
}
|
|
|
|
//When hit : get damage and start a flash of light
|
|
public void Hit(int damage)
|
|
{
|
|
|
|
_hp-=damage;
|
|
|
|
_shaderGUItext = Shader.Find("GUI/Text Shader");
|
|
_shaderSpritesDefault = Shader.Find("Sprites/Default");
|
|
|
|
foreach (SpriteRenderer renderer in _spriteRenderers)
|
|
{
|
|
renderer.material.shader = _shaderGUItext;
|
|
}
|
|
Invoke("ReturnNormalColor", 0.1f);
|
|
}
|
|
|
|
//End the flash of light from the method above
|
|
void ReturnNormalColor()
|
|
{
|
|
|
|
foreach (SpriteRenderer renderer in _spriteRenderers)
|
|
{
|
|
renderer.material.shader = _shaderSpritesDefault;
|
|
}
|
|
}
|
|
|
|
public void Move() {
|
|
if(!_animation.IsWalking) {
|
|
_animation.PlayWalkAnim();
|
|
}
|
|
}
|
|
|
|
//GETTERS AND SETTERS
|
|
|
|
public abstract Vector2 RangeMultiplier { get; }
|
|
public abstract float HpMultiplier { get; }
|
|
public abstract float SpeedMultiplier { get; }
|
|
public abstract float DamageMultiplier { get; }
|
|
public abstract float AttackSpeedMultiplier { get; }
|
|
|
|
public int Hp => (int)(_hp * HpMultiplier);
|
|
|
|
public float Speed => _speed * SpeedMultiplier;
|
|
|
|
public int AttackDamage => (int)(_attack_damage * DamageMultiplier);
|
|
|
|
public float AttackInterval => _attack_interval / AttackSpeedMultiplier;
|
|
|
|
public float AttackSpeedWait
|
|
{
|
|
get { return _attack_speed_wait; }
|
|
set { _attack_speed_wait = value; }
|
|
}
|
|
|
|
public bool IsEnemyDetected
|
|
{
|
|
get { return _isEnemyDetected; }
|
|
set { _isEnemyDetected = value; }
|
|
}
|
|
|
|
public Entity Enemy
|
|
{
|
|
get { return _enemy; }
|
|
set { _enemy = value; }
|
|
}
|
|
|
|
public AnimationEntity Animation
|
|
{
|
|
get { return _animation; }
|
|
set { _animation = value; }
|
|
}
|
|
|
|
#region [LevelManager code]
|
|
public override bool Equals(ILevelObject other)
|
|
{
|
|
return other is Entity otherEntity
|
|
&& base.Equals(otherEntity)
|
|
&& otherEntity._hp == _hp
|
|
&& otherEntity._speed == _speed
|
|
&& otherEntity._attack_interval == _attack_interval
|
|
&& otherEntity._attack_damage == _attack_damage;
|
|
}
|
|
public override Dictionary<string, object> ToDictionary()
|
|
{
|
|
var dict = base.ToDictionary();
|
|
|
|
dict[nameof(_hp)] = _hp;
|
|
dict[nameof(_speed)] = _speed;
|
|
dict[nameof(_attack_interval)] = _attack_interval;
|
|
dict[nameof(_attack_damage)] = _attack_damage;
|
|
|
|
return dict;
|
|
}
|
|
public override void LoadDictionary(Dictionary<string, object> dict)
|
|
{
|
|
base.LoadDictionary(dict);
|
|
|
|
_hp = dict[nameof(_hp)].ToInt();
|
|
_speed = dict[nameof(_speed)].ToFloat();
|
|
_attack_interval = dict[nameof(_attack_interval)].ToFloat();
|
|
_attack_damage = dict[nameof(_attack_damage)].ToInt();
|
|
}
|
|
#endregion
|
|
}
|