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

105 lines
3.2 KiB
C#
Raw Normal View History

2023-09-01 14:33:54 +08:00
using System;
2023-06-08 14:09:50 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BITKit;
2023-08-27 02:58:19 +08:00
namespace BITFALL.Guns
2023-06-08 14:09:50 +08:00
{
/// <summary>
/// 射击模式的接口
/// </summary>
public interface IFireMode
{
float FireRate { get; }
}
/// <summary>
2023-09-01 14:33:54 +08:00
/// 后坐力接口定义
/// </summary>
public interface IRecoil:IProperty
{
/// <summary>
/// 后坐力的方向
/// </summary>
Vector3 Recoil { get; }
2023-11-30 00:23:23 +08:00
Vector3 ViewRecoilScale { get; }
2023-09-01 14:33:54 +08:00
}
2023-11-15 23:54:54 +08:00
public interface ISpread:IProperty
{
/// <summary>
/// 散射的方向
/// </summary>
Vector2 Spread { get; }
}
[Serializable]
[CustomType(typeof(ISpread))]
public struct VectorSpread:ISpread
{
[SerializeField] private Vector2 spread;
public Vector2 Spread => spread;
}
2023-09-01 14:33:54 +08:00
[Serializable]
[CustomType(typeof(IRecoil))]
public struct VectorRecoil:IRecoil
{
[SerializeField] private Vector3 recoil;
2023-11-30 00:23:23 +08:00
[SerializeField] private Vector3 viewRecoilWeight;
2023-09-01 14:33:54 +08:00
public Vector3 Recoil => recoil;
2023-11-30 00:23:23 +08:00
public Vector3 ViewRecoilScale => viewRecoilWeight;
2023-09-01 14:33:54 +08:00
}
/// <summary>
2023-06-08 14:09:50 +08:00
/// 射击模式的基类
/// </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
{
2023-10-31 18:07:15 +08:00
[SerializeField] private bool requireBoltAction;
public bool RequireBoltAction => requireBoltAction;
2023-06-08 14:09:50 +08:00
}
/// <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;
}
public class AssetableGun : AssetableEquip
{
2023-10-20 19:31:12 +08:00
[Header(nameof(AssetableGun))]
2023-10-31 18:07:15 +08:00
[SerializeReference, SubclassSelector] protected IFireMode fireMode = new AutoFireMode();
2023-10-24 23:37:59 +08:00
[SerializeField] private int initialDamage;
[SerializeField] private int initialBulletForce;
2023-10-29 15:27:13 +08:00
[SerializeField] private int initialBulletSpeed = 128;
2023-10-31 18:07:15 +08:00
[SerializeField] private int initialAimZoom = 1;
[SerializeField] private bool isScopeAim;
2023-11-21 18:05:18 +08:00
[SerializeField] private Optional<int> buckshot;
[SerializeField] private float initialHipFireSpread = 1;
2023-10-24 23:37:59 +08:00
public IFireMode FireMode => fireMode;
public int InitialBulletForce => initialBulletForce;
public int InitialDamage => initialDamage;
2023-10-29 15:27:13 +08:00
public int InitialBulletSpeed => initialBulletSpeed;
2023-10-31 18:07:15 +08:00
public int InitialAimZoom => initialAimZoom;
public bool IsScopeAim => isScopeAim;
2023-11-15 23:54:54 +08:00
public IOptional<int> BuckShot => buckshot;
2023-11-21 18:05:18 +08:00
public float InitialHipFireSpread => initialHipFireSpread;
2023-06-08 14:09:50 +08:00
}
}