using System; using UnityEngine; [RequireComponent(typeof(AudioSource))] public abstract class Weapon : MonoBehaviour { public event Action AmmoAdded; public event Action OnShoot; public event Action AmmoChanged; public event Action OnReloaded; [Header("Ссылки")] [SerializeField] protected GameObject ProjectilePrefab; [SerializeField] protected Transform ShootPoint; [SerializeField] protected GameObject Owner; [SerializeField] protected AudioSource ShootAudio; [field: SerializeField] public int MaxAmmo { get; private set; } = 20; public int Ammo = 20; public float AmmoPercent => (float)Ammo / (float)MaxAmmo; protected float LastShootTime = -1000; protected bool reloaded; //Свойства public abstract bool CanShoot { get; } public abstract float ReloadPercent { get; } //Методы public abstract void Shoot(); /// /// Вызывает событие выстрела для внешних систем. Списывает 1 снаряд. /// public void PerformShoot(AbstractProjectile projectile) { Ammo -= 1; AmmoChanged?.Invoke(Ammo); LastShootTime = Time.time; reloaded = false; ShootAudio?.Play(); OnShoot?.Invoke(projectile); } public void AddAmmo(int ammoToAdd) { Ammo += ammoToAdd; AmmoChanged?.Invoke(Ammo); AmmoAdded?.Invoke(ammoToAdd); } public void FillAmmo() { int ammoDelta = MaxAmmo - Ammo; Ammo = MaxAmmo; AmmoChanged?.Invoke(Ammo); AmmoAdded?.Invoke(ammoDelta); } public void SetReloaded() { reloaded = true; OnReloaded?.Invoke(this); Debug.Log("Вызываю перезаряжено"); } }