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; public float MaxSpeed { get { return _maxSpeed; } set { _maxSpeed = value; } } [SerializeField] protected int _maxHealth; public int MaxHealth => _maxHealth; public int CurrentHealth { get; set; } [SerializeField] protected float _maxEnergy; public float MaxEnergy => _maxEnergy; public float CurrentEnergy { get; set; } // Energy gained back per second [SerializeField] private float _energyRegen; 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() { MaxSpeed = 10; _maxHealth = 1; CurrentHealth = MaxHealth; _maxEnergy = 100; CurrentEnergy = MaxEnergy; EnergyRegen = 20; _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; } // The InputManager is executed before and updates it to true if needed _isShooting = false; } public abstract void Move(Vector2 movementDirection); public abstract void Shoot(); // TODO : Manage hurt + OnCollision + Death'n stuff public void Hurt() { throw new System.NotImplementedException(); } }