跳转到内容

生产与制作

把原料按配方转换成产品的核心经济系统:水泵—锅炉—引擎的全自动流体生产线,加上屠宰台、灶台、军械台、酒坊四种需要船员排队操作的制作工站。

生产系统负责船上所有“物品 A 变成物品 B”的转换。它处在游戏循环的中段:玩家通过修建摆下生产建筑,通过交易战利品与掉落获得原料,生产出的熟食供船员进食、弹药供武器射击、蒸汽供船只引擎推进。

生产建筑分两类,行为完全不同:

类型 建筑 驱动方式 玩家操作
自动生产(RequiresCrew=false) 水泵、锅炉、引擎 系统每 0.1 秒自动推进进度,无人值守 铺设管道连接、保证锅炉有煤
船员操作(RequiresCrew=true) 屠宰台、灶台、军械台、酒坊 玩家下制造订单,船员走过去干活 左键点击建筑打开制造面板,排队下单

玩家接触入口:左键点击任意 RequiresCrew 生产建筑会弹出“制造”模态面板(CraftingPresenter.cs / CraftingPanel.cs),左侧是配方卡片(输入/输出/耗时/工种),右侧是制造队列和输入/输出容器内容。自动生产建筑没有面板,依靠头顶状态条(BoilerStatusTag.cs / EngineStatusTag.cs / WaterPumpStatusTag.cs)和容器悬浮窗(ContainerPopupManager.cs,显示当前配方、进度条、队列数、引擎动力条、锅炉煤量条)反馈状态。

涉及的配置文件(均在 Assets/StreamingAssets/,详见配置表总览):

文件 内容
RecipeConfig.csv 配方:输入/输出/耗时/工作类型
ProductionBuildingConfig.csv 建筑生产参数:是否需要船员
BuildingContainerConfig.csv 各建筑输入/输出/存储容器格子数
FluidPortConfig.csv 流体端口:建筑哪个格子接管道、进出什么流体

配方全部来自 CSV 配置表 RecipeConfig.csv(策划可直接改),按 BuildingId 自动绑定到同名建筑(ProductionComponent.cs 默认自动加载模式)。每条配方包含:多输入物品表(JSON 字典)、多输出物品表(JSON 字典)、生产时间(秒)、工作类型。配方合法性要求:必须有输出、生产时间大于 0(RecipeConfigItemExtension.cs)。

配方全表(RecipeConfig.csv 当前共 10 条,全量收录):

建筑 配方 输入 输出 耗时(秒) 工作类型
WaterPump 水泵 水泵生产 水 ×10 2.0 (自动)
Boiler 锅炉 锅炉生产 水 ×10 + 煤炭 ×1 蒸汽 ×10 + 饮用水 ×1 3.0 (自动)
Engine 引擎 引擎生产 蒸汽 ×10 水 ×1 5.0 (自动)
ButcherTable 屠宰台 屠宰怪物 怪物尸体 ×1 怪物肉 ×3 + 兽油 ×2 5.0 Cooking
Galley 灶台 烹饪熟食 怪物肉 ×1 + 饮用水 ×1 熟食 ×1 4.0 Cooking
AmmoBench 军械台 制造火药 兽油 ×2 + 煤炭 ×1 黑火药 ×3 6.0 Crafting
AmmoBench 军械台 制造子弹 铁板 ×1 + 黑火药 ×1 子弹 ×10 5.0 Crafting
AmmoBench 军械台 铸造炮弹 铁板 ×1 + 黑火药 ×2 炮弹 ×5 8.0 Crafting
Brewery 酒坊 酿怪物酒 怪物肉 ×4 + 饮用水 ×2 + 木头 ×1 怪物酒 ×1 8.0 Brewing
Brewery 酒坊 兑Grog 怪物酒 ×1 + 饮用水 ×4 格罗格酒 ×4 2.0 Brewing

由此形成四条生产链:

  1. 动力链:海水 →(水泵)水 →(锅炉,耗煤)蒸汽 + 饮用水 →(引擎)船只动力 + 冷凝水回流
  2. 食物链:怪物尸体 →(屠宰台)怪物肉 + 兽油 →(灶台,配饮用水)熟食
  3. 弹药链:兽油 + 煤 →(军械台)黑火药;铁板 + 黑火药 →(军械台)子弹 / 炮弹
  4. 酒水链:怪物肉 + 饮用水 + 木头 →(酒坊)怪物酒 → 兑水 → 格罗格酒

生产周期:投料在结束瞬间、事务式结算

