using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class AbstractCharacter : MonoBehaviour { // // Core components of a character // protected Mover _mover; protected AbstractShooter _shooter; // // Characteristics and status of a character // // Speed in m/s [SerializeField] protected float _maxSpeed = 10; public float MaxSpeed { get { return _maxSpeed; } set { _maxSpeed = value; } } [SerializeField] protected int _maxHealth = 1; public int MaxHealth => _maxHealth; public int CurrentHealth { get; set; } [SerializeField] protected float _maxEnergy = 100; public float MaxEnergy => _maxEnergy; public float CurrentEnergy { get; set; } // Energy gained back per second [SerializeField] private float _energyRegen = 20; public float EnergyRegen { get { return _energyRegen; } set { _energyRegen = value; } } protected bool _isShooting; // True if the energy went down to zero protected bool _isDepleted; // Start is called before the first frame update void Start() { CurrentHealth = MaxHealth; CurrentEnergy = MaxEnergy; _mover = GetComponentInParent(); _shooter = GetComponentInParent(); if (_mover == null) { throw new MissingComponentException("No Mover !"); } if (_shooter == null) { throw new MissingComponentException("No Shooter !"); } } // Manages the energy of the character void Update() { if (!_isShooting && CurrentEnergy < MaxEnergy) { var regen = _isDepleted ? EnergyRegen * 0.75f : EnergyRegen; CurrentEnergy += regen * Time.deltaTime; } if (CurrentEnergy > MaxEnergy) { CurrentEnergy = MaxEnergy; if (_isDepleted) { _isDepleted = false; } } if (CurrentEnergy <= 0) { CurrentEnergy = 0; _isDepleted = true; } // The InputManager is executed before and updates it to true if needed _isShooting = false; // FIXME : Debug drawing to show energy level Debug.DrawLine(new Vector3(-5,4), new Vector3(-5 + 10 * CurrentEnergy/MaxEnergy,4),Color.blue); } public abstract void Move(Vector2 movementDirection); public abstract void Shoot(); private void OnCollisionEnter2D(Collision2D other) { Bullet bullet = other.gameObject.GetComponent(); if (bullet == null) { return; } Hurt(bullet.Damage); } public void Hurt(int damage) { CurrentHealth -= damage; if (CurrentHealth <= 0) { Death(); } } // Handles the death of the character, should be overriden protected abstract void Death(); }