1
This commit is contained in:
160
Assets/Artists/Scripts/Item/GunProperties.cs
Normal file
160
Assets/Artists/Scripts/Item/GunProperties.cs
Normal file
@@ -0,0 +1,160 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user