67 lines
1.8 KiB
C#

using System;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public abstract class Weapon : MonoBehaviour
{
public event Action<int> AmmoAdded;
public event Action<AbstractProjectile> OnShoot;
public event Action<int> AmmoChanged;
public event Action<Weapon> 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();
/// <summary>
/// Вызывает событие выстрела для внешних систем. Списывает 1 снаряд.
/// </summary>
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("Вызываю перезаряжено");
}
}