BITFALL/Assets/Artists/Scripts/Item/GunProperties.cs

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;
}
}