跳转到内容

武器与弹药

船载武器是需要炮手操作的建筑:四种武器(加农炮 / 机枪 / 防空炮 / 火焰喷射器)由“瞄准方式 + 射击策略 + 弹药消耗”三块拼装而成;弹药通过弹匣(输入容器)供弹,由船员装填,弹药档案(AmmoProfile)决定每种弹药对武器指标与弹丸效果的修正。

武器在本游戏中是一类船上建筑(1×2 格、Facility 层,见 建筑),玩家通过建造菜单建出后,必须有具备“炮术(Gunnery)“工作能力的船员上炮才会开火(开发模式可开”无人自动开火“作弊)。武器从自身的输入容器(弹匣)中消耗弹药,弹药耗尽时炮手会自动离炮去仓库搬运弹药并装填,形成”操炮 → 打空 → 装填 → 操炮“的循环。

游戏循环中的位置:武器是海上战斗(对 怪物 与敌船)的唯一输出手段,上游依赖 生产与制作(弹药兵工台配方)与 物品与库存(弹药搬运/预约),下游产出走 伤害与护甲元素与状态效果 两条结算管线。

玩家接触方式:

  • 建造:建造菜单放置武器建筑(加农炮快捷键 Alpha8、机枪 Alpha9、火焰喷射器 Alpha0、防空炮 U,来源 BuildingConfig.csv)。
  • 分配炮手:右键点击武器弹出分配气泡(WeaponPopupManager.cs),可选自动分配 / 手动指定船员 / 禁用该武器。
  • 全船操控(当前仅开发期入口):通过 开发者工具 在玩家船上挂载全船武器操控(ShipWeaponControl.cs):Tab 切换攻击方式(手动/半自动/全自动)、鼠标圆球指挥瞄准、左键投射武器开火 / 右键喷射武器开火、数字键 1-8 全船切换弹药档位。

每门武器 prefab 由若干组件拼出(BaseWeapon.cs 作为统一门面,建筑初始化时按固定顺序装配):

组件 必须 职责
瞄准组件(直线/抛物线/区域三选一) 必须 判定射程、计算弹道轨迹、驱动炮管转向
射击策略(投射式/持续效果式二选一) 必须 冷却、散布、过热、生成弹丸或维持喷射效果
WeaponConsumption 可选 按 CSV 配置检查并扣除每发弹药;弹匣/装填参数
TargetDetector 可选 索敌(范围、阵营、目标选择模式)
WeaponAutoFire 可选 自动开火循环(每秒 10 次决策,Inspector 字段 _updateFrequency
WeaponRotationController 可选 炮管旋转限位与平滑转动
MannedWeaponComponent 运行时自动挂载 维护“分配的炮手/当前操作员”状态

缺少瞄准组件、射击策略或发射点时武器直接禁用(报错日志);缺少 WeaponConsumption射击会被阻止BaseWeapon.cs 的资源请求回调返回失败,原因“缺少消耗组件”)。

每次射击请求(无论来自自动开火、操炮任务还是玩家鼠标)按以下顺序判定(ProjectileShootingStrategy.cs):

  1. 冷却检查:距上次开火不足“有效射击间隔”则忽略。有效射击间隔 = 射击间隔 ÷ max(0.1, 建筑效率系数)(效率系数来自建筑效率提供者,正常为 1)。
  2. 损坏检查:武器已过热损坏 → 拒绝射击(需修复,见“已知限制”)。
  3. 弹药消耗:向 WeaponConsumption 申请扣弹,不足则本次射击取消(触发“资源不足”事件)。注意:弹药在判定轨迹之前就已扣除,但若下一步轨迹计算失败弹药已消耗(见“已知限制”)。
  4. 轨迹计算:由瞄准组件给出弹道点列;失败(超射程)则中止。
  5. 过热判定:若开火前热量已 ≥ 过热阈值,投骰子判损坏(默认 10% 概率);未损坏则热量 +每发热量。
  6. 连射偏移累积:散布偏移 +每发偏移增量(封顶)。
  7. 生成弹丸:单次发射 N 颗(_projectileCount,量产武器均为 1),每颗落点 = 瞄准点 + 散布随机偏移 + 多发扩散图案偏移。
  8. 枪口特效、记录开火时间、触发射击成功事件。

