67 lines
1.7 KiB
C#

using System;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public abstract class Weapon : MonoBehaviour
{
//События
public event Action<int> AmmoAdded;
public event Action<int> AmmoChanged;
public event Action<Weapon> OnReloaded;
public event Action OnShoot;
[Header("Ссылки")]
[SerializeField] protected GameObject ProjectilePrefab;
[SerializeField] protected Transform ShootPoint;
[SerializeField] protected GameObject Owner;
[SerializeField] protected AudioSource ShootAudio;
public float damage;
[field: SerializeField] public int MaxAmmo { get; private set; } = 20;
[field: SerializeField] public int Ammo { get; private set; } = 20;
public float AmmoPercent => (float)Ammo / (float)MaxAmmo;
protected float LastShootTime = -1000;
protected bool reloaded;
//Свойства
public abstract bool CanShoot { get; }
public float ReloadPercent => Mathf.Min((Time.time - LastShootTime) / ReloadInterval, 1);
public float ReloadInterval = 5;
//Методы
public virtual void Shoot()
{
if(!CanShoot) return;
Ammo -= 1;
AmmoChanged?.Invoke(Ammo);
LastShootTime = Time.time;
reloaded = false;
if(ShootAudio != null)
ShootAudio.Play();
OnShoot?.Invoke();
}
public void FillAmmo()
{
int ammoDelta = MaxAmmo - Ammo;
Ammo = MaxAmmo;
AmmoChanged?.Invoke(Ammo);
AmmoAdded?.Invoke(ammoDelta);
}
public void SetReloaded()
{
reloaded = true;
OnReloaded?.Invoke(this);
}
private void Update()
{
if (!reloaded && ReloadPercent >= 1)
SetReloaded();
}
}