67 lines
1.7 KiB
C#
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();
|
|
}
|
|
} |