Section titled “生产周期:投料在结束瞬间、事务式结算”

无论自动还是船员操作,一次生产周期的资源结算都发生在周期结束的瞬间,且是事务性的(ProductionComponent.cs 的生产结算逻辑):

  1. 周期开始前检查:输入容器里每种输入物品数量足够 + 输出容器有空间放下全部输出。
  2. 周期进行中不扣料——原料一直留在输入容器里。
  3. 周期结束时重新验证输入与输出条件,然后一次性扣除全部输入、写入全部输出;任何一步失败则把已扣/已写的物品全部回滚,本次产出作废。

多输出的空间检查是原子性的:先按各物品的最大堆叠数(StaticItemConfig.csv 的 MaxStackSize 列,物品未配置时代码默认 50)算出现有堆叠的剩余空间,再算总共还需要几个空槽位,需求超过输出容器空槽数就判“空间不足”,整个周期不开始。

自动生产(水泵 / 锅炉 / 引擎)

Section titled “自动生产(水泵 / 锅炉 / 引擎)”

自动生产建筑初始化时自动选中第 0 号配方并立即开机(ProductionComponent.cs 序列化字段 _defaultRecipeIndex=0、_autoStart=true,在 prefab Inspector 中改)。之后由 Tick 系统以每秒 10 次(100 毫秒一次,TickFrequency.cs 的 TenTimesPerSecond=100)推进:

每次 Tick:生产进度 += deltaTime × 综合效率 / 配方生产时间
进度 ≥ 1 时:执行事务结算,进度 -= 1(余量保留进下一周期)

即:实际周期耗时 = 配方生产时间 ÷ 综合效率(秒)。

条件检查做了节流:只在“进度为 0(周期刚要开始)“或”正在等待资源“时检查,且两次检查至少间隔 30 帧(约 0.5 秒,ProductionComponent.cs 代码常量 CheckInterval=30)。所以补料后最多约 0.5 秒生产才会恢复。

自动生产会被两件事打断:

  • 建筑停转 debuff(战斗中被命中施加,见元素与状态效果):停转期间 Tick 直接跳过,进度冻结。
  • 等待资源:输入不足或输出满时挂起,每约 0.5 秒重查一次。背压设计——输出容器满 = 生产停止,不会丢失任何物品。
综合效率 = 生产效率 × 建筑效率
  • 生产效率来自 IProductionEfficiencyProvider.cs,目前唯一实现是锅炉的煤量曲线(BoilerCoalComponent.cs),其他建筑恒为 1。
  • 建筑效率来自 IBuildingEfficiencyProvider,目前唯一实现是 Repairable.cs:建筑血量 ≤ 30% 时效率 0.5,否则 1.0(代码常量 SevereDamageThreshold=0.3)。见伤害与护甲

锅炉煤量效率曲线(按绝对煤数,不看容量比例):

煤 = 0 → 效率 0(熄火)
煤 = 1 → 效率 0.5(_minEfficiency)
煤 1 到 5 → 从 0.5 线性升到 1.0:效率 = lerp(0.5, 1.0, (煤-1)/(5-1))
煤 ≥ 5 → 效率 1.0(_coalForFullPower)

注意:锅炉的煤不会被效率曲线额外消耗——煤只作为配方输入在周期结算时扣 1 个(避免双扣,BoilerCoalComponent.cs 注释明确声明)。

锅炉参数 默认值 来源
煤炭容量基准(CoalCapacity) 50 个 Inspector 序列化字段 _coalCapacity(Boiler prefab)
补煤触发阈值 煤量比率 < 0.7(即 < 35 个煤) Inspector 序列化字段 _refuelRequestThreshold
有煤最低效率 0.5 Inspector 序列化字段 _minEfficiency
满功率所需煤数 5 个 Inspector 序列化字段 _coalForFullPower

引擎的 EnginePowerComponent.cs 每 0.1 秒输出一个 0~1 的实时动力信号:

目标值 = 引擎正在积极生产 ? clamp01(综合效率) : 0
当前输出以恒定速率向目标值靠近,从 0 到 1(或反向)全程耗时 = _smoothingSeconds(默认 1 秒)

即蒸汽供上后约 1 秒动力爬满,断供后约 1 秒归零。所有引擎的输出之和乘以单引擎功率,经 ShipEngineBinding.cs 折算成船速倍率(速度倍率 = 总功率^(1/3) × 质量 sigmoid),详见船只_smoothingSeconds 是 Inspector 序列化字段(Engine prefab)。

