Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / item / weapon / WeaponAttribute.cs
@小李xl 小李xl on 6 May 2023 8 KB 处理ActivityMark表达式参数
  1. using System;
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 武器上的属性
  6. /// </summary>
  7. public class WeaponAttribute
  8. {
  9. /// <summary>
  10. /// 武器显示的名称
  11. /// </summary>
  12. public string Name = "Gun1";
  13. /// <summary>
  14. /// 武器 Prefab, 必须继承场景 "res://prefab/weapon/Weapon.tscn"
  15. /// </summary>
  16. public string WeaponPrefab = ResourcePath.prefab_weapon_Weapon_tscn;
  17. /// <summary>
  18. /// 武器类型
  19. /// </summary>
  20. public WeaponWeightType WeightType = WeaponWeightType.MainWeapon;
  21. /// <summary>
  22. /// 武器的图片
  23. /// </summary>
  24. public string Sprite2D = ResourcePath.resource_sprite_gun_gun1_png;
  25. /// <summary>
  26. /// 是否连续发射, 如果为false, 则每次发射都需要扣动扳机
  27. /// </summary>
  28. public bool ContinuousShoot = true;
  29. /// <summary>
  30. /// 弹夹容量
  31. /// </summary>
  32. public int AmmoCapacity = 30;
  33. /// <summary>
  34. /// 弹药容量上限
  35. /// </summary>
  36. public int MaxAmmoCapacity = 120;
  37. /// <summary>
  38. /// 起始备用弹药数量
  39. /// </summary>
  40. public int StandbyAmmoCapacity = 90;
  41. /// <summary>
  42. /// 装弹时间, 单位: 秒
  43. /// </summary>
  44. public float ReloadTime = 1.5f;
  45. /// <summary>
  46. /// 每粒子弹是否是单独装填, 如果是, 那么每上一发子弹的时间就是 ReloadTime, 可以做霰弹武器装填效果
  47. /// </summary>
  48. public bool AloneReload = false;
  49. /// <summary>
  50. /// 单独装填时每次装填子弹数量, 必须要将 'AloneReload' 属性设置为 true
  51. /// </summary>
  52. public int AloneReloadCount = 1;
  53. /// <summary>
  54. /// 单独装填的子弹时可以立即射击, 必须要将 'AloneReload' 属性设置为 true
  55. /// </summary>
  56. public bool AloneReloadCanShoot = false;
  57. /// <summary>
  58. /// 是否为松发开火, 也就是松开扳机才开火, 若要启用该属性, 必须将 'ContinuousShoot' 设置为 false
  59. /// </summary>
  60. public bool LooseShoot = false;
  61. /// <summary>
  62. /// 最少需要蓄力多久才能开火, 必须将 'LooseShoot' 设置为 true
  63. /// </summary>
  64. public float MinChargeTime = 0f;
  65. /// <summary>
  66. /// 连续发射最小次数, 仅当 ContinuousShoot 为 false 时生效
  67. /// </summary>
  68. public int MinContinuousCount = 1;
  69. /// <summary>
  70. /// 连续发射最大次数, 仅当 ContinuousShoot 为 false 时生效
  71. /// </summary>
  72. public int MaxContinuousCount = 1;
  73. /// <summary>
  74. /// 按下一次扳机后需要多长时间才能再次感应按下
  75. /// </summary>
  76. public float TriggerInterval = 0;
  77. /// <summary>
  78. /// 初始射速, 初始每分钟能开火次数
  79. /// </summary>
  80. public float StartFiringSpeed = 300;
  81. /// <summary>
  82. /// 最终射速, 最终每分钟能开火次数, 仅当 ContinuousShoot 为 true 时生效
  83. /// </summary>
  84. public float FinalFiringSpeed = 300;
  85. /// <summary>
  86. /// 按下扳机并开火后射速增加速率
  87. /// </summary>
  88. public float FiringSpeedAddSpeed = 2;
  89. /// <summary>
  90. /// 松开扳机后射速消散速率
  91. /// </summary>
  92. public float FiringSpeedBackSpeed = 10;
  93. /// <summary>
  94. /// 单次开火发射子弹最小数量
  95. /// </summary>
  96. public int MinFireBulletCount = 1;
  97. /// <summary>
  98. /// 单次开火发射子弹最大数量
  99. /// </summary>
  100. public int MaxFireBulletCount = 1;
  101. /// <summary>
  102. /// 开火前延时
  103. /// </summary>
  104. public float DelayedTime = 0f;
  105. /// <summary>
  106. /// 初始散射半径
  107. /// </summary>
  108. public float StartScatteringRange = 0;
  109. /// <summary>
  110. /// 最终散射半径
  111. /// </summary>
  112. public float FinalScatteringRange = 20;
  113. /// <summary>
  114. /// 每次发射后散射增加值
  115. /// </summary>
  116. public float ScatteringRangeAddValue = 2;
  117. /// <summary>
  118. /// 松开扳机后散射销退速率
  119. /// </summary>
  120. public float ScatteringRangeBackSpeed = 10;
  121. /// <summary>
  122. /// 子弹飞行最大距离
  123. /// </summary>
  124. public float MaxDistance = 600;
  125. /// <summary>
  126. /// 子弹飞行最小距离
  127. /// </summary>
  128. public float MinDistance = 800;
  129. /// <summary>
  130. /// 武器精灵的旋转中心坐标
  131. /// </summary>
  132. public Vector2 CenterPosition = new Vector2(0, 0);
  133. /// <summary>
  134. /// 开火位置
  135. /// </summary>
  136. public Vector2 FirePosition = new Vector2(11, 0);
  137. /// <summary>
  138. /// 握把位置
  139. /// </summary>
  140. public Vector2 HoldPosition = new Vector2(4, -3);
  141. /// <summary>
  142. /// 重量
  143. /// </summary>
  144. public float Weight = 11;
  145. /// <summary>
  146. /// 最大后坐力 (仅用于开火后武器身抖动)
  147. /// </summary>
  148. public float MaxBacklash = 4;
  149. /// <summary>
  150. /// 最小后坐力 (仅用于开火后武器身抖动)
  151. /// </summary>
  152. public float MinBacklash = 2;
  153. /// <summary>
  154. /// 后坐力偏移回归回归速度
  155. /// </summary>
  156. public float BacklashRegressionSpeed = 35f;
  157. /// <summary>
  158. /// 开火后武器口上抬角度
  159. /// </summary>
  160. public float UpliftAngle = 30;
  161. /// <summary>
  162. /// 武器默认上抬角度
  163. /// </summary>
  164. public float DefaultAngle = 0;
  165. /// <summary>
  166. /// 开火后武器口角度恢复速度倍数
  167. /// </summary>
  168. public float UpliftAngleRestore = 1f;
  169.  
  170. /// <summary>
  171. /// 克隆一份新的属性配置
  172. /// </summary>
  173. /// <returns></returns>
  174. public WeaponAttribute Clone()
  175. {
  176. var attr = _Clone();
  177. if (AiUseAttribute != null)
  178. {
  179. attr.AiUseAttribute = AiUseAttribute._Clone();
  180. }
  181. return attr;
  182. }
  183.  
  184. private WeaponAttribute _Clone()
  185. {
  186. var attr = new WeaponAttribute();
  187. attr.Name = Name;
  188. attr.WeaponPrefab = WeaponPrefab;
  189. attr.WeightType = WeightType;
  190. attr.Sprite2D = Sprite2D;
  191. attr.ContinuousShoot = ContinuousShoot;
  192. attr.AmmoCapacity = AmmoCapacity;
  193. attr.MaxAmmoCapacity = MaxAmmoCapacity;
  194. attr.StandbyAmmoCapacity = StandbyAmmoCapacity;
  195. attr.ReloadTime = ReloadTime;
  196. attr.AloneReload = AloneReload;
  197. attr.AloneReloadCount = AloneReloadCount;
  198. attr.AloneReloadCanShoot = AloneReloadCanShoot;
  199. attr.LooseShoot = LooseShoot;
  200. attr.MinChargeTime = MinChargeTime;
  201. attr.MinContinuousCount = MinContinuousCount;
  202. attr.MaxContinuousCount = MaxContinuousCount;
  203. attr.TriggerInterval = TriggerInterval;
  204. attr.StartFiringSpeed = StartFiringSpeed;
  205. attr.FinalFiringSpeed = FinalFiringSpeed;
  206. attr.FiringSpeedAddSpeed = FiringSpeedAddSpeed;
  207. attr.FiringSpeedBackSpeed = FiringSpeedBackSpeed;
  208. attr.MinFireBulletCount = MinFireBulletCount;
  209. attr.MaxFireBulletCount = MaxFireBulletCount;
  210. attr.DelayedTime = DelayedTime;
  211. attr.StartScatteringRange = StartScatteringRange;
  212. attr.FinalScatteringRange = FinalScatteringRange;
  213. attr.ScatteringRangeAddValue = ScatteringRangeAddValue;
  214. attr.ScatteringRangeBackSpeed = ScatteringRangeBackSpeed;
  215. attr.MaxDistance = MaxDistance;
  216. attr.MinDistance = MinDistance;
  217. attr.CenterPosition = CenterPosition;
  218. attr.FirePosition = FirePosition;
  219. attr.HoldPosition = HoldPosition;
  220. attr.Weight = Weight;
  221. attr.MaxBacklash = MaxBacklash;
  222. attr.MinBacklash = MinBacklash;
  223. attr.BacklashRegressionSpeed = BacklashRegressionSpeed;
  224. attr.UpliftAngle = UpliftAngle;
  225. attr.DefaultAngle = DefaultAngle;
  226. attr.UpliftAngleRestore = UpliftAngleRestore;
  227. attr.AiTargetLockingTime = AiTargetLockingTime;
  228. return attr;
  229. }
  230.  
  231. //------------------------------ Ai相关 -----------------------------
  232.  
  233. /// <summary>
  234. /// 用于Ai, 目标锁定时间, 也就是瞄准目标多久才会开火
  235. /// </summary>
  236. public float AiTargetLockingTime = 0;
  237. /// <summary>
  238. /// 用于Ai, Ai使用该武器发射的子弹速度缩放比
  239. /// </summary>
  240. public float AiBulletSpeedScale = 0.7f;
  241.  
  242. /// <summary>
  243. /// 用于Ai, Ai使用该武器消耗弹药的概率, (0 - 1)
  244. /// </summary>
  245. public float AiAmmoConsumptionProbability = 0f;
  246. /// <summary>
  247. /// Ai 使用该武器时的武器数据, 设置该字段, 可让同一把武器在敌人和玩家手上有不同属性
  248. /// </summary>
  249. public WeaponAttribute AiUseAttribute;
  250. }