la config des ennemis influencait la config des alliés, ce qui était un bug maintenant, il y a une config différente pour les alliés et les ennemis. l'animation d'attaque ne se terminait pas à temps pour faire le dégat, il a donc fallu multiplier la vitesse d'animation par le attack speed quand on attaque j'en ai profité pour faire la même chose pour le walk animation et le speed j'ai changé l'attribut des unités "attack speed" pour un "attack interval", pour que ça représente mieux son utilisation. Le multiplicateur reste sur la vitesse, et non sur l'interval. Les configs pour les ressources sont les valeurs des ressources directement (pas des multiplicateurs)
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 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
|
|
}
|