自动生产线之间靠管道运输流体。流体就是普通物品(Water / Steam,最大堆叠均为 50),存在建筑的输入/输出容器里,管道只负责瞬时转移:

端口:每个流体建筑按 FluidPortConfig.csv 配置输入/输出端口,端口直接读写建筑的输入/输出容器。端口配置全表(共 7 条):

配置 建筑 类型 流体 网格偏移
WaterPump_WaterOutput 水泵 输出 (0,0,0)
Boiler_WaterInput 锅炉 输入 (0,0,0)
Boiler_SteamOutput 锅炉 输出 蒸汽 (1,0,1)
Engine_SteamInput 引擎 输入 蒸汽 (0,0,0)
Engine_WaterOutput 引擎 输出 (1,0,1)
AA_Gun_WaterInput 防空炮(Dev/Prod 各一条) 输入 (0,0,0)

连接:管道与管道之间六向连接(含上下跨甲板层,GridDirections.cs 的 Adjacent3D);建筑端口只与水平四向相邻的管道连接(Adjacent)。

网络:连通的管道自动合并成一个网络;拆掉管道导致断开时自动检测连通性并分裂成多个网络(FluidSystemManager.cs)。

一网一流体:网络的占用流体由“实际有货的生产者端口”决定;最后一个生产者断开时占用物立即清空(PipeNetwork.cs)。占用物不同的两个网络不能用一根管道连起来——建造时 CanPlacePipeAt 会拒绝放置(经 PipeCompatibilityValidator.cs 接入建造校验)。

传输:每 0.1 秒一次,瞬时、无流量上限。把所有匹配生产者端口的存货一次性取出,均分给所有未满的消费者端口(余数从前往后多分 1 个);消费者装不下的部分退回生产者。所有消费者都满时不取货(背压,货留在生产者输出容器里,从而停掉上游生产)。

防空炮的水输入端口是给武器供水用的:防空炮每次射击消耗 AA 子弹 ×1 + 水 ×5(WeaponConsumptionConfig.csv),可以用管道从水泵直接供水,详见武器与弹药

每个 RequiresCrew 建筑各有一条独立队列(ProductionQueue.cs),通过制造面板操作:

  • 下单:选数量 ×1 / ×5 / ×10 / INF(无限,内部值 -1),点“添加”。数量语义是配方执行次数,不是产出件数(例如“制造子弹 ×5”= 执行 5 轮 = 产出 50 发子弹)。
  • 执行顺序:严格从上到下取第一个“未暂停且未完成”的订单执行;队首订单暂停后自动跳到下一条。
  • 队列操作:暂停/恢复、上移、下移、删除单条、清空全部。任何让“当前应执行订单”发生变化的操作(暂停/删除/重排/清空)都会立即取消在途的不匹配生产任务和搬料任务(ProductionTaskIssuer.cs / ProductionFetchIssuer.cs 监听队列变更事件)。
  • 完成:每执行成功一轮计数 +1,达到目标次数后订单自动从队列移除。
  • 下单无需校验材料:缺料的订单会一直占着队首等待搬运工补料(面板上能看到输入容器现状,每 0.4 秒刷新)。

队列是纯运行时数据,存档不保存,读档后队列清空(ProductionQueue.cs 注释明确说明),见存档

船员操作生产由三个全局任务发布器驱动(注册于 TaskIssuerRegistry.cs,持续扫描全部建筑),加上锅炉专用的第四个。任务框架机制详见任务与工作

