武器与弹药
This content is not available in your language yet.
船载武器是需要炮手操作的建筑:四种武器(加农炮 / 机枪 / 防空炮 / 火焰喷射器)由“瞄准方式 + 射击策略 + 弹药消耗”三块拼装而成;弹药通过弹匣(输入容器)供弹,由船员装填,弹药档案(
AmmoProfile)决定每种弹药对武器指标与弹丸效果的修正。
武器在本游戏中是一类船上建筑(1×2 格、Facility 层,见 建筑),玩家通过建造菜单建出后,必须有具备“炮术(Gunnery)“工作能力的船员上炮才会开火(开发模式可开”无人自动开火“作弊)。武器从自身的输入容器(弹匣)中消耗弹药,弹药耗尽时炮手会自动离炮去仓库搬运弹药并装填,形成”操炮 → 打空 → 装填 → 操炮“的循环。
游戏循环中的位置:武器是海上战斗(对 怪物 与敌船)的唯一输出手段,上游依赖 生产与制作(弹药兵工台配方)与 物品与库存(弹药搬运/预约),下游产出走 伤害与护甲 与 元素与状态效果 两条结算管线。
玩家接触方式:
- 建造:建造菜单放置武器建筑(加农炮快捷键 Alpha8、机枪 Alpha9、火焰喷射器 Alpha0、防空炮 U,来源
BuildingConfig.csv)。 - 分配炮手:右键点击武器弹出分配气泡(
WeaponPopupManager.cs),可选自动分配 / 手动指定船员 / 禁用该武器。 - 全船操控(当前仅开发期入口):通过 开发者工具 在玩家船上挂载全船武器操控(
ShipWeaponControl.cs):Tab 切换攻击方式(手动/半自动/全自动)、鼠标圆球指挥瞄准、左键投射武器开火 / 右键喷射武器开火、数字键 1-8 全船切换弹药档位。
武器的组件拼装
Section titled “武器的组件拼装”每门武器 prefab 由若干组件拼出(BaseWeapon.cs 作为统一门面,建筑初始化时按固定顺序装配):
| 组件 | 必须 | 职责 |
|---|---|---|
| 瞄准组件(直线/抛物线/区域三选一) | 必须 | 判定射程、计算弹道轨迹、驱动炮管转向 |
| 射击策略(投射式/持续效果式二选一) | 必须 | 冷却、散布、过热、生成弹丸或维持喷射效果 |
WeaponConsumption |
可选 | 按 CSV 配置检查并扣除每发弹药;弹匣/装填参数 |
TargetDetector |
可选 | 索敌(范围、阵营、目标选择模式) |
WeaponAutoFire |
可选 | 自动开火循环(每秒 10 次决策,Inspector 字段 _updateFrequency) |
WeaponRotationController |
可选 | 炮管旋转限位与平滑转动 |
MannedWeaponComponent |
运行时自动挂载 | 维护“分配的炮手/当前操作员”状态 |
缺少瞄准组件、射击策略或发射点时武器直接禁用(报错日志);缺少 WeaponConsumption 时射击会被阻止(BaseWeapon.cs 的资源请求回调返回失败,原因“缺少消耗组件”)。
单次射击流程(投射式武器)
Section titled “单次射击流程(投射式武器)”每次射击请求(无论来自自动开火、操炮任务还是玩家鼠标)按以下顺序判定(ProjectileShootingStrategy.cs):
- 冷却检查:距上次开火不足“有效射击间隔”则忽略。有效射击间隔 =
射击间隔 ÷ max(0.1, 建筑效率系数)(效率系数来自建筑效率提供者,正常为 1)。 - 损坏检查:武器已过热损坏 → 拒绝射击(需修复,见“已知限制”)。
- 弹药消耗:向
WeaponConsumption申请扣弹,不足则本次射击取消(触发“资源不足”事件)。注意:弹药在判定轨迹之前就已扣除,但若下一步轨迹计算失败弹药已消耗(见“已知限制”)。 - 轨迹计算:由瞄准组件给出弹道点列;失败(超射程)则中止。
- 过热判定:若开火前热量已 ≥ 过热阈值,投骰子判损坏(默认 10% 概率);未损坏则热量 +每发热量。
- 连射偏移累积:散布偏移 +每发偏移增量(封顶)。
- 生成弹丸:单次发射 N 颗(
_projectileCount,量产武器均为 1),每颗落点 = 瞄准点 + 散布随机偏移 + 多发扩散图案偏移。 - 枪口特效、记录开火时间、触发射击成功事件。
弹道规则(三种瞄准方式)
Section titled “弹道规则(三种瞄准方式)”直线弹道(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 米。
过热与损坏(WeaponHeatModel.cs)
Section titled “过热与损坏(WeaponHeatModel.cs)”- 每发累积热量(默认 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 秒 | 无目标后等待该时长才开始回归 |
| 对齐阈值 | 2° | 炮管与目标夹角小于该值才算“已对准”,对准才会开火 |
目标超出旋转扇形时瞄准失败(不开火)。
船员需求与炮术任务链
Section titled “船员需求与炮术任务链”武器必须有炮手才工作(除作弊模式)。完整链路:
- 分配(
WeaponAssignmentManager.cs):自动分配挑选“可执行炮术工作类型”且未被其他武器占用的船员中炮术工作速度最高者(并按 HashId 稳定排序);手动分配(右键武器气泡)优先级高于自动,不会被自动改派。详见 船员。 - 发任务(
GunneryTaskIssuer.cs,详见 任务与工作):对每门已分配武器:- 需要装填且全船有弹药 → 发装填任务;
- 需要装填但全船无弹药:手动分配的炮手会驻守炮位等弹药(仍发操炮任务),自动分配的则释放船员去干别的活;
- 不需要装填 → 发操炮任务。
- 任务优先级随战斗状态(详见 遭遇与刷怪):日常 = 船员自己的炮术优先级;警戒 = 8;战斗岗位 = 11(代码常量,
ShipCombatState.cs)。
- 操炮任务(
Task_OperateTurret.cs):走到炮位交互点 → 上炮(登记为操作员,关闭自动开火)→ 循环“索敌-瞄准-开火”,直到“需要装填且缺口 > 0”时结束循环 → 下炮。 - 装填任务(
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 米,ShipWeaponControlInspector 字段)。 - 开火键位:左键 = 投射式武器开火;右键 = 喷射式武器开火(两类武器分键,避免误喷)。
- 瞄准指示器(
WeaponAimIndicator.cs,每门武器一个):水平扇形(可攻击范围投影)+ 最远射程对比色加粗弧线 + 武器到落点的虚线 + 落点圆圈(半径 = 真实散布有效半径,连射变大、停火回落,可见下限 0.3 米)+ 多发武器每颗弹丸一个小圈(半径 0.25 米,按扩散图案铺开)。喷射式武器只画扇形。 - 默认瞄点(非鼠标操控时):取弹丸满伤距离(最佳伤害射程,当前默认 10 米)与扇形半径的较小值;弹丸未配衰减时回退到扇形半径的 60%。
- 屏幕底部开发期角标显示当前攻击方式与装弹档位(IMGUI,正式 HUD 接管后移除)。
武器总参数表
Section titled “武器总参数表”来源标注:【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 |
弹药物品与生产链
Section titled “弹药物品与生产链”| 物品 | 最大堆叠 | 获取方式 | 来源 |
|---|---|---|---|
| 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】同上 |
与其他系统的交互
Section titled “与其他系统的交互”- 伤害与护甲:弹丸命中产出伤害包(物理通道 + 词条 + 元素通道),护甲/抗性/反类别词条(×1.5)在那边结算。
- 元素与状态效果:弹药元素载荷与火焰喷射器的火元素通过投骰子叠层进入状态系统(叠层 → 质变 → 反应)。
- 船员:炮术工作速度影响自动分配排序与装填耗时;炮手被分配/操作状态显示在武器悬停信息(
WeaponHoverInfoComponent.cs)。 - 任务与工作:操炮/装填是 Gunnery 工作类型的两个任务,参与优先级竞争与抢占。
- 生产与制作:子弹/炮弹/火药在兵工台生产,兽油来自屠宰。
- 物品与库存:弹匣即输入容器;装填走容器预约 + 搬运,弹药源排除其他武器的弹匣。
- 建筑 / 修建:武器是 1×2 设施建筑,有 100 血量,可被击毁。
- 怪物 / 遭遇与刷怪:武器的主要目标;战斗状态等级抬升炮术任务优先级。
- 阵营与外交:索敌与弹丸命中都按阵营关系动态判定敌我,弹丸穿透友方;命中归因(阵营 + 国籍)影响声望。
- 开发者工具:无限弹药、无人自动开火、一键战斗布置、挂载全船操控 + 八格测试弹仓。
配置与调参指南
Section titled “配置与调参指南”| 想调什么 | 改哪里 |
|---|---|
| 每发消耗的物品/数量、弹匣容量、装填阈值/耗时/每次装填量 | 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/火焰喷射器.prefab 的 AreaDetectionAiming + SingleEffectStrategy;Effects/火焰喷射器_火焰特效.prefab 的 FlameProjectile |
| 自动索敌半径、目标选择模式(最近/随机) | 各武器 prefab 的 TargetDetector 覆盖值(基础值在 通用武器.prefab) |
| 炮管限位/转速/回归 | 通用武器.prefab 的 WeaponRotationController(四门武器共用基础值) |
| 弹药对武器/弹丸的修正(散布/热量/射速乘子、词条、元素载荷) | 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 |
已知限制与注意事项
Section titled “已知限制与注意事项”- 过热损坏无修复入口:
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注释自述为“设计阶段代码级静态表”,对应设计文档中“弹药通用·武器指标修正 + 火药·特殊效果”与“弹仓·每格筛选器”条目已落地,但“火药特殊效果”目前仅有反建筑/反生物两种词条投入量产弹药。