using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using BITKit; namespace BITFALL.Guns { /// /// 射击模式的接口 /// public interface IFireMode { float FireRate { get; } } /// /// 后坐力接口定义 /// public interface IRecoil:IProperty { /// /// 后坐力的方向 /// Vector3 Recoil { get; } } public interface ISpread:IProperty { /// /// 散射的方向 /// Vector2 Spread { get; } } [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; public Vector3 Recoil => recoil; } /// /// 射击模式的基类 /// public record FireMode : IFireMode { [SerializeField]protected float fireRate; public float FireRate => fireRate; } /// /// 自动开火模式 /// [System.Serializable] public record AutoFireMode : FireMode { } /// /// 半自动开火模式 /// [System.Serializable] public record SemiFireMode : FireMode { [SerializeField] private bool requireBoltAction; public bool RequireBoltAction => requireBoltAction; } /// /// 爆炸射击模式 BurstRound为爆炸开火时一次发射的子弹数量 /// /// [System.Serializable] public record BurstFireMode : FireMode { [SerializeField] protected int brustRound; [SerializeField] protected float burstFireInterval; public int BurstRound=> brustRound; public float BurstFireInterval => burstFireInterval; } public class AssetableGun : AssetableEquip { [Header(nameof(AssetableGun))] [SerializeReference, SubclassSelector] protected IFireMode fireMode = new AutoFireMode(); [SerializeField] private int initialDamage; [SerializeField] private int initialBulletForce; [SerializeField] private int initialBulletSpeed = 128; [SerializeField] private int initialAimZoom = 1; [SerializeField] private bool isScopeAim; [SerializeField] private Optional buckshot; public IFireMode FireMode => fireMode; public int InitialBulletForce => initialBulletForce; public int InitialDamage => initialDamage; public int InitialBulletSpeed => initialBulletSpeed; public int InitialAimZoom => initialAimZoom; public bool IsScopeAim => isScopeAim; public IOptional BuckShot => buckshot; } }