直线弹道(LinearTrajectoryAiming.cs)— 机枪、防空炮

  • 射程判定:目标距离 ≤ 射击距离(机枪 40 米 / 防空炮 10 米,Inspector 字段 _shootingRange)。
  • 弹道为直线,按每 5 米一个节点分段(至少 8 段);弹丸以恒定弹速沿线飞行(两者均 50 米/秒,Inspector 字段 _projectileSpeed)。
  • 弹道方向用“上一次成功瞄准的目标位置”计算,避免炮管未转到位时弹道偏移。

抛物线弹道(ParabolicTrajectoryAiming.cs)— 加农炮

  • 重力取 9.8 米/秒²(代码常量),炮口初速 10 米/秒(Inspector 字段 _muzzleVelocity),轨迹时长 1 秒、16 段(Inspector 字段)。
  • 可命中判定(伪公式):判别式 = v⁴ − g × (g×水平距离² + 2×高度差×v²) ≥ 0;满足时取低弧解发射角。
  • 理论最大射程 = v² ÷ g,当前初速 10 → 约 10.2 米
  • 弹丸速度 = 轨迹总长 ÷ 轨迹时长(沿抛物线匀速)。

区域检测(AreaDetectionAiming.cs)— 火焰喷射器

  • 无弹丸飞行:命中判定 = 目标距离 ≤ 检测射程(6 米)且与炮口朝向夹角 ≤ 锥角的一半(锥角 15°)。两者均为 Inspector 字段(_detectionRange / _detectionConeAngle,火焰喷射器 prefab 内序列化)。