第一步:搬料(ProductionFetchIssuer.cs

队首订单的每种输入物品,若输入容器存量 < 配方需求,就发搬运请求(数量 = 差额)。两个关键规则:

  • 全料齐才搬:发请求前先统计全船可用存量(排除该建筑自己的输入容器),只要有任何一种输入凑不齐,所有输入都不搬——避免半套原料搬来后卡死在工作台里。
  • 每种物品同时只有一个在途搬运任务;源头选最近的容器(候选上限 8 个,按距离排序),取货前对源容器做预留。生产建筑的输入容器本身被排除在全船取货源之外,其他任务不会从工作台里把料“偷走”(ContainerRegistry 行为,有单元测试佐证)。

搬运统一是 Hauling 工种(TaskDefs.Haul)。船员执行:走到源容器 → 拾取(瞬时)→ 走到工作台交互点 → 校验订单仍有效(瞬时)→ 放入输入容器(瞬时)(Task_HaulToContainer.cs)。订单中途被暂停/删除则任务失败。

第二步:制作(ProductionTaskIssuer.csTask_Produce.cs

当队首订单的输入已齐、输出有空间时,为该建筑发一个生产任务(每建筑同时最多 1 个)。工种由配方的 WorkType 列决定:Cooking → 烹饪工种,Crafting → 制作工种,其他值(含空和 Brewing)→ 一律按制作工种。

船员执行四步:

步骤 耗时 失败条件
1. 走到建筑交互点 取决于路径(见寻路与移动
2. 工作 配方生产时间 ÷ 建筑综合效率(秒),进度每帧推进 建筑没了 / 订单失效 / 输入不足 / 输出满
3. 二次校验订单 瞬时 订单失效
4. 事务结算(扣料 + 产出) 瞬时 结算失败仅记日志,不计完成次数

注意:船员的技能和工作速度不影响制作耗时——工作步骤的推进速率只乘建筑综合效率(Task_Produce.cs 的工作步骤),技能只在抢单优先级里起微小作用(见下)。

第三步:出货(ProductionOutputIssuer.cs

持续扫描所有 RequiresCrew 建筑的输出容器,对每种有货物品发搬运任务(每建筑每物品同时 1 个),送往最近的能接收该物品的仓储容器(候选上限 8 个)。搬运数量 = min(容器现存量, 目标容器可接收量)。这一步与制作并行,所以输出容器(2~3 格)一般不会堵;若全船仓库都满了,输出滞留会反过来卡住第二步的“输出有空间”检查。

锅炉补煤(BoilerTaskIssuer.csTask_SupplyBoiler.cs

锅炉煤量比率低于 0.7(即少于 35 个煤)时发补煤任务(每锅炉同时 1 个,Hauling 工种)。船员:走到煤源 → 拾取(单趟上限 10 个,SupplyBoilerRequest.cs 代码常量 MaxCoalPerTrip=10)→ 走回锅炉 → 逐个铲煤入炉。铲煤有时间成本,受船员搬运工作速度影响:

单个煤的铲入间隔 = lerp(2.0 秒, 0.3 秒, sqrt(max(0.04, 搬运速度系数))) × random(1 ± 波动)
波动幅度 = 0.15 / (1 + 3 × 搬运速度系数)

Steps.ShovelCoal.cs 代码常量:最慢 2.0 秒/个、最快 0.3 秒/个。)炉满时剩余煤丢到地面。每趟结束后若煤量仍低于 35 会继续发起下一趟;回到 35 以上即停发,直到再次跌破 35 才补下一趟。由于单趟上限 10 个,锅炉煤量长期在 35 上下(约 35~45)波动,不会主动补满到 50——50 只是容量上限。

生产相关任务请求的基础优先级层级都是 Default=5(ConsumerPriorityConfig.cs 的 PriorityTierConstants,1~9 为玩家可调普通区间,10 紧急、11 强制)。船员选任务时的有效优先级公式:

有效优先级 = 玩家给该船员设置的工种优先级 × 100 + 工种内在优先级 × 10 + 技能等级(0~20)

工种内在优先级(WorkType.cs 代码常量):医疗 8 > 需求 7 > 炮术 6 > 指挥 5 > 建造 4 > 烹饪 3 > 制作 2 > 布道 1 > 搬运 0 > 社交 -1。即玩家面板上的工种优先级差 1 级就压倒一切;同级时烹饪任务比制作任务先被领,搬运垫底;同工种同级时技能高者优先(最多差 20 点,只够打破平局)。

公式 出处
实际生产周期 = 配方生产时间 ÷ (生产效率 × 建筑效率) ProductionComponent.cs
自动生产进度增量/Tick = deltaTime × 综合效率 ÷ 生产时间 ProductionComponent.cs
锅炉效率 = 0(无煤)/ lerp(0.5, 1, (煤-1)/4)(1~5 个煤)/ 1(≥5 个煤) BoilerCoalComponent.cs
建筑效率 = 血量 ≤ 30% ? 0.5 : 1.0 Repairable.cs
引擎动力 = 向(积极生产 ? 综合效率 : 0)平滑靠近,全程 1 秒 EnginePowerComponent.cs
铲煤间隔 = lerp(2.0s, 0.3s, sqrt(max(0.04, 搬运速度))) × (1±波动) Steps.ShovelCoal.cs
抢单优先级 = 工种优先级×100 + 内在优先级×10 + 技能(0~20) ConsumerPriorityConfig.cs
多输出空间需求 = Σ 各输出超出现有堆叠余量后所需新槽位数 ProductionComponent.cs
管网分配 = 总供给 ÷ 未满消费者数(余数从前往后 +1,装不下退回) PipeNetwork.cs

ProductionBuildingConfig.csv(共 7 行,全量)+ BuildingContainerConfig.csv 容器容量(单位:槽位格,每格按物品 MaxStackSize 堆叠):

建筑 生产速度倍率(未生效,见已知限制) 需要船员 输入容器 输出容器
WaterPump 水泵 1.0 0 格 1 格
Boiler 锅炉 1.0 3 格(0 号格锁水、1 号格锁煤) 3 格
Engine 引擎 1.0 1 格 1 格
ButcherTable 屠宰台 1.0 2 格 2 格
Galley 灶台 1.0 3 格 2 格
AmmoBench 军械台 1.0 3 格 3 格
Brewery 酒坊 1.0 3 格 2 格

锅炉输入容器的格子过滤(0 号格只收水、1 号格只收煤)由 BoilerCoalComponent.cs 初始化时设置,防止水和煤互抢格子;第 3 格无过滤。

参数 来源
生产 / 管网 / 引擎动力 Tick 频率 每秒 10 次(100 毫秒) 代码常量,ProductionComponent.cs / FluidSystemManager.cs / EnginePowerComponent.cs
自动生产条件复查间隔 ≥ 30 帧(约 0.5 秒) 代码常量 CheckInterval,ProductionComponent.cs
补煤单趟上限 10 个煤 代码常量 MaxCoalPerTrip,SupplyBoilerRequest.cs
搬运源/目标候选容器上限 8 个(搬料的全船存量预检为 50 个) 代码常量,ProductionFetchIssuer.cs / ProductionOutputIssuer.cs
制造面板容器内容刷新间隔 0.4 秒 代码常量 RefreshInterval,CraftingPanel.cs
锅炉头顶状态条刷新间隔 0.2 秒 代码常量 RefreshInterval,BoilerStatusTag.cs
制造面板下单数量挡位 1 / 5 / 10 / 无限 代码常量,CraftingPanel.cs
任务并发上限 每建筑 1 个制作任务;每建筑每物品 1 个搬入 + 1 个搬出;每锅炉 1 个补煤 代码逻辑,各 Issuer
  • 水泵:每 2 秒产 10 水(输出仅 1 格 = 缓冲上限 50 水,满则停)。
  • 锅炉:每 3 秒吃 10 水 + 1 煤,产 10 蒸汽 + 1 饮用水。即每秒吃约 3.33 水,单台水泵(每秒 5 水)可喂 1.5 台锅炉;煤耗 = 每 3 秒 1 个 = 20 个/分钟。
  • 引擎:每 5 秒吃 10 蒸汽(每秒 2 蒸汽),单台锅炉(每秒约 3.33 蒸汽)可喂约 1.67 台引擎;每周期回吐 1 水可用管道送回锅炉。
  • 锅炉副产饮用水 = 每 3 秒 1 个,是不靠岸时的淡水来源(饮用水有保鲜期,见物品与库存)。
  • 物品与库存:生产建筑的输入/输出容器是标准容器;输入容器被全局取货扫描排除(料不被偷);搬运全程走预留机制防止超卖;流体(水/蒸汽)也是普通堆叠物品。
  • 任务与工作:四个生产相关发布器(搬料/制作/出货/补煤)全部走统一任务框架;涉及烹饪/制作/搬运三个工种;玩家可在工作优先级面板为每个船员调整工种优先级(0 = 禁用该工种)。
  • 船员:船员是唯一劳动力。注意制作耗时不吃技能加成;铲煤速度吃搬运工作速度。
  • 船只:引擎动力信号汇总成船速;蒸汽断供约 1 秒后船开始失去动力。
  • 武器与弹药:军械台是子弹/炮弹/黑火药的唯一生产源;防空炮靠管道供水(每发耗水 5);火焰喷射器烧兽油(屠宰台产出)。
  • 修建:生产建筑与管道的建造;管道放置受“不可连接两种流体网络”校验。
  • 伤害与护甲 / 元素与状态效果:建筑血量 ≤ 30% 时生产效率减半;停转 debuff 冻结自动生产。
  • 怪物 / 战利品与掉落:怪物尸体是食物链和兽油链的源头原料。
  • 时间与调度:生产、管网、引擎全部挂在每秒 10 次的 Tick 档位。
  • 存档:制造队列不持久化,读档后需重新下单。
  • 界面总览:制造面板(Modal 层)、建筑头顶状态条(UGUI 世界标签)、容器悬浮窗。
  • 物品数据表:所有生产物品的堆叠/保鲜/腐败参数。
想调什么 改哪里
配方的输入/输出/耗时/工种 Assets/StreamingAssets/RecipeConfig.csv(InputsJson/OutputsJson 是 JSON 字典,如 {"IronPlate":1,"BlackPowder":1};改数值无需重新生成代码——生成类运行时直接读 CSV,仅增删列时才需跑 Unity 菜单 Tools → CSV Code Generator → Generate All)
给建筑加新配方 RecipeConfig.csv 加一行,BuildingId 填建筑名即可(配方按建筑名自动加载,ProductionComponent.cs_autoLoadRecipes=true)
某建筑是否需要船员操作 ProductionBuildingConfig.csv 的 RequiresCrew 列
输入/输出缓冲大小 BuildingContainerConfig.csv 的 InputCapacity / OutputCapacity(单位:格)
产品单格堆叠上限 StaticItemConfig.csv 的 MaxStackSize 列
锅炉煤效率曲线 / 补煤阈值 / 煤容量 Boiler prefab 上 BoilerCoalComponent 的 Inspector 字段(_minEfficiency_coalForFullPower_refuelRequestThreshold_coalCapacity
补煤单趟数量 程序改 SupplyBoilerRequest.cs 的 MaxCoalPerTrip 常量
铲煤快慢手感 程序改 Steps.ShovelCoal.cs 的 fastInterval / slowInterval 常量
引擎动力响应速度 Engine prefab 上 EnginePowerComponent_smoothingSeconds
建筑流体端口位置/类型 FluidPortConfig.csv
受损建筑的效率惩罚 程序改 Repairable.cs 的 EfficiencyModifier(0.5)与阈值(0.3)
生产任务的工种归属 RecipeConfig.csv 的 WorkType 列(运行时仅识别 Cooking / Crafting,其余落入 Crafting)
工种之间的内在排序 程序改 WorkType.cs 的 GetInherentPriority
  • ProductionBuildingConfig.csv 的 ProductionSpeed 列没有生效:该列只存在于生成的配置类(ProductionBuildingConfig.cs)中,运行时生产逻辑从未读取。想调单建筑速度目前只能改配方耗时。
  • 制造队列不存档ProductionQueue.cs 注释明确声明是纯运行时数据,SaveSystem 不保存生产组件运行时状态,读档后队列丢失。
  • WorkType “Brewing” 未被识别:酒坊两条配方的 WorkType 写的是 Brewing,但 ProductionTaskIssuer.cs 的映射只认 Cooking / Crafting,Brewing 落入默认分支按制作(Crafting)工种处理;制造面板的工种中文映射表(CraftingPanel.cs)也没有 Brewing 条目,会直接显示英文原文。
  • 船员技能不影响制作耗时Task_Produce.cs 工作步骤的速率只乘建筑综合效率。技能唯一的作用是抢单平局时的微小加权(优先级公式中 ×1 的技能项)和铲煤间隔。
  • 停转 debuff 只拦自动生产ProductionComponent.cs 的 Tick 检查停转状态,但 Task_Produce.cs 的船员工作步骤不检查——停转中的屠宰台仍可被船员正常操作。
  • 自动生产周期结算失败会吞掉进度:进度满 1 时若输出恰好被塞满导致结算失败,进度照样减 1,该周期白做(原料不会丢,扣料在事务内有回滚)。
  • Recipe.cs(ScriptableObject 版配方)是遗留代码:配方已全面走 CSV(RecipeConfigItem),该 ScriptableObject 不再被生产链路使用,但文件和创建菜单仍在。
  • OnProductionCycleCompleted 事件已无消费者:原本供引擎滑动窗口统计用,引擎改为实时信号方案后事件仍保留但全代码库无人订阅。
  • 设计文档《制作》是空页Docs/Notion/设计/玩法系统/制作 2d6130ec771080e5ab19f4c4601bfad0.md 只有标题,本页内容全部以代码为准。
  • 下单数量是执行次数不是产出件数:界面上“×10“的子弹订单实际产出 100 发,验收数值时注意换算。
  • 搬料的“全料齐才搬”预检范围与实际取货范围不一致:预检统计最近 50 个候选容器的存量,实际取货只在最近 8 个候选里预留;极端情况下(原料分散在大量容器)可能预检通过但取货失败,下一轮发布器扫描会自动重试。