using System.Collections; using System.Collections.Generic; using UnityEngine; using static Extensions; public class Entity : LevelObject { //Attribut [SerializeField] private int _hp; [SerializeField] private float _speed; [SerializeField] private int _attack_damage; [SerializeField] private float _attack_speed; 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(); Animation = gameObject.AddComponent(); } //Start the animation of death and the fading of the entity public 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 int Hp { get { return _hp; } set { _hp = value; } } public float Speed { get { return _speed; } set { _speed = value; } } public int AttackDamage { get { return _attack_damage; } set { _attack_damage = value; } } public float AttackSpeed { get { return _attack_speed; } set { _attack_speed = value; } } 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_speed == _attack_speed && otherEntity._attack_damage == _attack_damage; } public override Dictionary ToDictionary() { var dict = base.ToDictionary(); dict[nameof(_hp)] = _hp; dict[nameof(_speed)] = _speed; dict[nameof(_attack_speed)] = _attack_speed; dict[nameof(_attack_damage)] = _attack_damage; dict[nameof(_attack_speed_wait)] = _attack_speed_wait; return dict; } public override void LoadDictionary(Dictionary dict) { base.LoadDictionary(dict); _hp = dict[nameof(_hp)].ToInt(); _speed = dict[nameof(_speed)].ToFloat(); _attack_speed = dict[nameof(_attack_speed)].ToFloat(); _attack_damage = dict[nameof(_attack_damage)].ToInt(); _attack_speed_wait = dict[nameof(_attack_speed_wait)].ToFloat(); } #endregion }