散布、连射偏移与多发扩散(WeaponSpreadModel.cs

Section titled “散布、连射偏移与多发扩散(WeaponSpreadModel.cs)”

三个互相独立(正交)的落点机制,全部作用在弹道终点的水平面偏移上:

机制 规则 公式
散布(单发随机) 每颗弹丸在圆盘内均匀随机取偏移 偏移半径 = 基础散布半径 + 当前连射偏移,圆盘均匀采样
连射偏移(越打越散) 每开一枪偏移 +每发增量,封顶 偏移上限;停火(含帧间)每秒回落 恢复速率 当前偏移 = min(上限, 当前偏移 + 每发增量)恢复:当前偏移 −= 恢复速率 × Δt
多发扩散(霰弹图案) 单次发射 >1 颗时,各弹丸沿横线均匀铺开;铺开宽度随距离线性放大 图案半宽 = 图案基准半径 × (目标距离 ÷ 参考距离);第 i 颗横向偏移 = ((i/(N−1))×2−1) × 图案半宽;单发恒为 0

量产武器三门投射武器的散布参数完全相同(Inspector 序列化在各武器 prefab):基础散布半径 0.2 米、每发偏移 +0.1 米、偏移上限 1 米、恢复 2 米/秒、扩散基准半径 0.3 米、参考距离 10 米。

  • 每发累积热量(默认 5),每秒散热(默认 20),过热阈值 100。
  • 判定顺序:开火瞬间先看“开火前是否已过热”,已过热则以 损坏概率(默认 0.1,即 10%)投骰子;损坏则本发不射出,武器进入损坏态,之后无法射击。
  • 由当前参数推导(非代码直接写明):机枪 4 发/秒 × 5 热 = 20 热/秒,恰好等于散热 20/秒,持续射击不会过热;防空炮 5 发/秒 净 +5 热/秒,持续射击约 20 秒后开始过热判定;加农炮远低于散热速率,不会过热。
  • 修复接口存在(清损坏、热量归零),但当前没有任何生产系统调用它(见“已知限制”)。

弹丸命中与伤害结算(Bullet.cs

Section titled “弹丸命中与伤害结算(Bullet.cs)”

弹丸沿预计算轨迹飞行,每帧用射线检测路径碰撞:跳过无伤害组件的装饰物、跳过友方(穿透继续飞),命中第一个有效敌方目标;飞完全程未命中则自毁。

基础伤害(每次结算共用)

基础结算伤害 = max(1, round((基础伤害 + 随机偏移[最小偏移, 最大偏移]) × 弹药物理伤害乘子))

飞行距离衰减(三段式,DamageFalloff.cs

衰减倍率 = 1 (飞行距离 ≤ 满伤距离)
= 1 → 最低比例 线性插值 (满伤距离 < 距离 < 最大射程)
= 最低比例 (距离 ≥ 最大射程)

脚本默认:满伤距离 10 米、最大射程 30 米、最低比例 1(= 不衰减)。当前三种量产弹药 prefab 均未序列化这组字段,全部使用脚本默认值,即衰减机制已实现但量产弹药实际不衰减

三种伤害模式

模式 适用 公式
单体(Single) 机枪弹、防空弹 最终伤害 = max(1, round(基础结算伤害 × 飞行衰减));元素通道同乘飞行衰减
爆炸(Explosion) 加农炮弹 对爆炸半径(3 米)内每个可锁定目标:综合衰减 = (1 − 目标距离÷爆炸半径) × 飞行衰减最终伤害 = max(1, round(基础结算伤害 × 综合衰减));船员不吃爆炸主伤害,统一走船员溅射
船员溅射 所有弹丸命中后追加 对命中点溅射半径内的船员(不可锁定目标):溅射伤害 = max(1, round(基础结算伤害 × 溅射比例 × (1 − 距离÷溅射半径)))

溅射参数(Inspector,弹药 prefab):三种弹药溅射半径均 5 米;溅射比例机枪弹/加农炮弹 0.1(10%)、防空弹 0.5(50%)。

命中附带效果(在伤害包结算后追加):

  • 元素状态施加:弹丸携带的每条元素载荷对目标投骰子叠层,施加几率 = 下一层基础几率 × (1 − 目标该元素抗性) × 元素浓度(封顶 100%;状态持续 4 秒,代码常量 StatusTuning.DefaultDuration)。弹丸元素浓度 Inspector 字段默认 1。详见 元素与状态效果
  • 平行减益词条:弹丸可配置命中直接施加的减益(移动/攻击/命中/建筑停转,不过元素抗性);量产弹药当前均未配置。
  • 伤害词条:物理通道词条进入伤害结算,反建筑/反生物词条对相应类别目标伤害 ×1.5(代码常量 CombatTuning.AntiCategoryMultiplier),详见 伤害与护甲

持续喷射(火焰喷射器:SingleEffectStrategy.cs + FlameProjectile.cs

Section titled “持续喷射(火焰喷射器:SingleEffectStrategy.cs + FlameProjectile.cs)”

触发与维持规则:

  • 开火创建一个持续火焰效果(消耗 1 次弹药作为“点火”),之后每 0.5 秒(Inspector 字段 _consumeInterval)扣一次弹药维持;扣不到弹药自动熄火。
  • 松开开火键立即熄火。单次喷射最大持续时长 _maxSprayDuration(Inspector,当前为 0 = 不限时);若配置了上限,到时自动熄火并封锁,必须松手后才能再次点火。
  • 火焰对锥形检测区内每个目标独立计时,每 0.2 秒一跳(Inspector 字段 _damageInterval),每跳伤害 = 每秒伤害 20 × 0.2 = 4火元素伤害(纯元素通道,无物理)。
  • 每跳同时按浓度投骰子施加火元素层数;支持按距离衰减元素强度:衰减 = clamp01(1 − 每米衰减度 × 距离)(当前每米衰减度 0 = 不衰减);支持独立的最大喷射距离门控(当前 0 = 沿用检测器范围 6 米)。

弹药档案与全船切档(AmmoProfile.cs / AmmoCatalog.cs / AmmoSlotFilter.cs

Section titled “弹药档案与全船切档(AmmoProfile.cs / AmmoCatalog.cs / AmmoSlotFilter.cs)”

弹药档案:每种弹药一份档案,装填该弹种时应用到武器与弹丸(代码静态表 AmmoCatalog.cs不是 CSV;注释声明数值定型后迁 CSV):

字段 作用对象 含义
SpreadMultiplier 武器 散布乘子(基础散布半径与偏移上限同乘;<1 更准)
HeatMultiplier 武器 每发热量乘子
FireRateMultiplier 武器 射击间隔乘子(<1 更快;下限 0.01)
ExtraTraits 弹丸 附加伤害词条(按位叠加到弹丸物理词条)
DamageMultiplier 弹丸 物理伤害乘子(下限 0.05)
Element / ElementAmount 弹丸 元素载荷类型与载荷量(>0 时在弹丸上追加一条元素伤害)

当前登记的弹种AmmoCatalog.cs,未登记弹种 = 全部无修正的默认档案):

弹药 ID 显示名 词条 物理乘子 元素载荷 备注
CannonShell 炮弹 反建筑(对建筑 ×1.5) 1 量产
AA_Gun_Bullet 防空弹 反生物(对怪物/船员 ×1.5) 1 量产
TestAmmo_Kinetic_火/冰/毒/电 动能X弹 1 对应元素 4 点 测试弹,数字键 1-4
TestAmmo_Element_火/冰/毒/电 火焰弹/寒霜弹/剧毒弹/闪电弹 0.4 对应元素 10 点 测试弹,数字键 5-8
Bullet(机枪子弹) —(回退原 ID) 1 未登记,默认档案

测试弹药(TestAmmo_*)不进物品表、不进生产链,仅配合“无限弹药”开发模式使用。

弹仓格子与筛选器:每门武器的弹仓可配置多格(WeaponConsumption.ConfigureAmmoSlots,运行时配置、不序列化),每格一个筛选器决定该格的弹种,三种筛选模式:任意(Any)/ 按元素(ByElement)/ 按弹种 ID(ByAmmoId)。未配置弹仓 = 单格,回退 CSV 的主弹药(Item1)。

全船切档ShipReloadCoordinator.cs + ShipWeaponControl.cs):玩家按数字键 1-9 → 全船所有武器同时切到各自弹仓的第 N 格(越界取最近合法格);切档即刻把新弹种的档案应用到投射策略。档案应用从开火基准值重算(首次应用时捕获基准),反复切换不会累积漂移。武器列表每 2 秒重建一次(应对武器增减),重建后保留当前档位。喷射式武器(无投射策略)不受弹药档案影响。

弹匣、消耗与装填(WeaponConsumption.cs + WeaponConsumptionConfig.csv

Section titled “弹匣、消耗与装填(WeaponConsumption.cs + WeaponConsumptionConfig.csv)”

弹匣 = 武器的输入容器(容器格数见 BuildingContainerConfig.csv:加农炮/机枪/火焰喷射器 1 格,防空炮 2 格)。CSV 中 MagazineCapacity 只约束主弹药(当前弹仓格指定弹种,否则 Item1)。

每发消耗:射击时检查 CSV 配置的全部消耗物品(最多 4 种)是否齐备,齐备则全部扣除,任一不足则本发取消。防空炮每发同时扣 1 发防空弹 + 5 个水。

装填判定与数量

弹匣比例 = clamp01(当前主弹药数 ÷ 弹匣容量)
需要装填 = 弹匣比例 ≤ 装填阈值 (无限弹药模式恒为否)
本次取弹量 = min(弹匣缺口, 每次装填量(0 视为缺口), 弹药源可用量)

当前 CSV 全量内容Assets/StreamingAssets/WeaponConsumptionConfig.csv,共 8 行数据,Dev/Prod 两套同名武器参数完全相同):

WeaponId 武器名 每发消耗 消耗间隔(秒) 弹匣容量 装填阈值 装填耗时(秒) 每次装填量
MachineGun_Dev / MachineGun_Prod 机枪 Bullet ×1 0 30 0.3 3 0(装满)
Cannon_Dev / Cannon_Prod 加农炮 CannonShell ×1 0 1 1 5 1
Flame_Dev / Flame_Prod 火焰喷射器 BeastOil ×1 0.5 100 0.2 4 0(装满)
AA_Gun_Dev / AA_Gun_Prod 防空炮 AA_Gun_Bullet ×1 + Water ×5 0 20 0.3 3.5 0(装满)

配置按建筑名自动匹配 CSV 行(WeaponId = 建筑名);找不到配置的武器不消耗任何资源也照常开火。

实际体验解读:加农炮容量 1、阈值 1、每次装 1 发 → 每打一发炮手就要跑一趟装填(装填耗时基准 5 秒);机枪打到剩 9 发(30×0.3)触发装填并一次装满;防空炮剩 6 发触发;火焰喷射器剩 20 兽油触发。

初始填充(Inspector 开关 _fillInitialResources,默认关):开局给每种消耗品塞一组,数量 = min(物品最大堆叠, 弹匣容量[仅主弹药])。

索敌与自动开火(TargetDetector.cs + WeaponAutoFire.cs

Section titled “索敌与自动开火(TargetDetector.cs + WeaponAutoFire.cs)”
  • 索敌半径(Inspector,TargetDetector _detectionRange,各武器 prefab 覆盖):加农炮 10 / 机枪 10 / 防空炮 15 / 火焰喷射器 10(米)。基础 prefab 默认 20。
  • 重新搜索间隔 0.5 秒(Inspector _detectionInterval);敌我判定走阵营关系动态判定(不可锁定的目标如船员不会被主动索敌,只会被弹道/范围波及)。
  • 目标选择模式(Inspector _selectionMode):基础 prefab 默认为随机(锁定一个随机目标直到死亡/出范围才换),防空炮覆盖为最近(每 0.5 秒重选最近目标)。加农炮/机枪/火焰喷射器继承随机模式。
  • 选定目标时会将其解析为“目标所在船上离本武器最近的建筑”作为实际瞄准点,让炮火自然落在敌船面向我方的外围建筑上;“最近”模式锁定期间还会每 0.3 秒重解析一次(代码常量),随机模式锁定后不再重解析。
  • WeaponAutoFire 以每秒 10 次(Inspector _updateFrequency)执行“找目标 → 瞄准 → 开火”循环;无目标即停火并通知炮管回归。自动开火仅在两种情况启用:作弊开关“无人自动开火”(CheatFlags.WeaponAutoFireWithoutCrew),或全船操控的半自动/全自动判定(见下)。船员上炮时自动开火被关闭,由操炮任务驱动同样的瞄准开火循环。

炮管旋转限位(WeaponRotationController.cs,基础 prefab 序列化值)

Section titled “炮管旋转限位(WeaponRotationController.cs,基础 prefab 序列化值)”
参数 说明
水平旋转限制 161.3° 以默认朝向为中心左右各一半
垂直旋转限制 90° 上下各一半
瞄准转速 360°/秒 朝目标转动
回归转速 180°/秒 无目标时转回默认朝向
回归延迟 1 秒 无目标后等待该时长才开始回归
对齐阈值 炮管与目标夹角小于该值才算“已对准”,对准才会开火

目标超出旋转扇形时瞄准失败(不开火)。

武器必须有炮手才工作(除作弊模式)。完整链路:

  1. 分配WeaponAssignmentManager.cs):自动分配挑选“可执行炮术工作类型”且未被其他武器占用的船员中炮术工作速度最高者(并按 HashId 稳定排序);手动分配(右键武器气泡)优先级高于自动,不会被自动改派。详见 船员
  2. 发任务GunneryTaskIssuer.cs,详见 任务与工作):对每门已分配武器:
    • 需要装填且全船有弹药 → 发装填任务
    • 需要装填但全船无弹药:手动分配的炮手会驻守炮位等弹药(仍发操炮任务),自动分配的则释放船员去干别的活;
    • 不需要装填 → 发操炮任务
    • 任务优先级随战斗状态(详见 遭遇与刷怪):日常 = 船员自己的炮术优先级;警戒 = 8;战斗岗位 = 11(代码常量,ShipCombatState.cs)。
  3. 操炮任务Task_OperateTurret.cs):走到炮位交互点 → 上炮(登记为操作员,关闭自动开火)→ 循环“索敌-瞄准-开火”,直到“需要装填且缺口 > 0”时结束循环 → 下炮。
  4. 装填任务Task_ReloadTurret.cs):在最近 12 个弹药源中找弹(按距离排序;排除所有武器自身的弹匣容器与输入容器)→ 预约 → 走过去取弹 → 搬回炮位 → 装入弹匣 → 原地等待装填时间。装填时间公式:
