67 lines
1.8 KiB
C#
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("Вызываю перезаряжено");
|
|
}
|
|
} |