161 lines
4.6 KiB
C#
161 lines
4.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using BITKit;
|
|
using UnityEngine;
|
|
|
|
namespace BITFALL.Guns
|
|
{
|
|
#region Interfaces
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 射击模式的接口
|
|
/// </summary>
|
|
public interface IFireMode
|
|
{
|
|
float FireRate { get; }
|
|
}
|
|
/// <summary>
|
|
/// 后坐力接口定义
|
|
/// </summary>
|
|
public interface IRecoil:IProperty
|
|
{
|
|
/// <summary>
|
|
/// 后坐力的方向
|
|
/// </summary>
|
|
Vector3 Recoil { get; }
|
|
Vector3 ViewRecoilScale { get; }
|
|
}
|
|
public interface ISpread:IProperty
|
|
{
|
|
/// <summary>
|
|
/// 散射的方向
|
|
/// </summary>
|
|
Vector2 Spread { get; }
|
|
}
|
|
/// <summary>
|
|
/// 弹药类型
|
|
/// </summary>
|
|
public interface IAmmoType:IProperty
|
|
{
|
|
}
|
|
/// <summary>
|
|
/// 弹匣属性,无此属性则为无弹匣
|
|
/// </summary>
|
|
|
|
public interface IClip:IProperty,ICount,ICloneable
|
|
{
|
|
/// <summary>
|
|
/// 剩余子弹
|
|
/// </summary>
|
|
public int Remaining { get; set; }
|
|
/// <summary>
|
|
/// 容量
|
|
/// </summary>
|
|
public int Capacity { get; }
|
|
/// <summary>
|
|
/// 为空则为默认
|
|
/// </summary>
|
|
public IAmmoType AmmoType { get; }
|
|
/// <summary>
|
|
/// 指向的ScriptableObject
|
|
/// </summary>
|
|
public string AddressablePath { get; }
|
|
}
|
|
#endregion
|
|
|
|
[Serializable]
|
|
[CustomType(typeof(ISpread))]
|
|
public struct VectorSpread:ISpread
|
|
{
|
|
[SerializeField] private Vector2 spread;
|
|
public Vector2 Spread => spread;
|
|
}
|
|
[Serializable]
|
|
[CustomType(typeof(IRecoil))]
|
|
public struct VectorRecoil:IRecoil
|
|
{
|
|
[SerializeField] private Vector3 recoil;
|
|
[SerializeField] private Vector3 viewRecoilWeight;
|
|
public Vector3 Recoil => recoil;
|
|
public Vector3 ViewRecoilScale => viewRecoilWeight;
|
|
}
|
|
/// <summary>
|
|
/// 射击模式的基类
|
|
/// </summary>
|
|
public record FireMode : IFireMode {
|
|
[SerializeField]protected float fireRate;
|
|
public float FireRate => fireRate;
|
|
}
|
|
/// <summary>
|
|
/// 自动开火模式
|
|
/// </summary>
|
|
[System.Serializable]
|
|
public record AutoFireMode : FireMode
|
|
{
|
|
}
|
|
/// <summary>
|
|
/// 半自动开火模式
|
|
/// </summary>
|
|
[System.Serializable]
|
|
public record SemiFireMode : FireMode
|
|
{
|
|
[SerializeField] private bool requireBoltAction;
|
|
public bool RequireBoltAction => requireBoltAction;
|
|
}
|
|
/// <summary>
|
|
/// 爆炸射击模式 BurstRound为爆炸开火时一次发射的子弹数量
|
|
///
|
|
/// </summary>
|
|
[System.Serializable]
|
|
public record BurstFireMode : FireMode
|
|
{
|
|
[SerializeField] protected int brustRound;
|
|
[SerializeField] protected float burstFireInterval;
|
|
public int BurstRound=> brustRound;
|
|
public float BurstFireInterval => burstFireInterval;
|
|
}
|
|
[CustomType(typeof(IClip))]
|
|
[CustomType(typeof(ICount))]
|
|
[Serializable]
|
|
public class DefaultClip:IClip
|
|
{
|
|
[SerializeField]private int remaining;
|
|
[SerializeField]private int capacity;
|
|
[SerializeReference,SubclassSelector]private IAmmoType ammoType;
|
|
[SerializeField] private AssetableItem ammoItem;
|
|
private int _count;
|
|
|
|
public int Remaining
|
|
{
|
|
get => remaining;
|
|
set => remaining = value;
|
|
}
|
|
|
|
public int Capacity => capacity;
|
|
|
|
public IAmmoType AmmoType => ammoType;
|
|
|
|
public string AddressablePath => ammoItem.AddressablePath;
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"{(ammoItem != null ? ammoItem.Name : nameof(DefaultClip))}:{remaining}/{capacity}";
|
|
}
|
|
|
|
public object Clone() => new DefaultClip()
|
|
{
|
|
_count = _count,
|
|
ammoItem = ammoItem,
|
|
ammoType = ammoType,
|
|
capacity = capacity,
|
|
remaining = remaining
|
|
};
|
|
|
|
public int Count => Remaining;
|
|
}
|
|
}
|