装填耗时 = CSV 基础装填耗时 × Lerp(1.2, 0.5, sqrt(max(0.04, 炮术工作速度))) ÷ 建筑效率

即速度 1.0 → 0.5 倍快;速度 0 → 约 1.06 倍(sqrt 内有 0.04 下限钳制,实际达不到端点 1.2);普通水手(约 0.11)≈ 0.97 倍。

全船操控与瞄准指示(开发期,ShipWeaponControl.cs

Section titled “全船操控与瞄准指示(开发期,ShipWeaponControl.cs)”

三种攻击方式(Tab 循环切换,AttackModeController.cs):

攻击方式 被鼠标圆球扇形覆盖的武器 未覆盖的武器
手动 Manual 跟随圆球瞄准,玩家按键开火 待命(不动不打)
半自动 SemiAuto 跟随圆球瞄准,玩家按键开火 自动索敌开火
全自动 FullAuto —(全部自动索敌,鼠标无效) 自动索敌开火
  • 鼠标圆球ShipMouseAimBall.cs):跟随鼠标在水平面投影,滚轮调半径(步长 1,范围 1-12 米,初始 3 米)。武器是否“被覆盖” = 圆球中心是否落在该武器的水平扇形内(扇形张角 60°、半径 20 米,ShipWeaponControl Inspector 字段)。
  • 开火键位:左键 = 投射式武器开火;右键 = 喷射式武器开火(两类武器分键,避免误喷)。
  • 瞄准指示器WeaponAimIndicator.cs,每门武器一个):水平扇形(可攻击范围投影)+ 最远射程对比色加粗弧线 + 武器到落点的虚线 + 落点圆圈(半径 = 真实散布有效半径,连射变大、停火回落,可见下限 0.3 米)+ 多发武器每颗弹丸一个小圈(半径 0.25 米,按扩散图案铺开)。喷射式武器只画扇形。
  • 默认瞄点(非鼠标操控时):取弹丸满伤距离(最佳伤害射程,当前默认 10 米)与扇形半径的较小值;弹丸未配衰减时回退到扇形半径的 60%。
  • 屏幕底部开发期角标显示当前攻击方式与装弹档位(IMGUI,正式 HUD 接管后移除)。

来源标注:【I】= Unity Inspector 序列化字段(武器/弹药 prefab,路径 Assets/Res/Art Assets/Weapon/Prefabs/);【C】= CSV(WeaponConsumptionConfig.csv 等);【K】= 代码常量。

参数 加农炮 机枪 防空炮 火焰喷射器 来源
弹药 炮弹 CannonShell 子弹 Bullet 防空弹 AA_Gun_Bullet + 水 ×5 兽油 BeastOil 【C】
基础伤害 100(爆炸) 25 ± 5 随机 30 每秒 20(火元素) 【I】弹药/特效 prefab
伤害模式 爆炸(半径 3 米,对范围内建筑类目标距离线性衰减) 单体 单体 持续区域(每目标 0.2 秒一跳,每跳 4 点) 【I】
弹药词条 反建筑(×1.5) 反生物(×1.5) 无(纯火元素) 【K】AmmoCatalog.cs;×1.5 为 CombatTuning.cs
射击间隔 0.7 秒 0.25 秒 0.2 秒 维持式:每 0.5 秒扣 1 兽油 【I】
理论持续输出(无装填) ≈143/秒 + 范围 ≈100/秒 150/秒(对生物 225/秒) 20/秒(每目标) 推导值
弹道 抛物线,初速 10 米/秒,最大射程 ≈10.2 米 直线,50 米/秒,射程 40 米 直线,50 米/秒,射程 10 米 锥形区域 6 米 / 15° 【I】
自动索敌半径 10 米 10 米 15 米 10 米 【I】prefab 覆盖
目标选择 随机锁定 随机锁定 最近 随机锁定 【I】
单次弹丸数 1 1 1 【I】
散布(基础/每发偏移/上限/恢复) 0.2 / +0.1 / 1 / 2 每秒(米) 同左 同左 【I】
过热(每发/阈值/散热/损坏率) 5 / 100 / 20 每秒 / 10% 同左 同左 【I】
弹匣容量 1 30 20 100 【C】
装填阈值 1(每发必装) 0.3(≤9 发) 0.3(≤6 发) 0.2(≤20 油) 【C】
装填基础耗时 5 秒 3 秒 3.5 秒 4 秒 【C】
每次装填量 1 发 装满 装满 装满 【C】
船员溅射(半径/比例) 5 米 / 10% 5 米 / 10% 5 米 / 50% 【I】弹药 prefab
弹匣格数(输入容器) 1 1 2 1 【C】BuildingContainerConfig.csv
建筑体格 / 血量 1×2 / 100 1×2 / 100 1×2 / 100 1×2 / 100 【C】BuildingConfig.csv
公式 出处
有效射击间隔 = 射击间隔 × 弹药射速乘子 ÷ max(0.1, 建筑效率) ProjectileShootingStrategy.cs
弹丸落点偏移 = 散布随机(半径 = 基础散布×弹药散布乘子 + 连射偏移) + 扩散图案(横线均匀铺开 × 距离/参考距离) WeaponSpreadModel.cs
过热损坏:开火前热量 ≥ 100 时,10% 概率永久损坏 WeaponHeatModel.cs(参数 Inspector)
物理伤害 = max(1, round((基础伤害 + 随机偏移) × 弹药物理乘子 × 飞行衰减)) Bullet.cs
爆炸伤害 = max(1, round(基础结算伤害 × (1 − 距离÷爆炸半径) × 飞行衰减)) Bullet.cs
船员溅射 = max(1, round(基础结算伤害 × 溅射比例 × (1 − 距离÷溅射半径))) Bullet.cs
飞行衰减 = 三段式(≤满伤距离为 1,线性降到最低比例;当前弹药最低比例 = 1 不衰减) DamageFalloff.cs
元素施加几率 = 下层基础几率 × (1 − 抗性) × 浓度,封顶 1;状态持续 4 秒 StatusEngine.cs / StatusTuning.cs
喷射每跳伤害 = 每秒伤害 × 伤害间隔 × clamp01(1 − 每米衰减度 × 距离) FlameProjectile.cs
需要装填 = 弹匣比例 ≤ 装填阈值(且缺口 > 0 才真正发装填任务) WeaponConsumption.cs / GunneryTaskIssuer.cs
装填耗时 = 基础耗时 × Lerp(1.2, 0.5, sqrt(max(0.04, 炮术速度))) ÷ 建筑效率 Task_ReloadTurret.cs
抛物线可命中:v⁴ − g(g·x² + 2y·v²) ≥ 0,g = 9.8 ParabolicTrajectoryAiming.cs
炮术任务优先级:日常 = 船员配置;警戒 = 8;战斗岗位 = 11 ShipCombatState.cs
物品 最大堆叠 获取方式 来源
Bullet 子弹 50 兵工台:1 铁板 + 1 火药 → 10 子弹(5 秒) 【C】StaticItemConfig.csv / RecipeConfig.csv
CannonShell 炮弹 200 兵工台:1 铁板 + 2 火药 → 5 炮弹(8 秒) 【C】同上
AA_Gun_Bullet 防空弹 50 无生产配方(仅初始填充等渠道) 【C】同上
BeastOil 兽油 50 屠宰台:1 怪物尸体 → 3 怪物肉 + 2 兽油(5 秒);也是火药原料(2 兽油 + 1 煤 → 3 火药) 【C】同上
Water 水 50 防空炮每发消耗 5;装填任务不搬水(只搬主弹药) 【C】同上
  • 伤害与护甲:弹丸命中产出伤害包(物理通道 + 词条 + 元素通道),护甲/抗性/反类别词条(×1.5)在那边结算。
  • 元素与状态效果:弹药元素载荷与火焰喷射器的火元素通过投骰子叠层进入状态系统(叠层 → 质变 → 反应)。
  • 船员:炮术工作速度影响自动分配排序与装填耗时;炮手被分配/操作状态显示在武器悬停信息(WeaponHoverInfoComponent.cs)。
  • 任务与工作:操炮/装填是 Gunnery 工作类型的两个任务,参与优先级竞争与抢占。
  • 生产与制作:子弹/炮弹/火药在兵工台生产,兽油来自屠宰。
  • 物品与库存:弹匣即输入容器;装填走容器预约 + 搬运,弹药源排除其他武器的弹匣。
  • 建筑 / 修建:武器是 1×2 设施建筑,有 100 血量,可被击毁。
  • 怪物 / 遭遇与刷怪:武器的主要目标;战斗状态等级抬升炮术任务优先级。
  • 阵营与外交:索敌与弹丸命中都按阵营关系动态判定敌我,弹丸穿透友方;命中归因(阵营 + 国籍)影响声望。
  • 开发者工具:无限弹药、无人自动开火、一键战斗布置、挂载全船操控 + 八格测试弹仓。
想调什么 改哪里
每发消耗的物品/数量、弹匣容量、装填阈值/耗时/每次装填量 Assets/StreamingAssets/WeaponConsumptionConfig.csv(策划可直接改,按建筑名匹配;Dev 与 Prod 两行都要改)
武器伤害、随机浮动、爆炸半径、船员溅射、命中特效 弹药 prefab:Assets/Res/Art Assets/Weapon/Prefabs/Bullets/(加农炮弹药 / 机枪弹药 / AA_Gun_Bullet)的 Bullet 组件
伤害随距离衰减(满伤距离/最大射程/最低比例) 同上弹药 prefab 的“伤害衰减”三字段(当前最低比例 = 1 即未启用)
射速、单次弹丸数、散布、过热 武器 prefab(Weapons/加农炮·机枪·AA_Gun.prefab)的 ProjectileShootingStrategy 组件
射程、弹速(直线)/ 初速、轨迹时长(抛物线) 武器 prefab 的 LinearTrajectoryAiming / ParabolicTrajectoryAiming 组件
火焰喷射范围/锥角、每秒伤害/伤害跳间隔、元素浓度/衰减、单次喷射时长上限 Weapons/火焰喷射器.prefabAreaDetectionAiming + SingleEffectStrategyEffects/火焰喷射器_火焰特效.prefabFlameProjectile
自动索敌半径、目标选择模式(最近/随机) 各武器 prefab 的 TargetDetector 覆盖值(基础值在 通用武器.prefab
炮管限位/转速/回归 通用武器.prefabWeaponRotationController(四门武器共用基础值)
弹药对武器/弹丸的修正(散布/热量/射速乘子、词条、元素载荷) AmmoCatalog.cs 静态表(需程序改;注释声明定型后迁 CSV)
反建筑/反生物倍率(1.5)、元素状态持续(4 秒) 代码常量:CombatTuning.cs / StatusTuning.cs(需程序改)
炮术任务战斗优先级(8 / 11) 代码常量:ShipCombatState.cs(需程序改)
装填速度曲线(1.2→0.5 / sqrt) 代码常量:Task_ReloadTurret.cs(需程序改)
全船操控扇形(60° / 20 米)、鼠标圆球半径范围、装弹档位数 ShipWeaponControl.cs / ShipMouseAimBall.cs 的 Inspector 字段(组件运行时挂载,当前实际生效的是字段默认值,改默认值需程序)
武器建筑血量/尺寸/快捷键、弹药堆叠/配方 BuildingConfig.csv / BuildingContainerConfig.csv / StaticItemConfig.csv / RecipeConfig.csv
  • 过热损坏无修复入口ProjectileShootingStrategy.Repair() 存在但没有任何生产代码调用,武器一旦过热损坏将永久无法射击。按当前参数只有防空炮长时间连射(约 20 秒以上)会触发。
  • 伤害衰减未启用:三种量产弹药 prefab 均未序列化衰减字段,使用脚本默认“最低比例 = 1”(不衰减)。瞄准指示器的“最佳伤害射程默认瞄点”因此固定取脚本默认满伤距离 10 米。
  • 切档只改“装什么”,不改“扣什么”:切换弹仓档位会改变装填/补给的弹种(PrimaryAmmoId)与弹药档案修正,但每发射击实际扣除的物品清单仍固定为 CSV 的 Item1-4。测试弹药因此只设计在无限弹药模式下使用。
  • 弹仓配置不持久:弹仓格子在运行时配置(八格测试弹仓由 DevTools 挂载时装配),不序列化、不进存档(见 存档)。
  • CSV 的 ConsumptionInterval 实际无效:投射武器射速由策略 Inspector 的射击间隔控制;火焰喷射器的维持扣弹间隔用的是 SingleEffectStrategy 自己的 Inspector 字段(当前与 CSV 的 0.5 数值相同但两处不联动)。
  • 防空弹与水没有补给闭环:AA_Gun_Bullet 无生产配方;装填任务只搬主弹药,水(每发 5 个)耗尽后没有自动补水任务,防空炮会静默停火。
  • 射程与索敌半径不一致:机枪弹道射程 40 米但索敌半径只有 10 米(自动交战实际只打 10 米内);防空炮反过来,索敌 15 米 > 弹道射程 10 米,会锁定 10-15 米间打不着的目标并持续瞄准失败。
  • 加农炮实际射程很短:初速 10 米/秒 → 抛物线最大射程约 10.2 米,与索敌半径 10 米勉强匹配;提高射程需同时调初速。
  • AA_Gun prefab 的武器显示名被覆盖为“机枪”_weaponName 覆盖值),建筑显示名(防空炮)来自 BuildingConfig.csv 不受影响,但日志与武器头顶文字会显示“机枪”。
  • 轨迹失败也扣弹:投射策略先扣弹药再算轨迹,轨迹计算失败(极少数边界情况)时该发弹药已消耗。
  • 全船操控/弹药切档仅开发期可用ShipWeaponControl 只能由 DevTools 挂载,底部档位角标是 IMGUI 开发期实现,按代码注释将由 UI Toolkit 底部操作栏接管(见 界面总览)。
  • WeaponData.CurrentAmmo 字段未使用:弹药计数真实来源是输入容器,该序列化字段是遗留。
  • 设计文档与实现的差异AmmoCatalog.cs 注释自述为“设计阶段代码级静态表”,对应设计文档中“弹药通用·武器指标修正 + 火药·特殊效果”与“弹仓·每格筛选器”条目已落地,但“火药特殊效果”目前仅有反建筑/反生物两种词条投入量产弹药。