生产与制作
This content is not available in your language yet.
把原料按配方转换成产品的核心经济系统:水泵—锅炉—引擎的全自动流体生产线,加上屠宰台、灶台、军械台、酒坊四种需要船员排队操作的制作工站。
生产系统负责船上所有“物品 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 |
由此形成四条生产链:
- 动力链:海水 →(水泵)水 →(锅炉,耗煤)蒸汽 + 饮用水 →(引擎)船只动力 + 冷凝水回流
- 食物链:怪物尸体 →(屠宰台)怪物肉 + 兽油 →(灶台,配饮用水)熟食
- 弹药链:兽油 + 煤 →(军械台)黑火药;铁板 + 黑火药 →(军械台)子弹 / 炮弹
- 酒水链:怪物肉 + 饮用水 + 木头 →(酒坊)怪物酒 → 兑水 → 格罗格酒
生产周期:投料在结束瞬间、事务式结算
Section titled “生产周期:投料在结束瞬间、事务式结算”无论自动还是船员操作,一次生产周期的资源结算都发生在周期结束的瞬间,且是事务性的(ProductionComponent.cs 的生产结算逻辑):
- 周期开始前检查:输入容器里每种输入物品数量足够 + 输出容器有空间放下全部输出。
- 周期进行中不扣料——原料一直留在输入容器里。
- 周期结束时重新验证输入与输出条件,然后一次性扣除全部输入、写入全部输出;任何一步失败则把已扣/已写的物品全部回滚,本次产出作废。
多输出的空间检查是原子性的:先按各物品的最大堆叠数(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 |
引擎动力输出
Section titled “引擎动力输出”引擎的 EnginePowerComponent.cs 每 0.1 秒输出一个 0~1 的实时动力信号:
目标值 = 引擎正在积极生产 ? clamp01(综合效率) : 0当前输出以恒定速率向目标值靠近,从 0 到 1(或反向)全程耗时 = _smoothingSeconds(默认 1 秒)即蒸汽供上后约 1 秒动力爬满,断供后约 1 秒归零。所有引擎的输出之和乘以单引擎功率,经 ShipEngineBinding.cs 折算成船速倍率(速度倍率 = 总功率^(1/3) × 质量 sigmoid),详见船只。_smoothingSeconds 是 Inspector 序列化字段(Engine prefab)。
流体管网(水 / 蒸汽)
Section titled “流体管网(水 / 蒸汽)”自动生产线之间靠管道运输流体。流体就是普通物品(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),可以用管道从水泵直接供水,详见武器与弹药。
制造队列(船员操作建筑)
Section titled “制造队列(船员操作建筑)”每个 RequiresCrew 建筑各有一条独立队列(ProductionQueue.cs),通过制造面板操作:
- 下单:选数量 ×1 / ×5 / ×10 / INF(无限,内部值 -1),点“添加”。数量语义是配方执行次数,不是产出件数(例如“制造子弹 ×5”= 执行 5 轮 = 产出 50 发子弹)。
- 执行顺序:严格从上到下取第一个“未暂停且未完成”的订单执行;队首订单暂停后自动跳到下一条。
- 队列操作:暂停/恢复、上移、下移、删除单条、清空全部。任何让“当前应执行订单”发生变化的操作(暂停/删除/重排/清空)都会立即取消在途的不匹配生产任务和搬料任务(
ProductionTaskIssuer.cs/ProductionFetchIssuer.cs监听队列变更事件)。 - 完成:每执行成功一轮计数 +1,达到目标次数后订单自动从队列移除。
- 下单无需校验材料:缺料的订单会一直占着队首等待搬运工补料(面板上能看到输入容器现状,每 0.4 秒刷新)。
队列是纯运行时数据,存档不保存,读档后队列清空(ProductionQueue.cs 注释明确说明),见存档。
生产任务链:谁来做、何时做
Section titled “生产任务链:谁来做、何时做”船员操作生产由三个全局任务发布器驱动(注册于 TaskIssuerRegistry.cs,持续扫描全部建筑),加上锅炉专用的第四个。任务框架机制详见任务与工作。
第一步:搬料(ProductionFetchIssuer.cs)
队首订单的每种输入物品,若输入容器存量 < 配方需求,就发搬运请求(数量 = 差额)。两个关键规则:
- 全料齐才搬:发请求前先统计全船可用存量(排除该建筑自己的输入容器),只要有任何一种输入凑不齐,所有输入都不搬——避免半套原料搬来后卡死在工作台里。
- 每种物品同时只有一个在途搬运任务;源头选最近的容器(候选上限 8 个,按距离排序),取货前对源容器做预留。生产建筑的输入容器本身被排除在全船取货源之外,其他任务不会从工作台里把料“偷走”(
ContainerRegistry行为,有单元测试佐证)。
搬运统一是 Hauling 工种(TaskDefs.Haul)。船员执行:走到源容器 → 拾取(瞬时)→ 走到工作台交互点 → 校验订单仍有效(瞬时)→ 放入输入容器(瞬时)(Task_HaulToContainer.cs)。订单中途被暂停/删除则任务失败。
第二步:制作(ProductionTaskIssuer.cs → Task_Produce.cs)
当队首订单的输入已齐、输出有空间时,为该建筑发一个生产任务(每建筑同时最多 1 个)。工种由配方的 WorkType 列决定:Cooking → 烹饪工种,Crafting → 制作工种,其他值(含空和 Brewing)→ 一律按制作工种。
船员执行四步:
| 步骤 | 耗时 | 失败条件 |
|---|---|---|
| 1. 走到建筑交互点 | 取决于路径(见寻路与移动) | — |
| 2. 工作 | 配方生产时间 ÷ 建筑综合效率(秒),进度每帧推进 | 建筑没了 / 订单失效 / 输入不足 / 输出满 |
| 3. 二次校验订单 | 瞬时 | 订单失效 |
| 4. 事务结算(扣料 + 产出) | 瞬时 | 结算失败仅记日志,不计完成次数 |
注意:船员的技能和工作速度不影响制作耗时——工作步骤的推进速率只乘建筑综合效率(Task_Produce.cs 的工作步骤),技能只在抢单优先级里起微小作用(见下)。
第三步:出货(ProductionOutputIssuer.cs)
持续扫描所有 RequiresCrew 建筑的输出容器,对每种有货物品发搬运任务(每建筑每物品同时 1 个),送往最近的能接收该物品的仓储容器(候选上限 8 个)。搬运数量 = min(容器现存量, 目标容器可接收量)。这一步与制作并行,所以输出容器(2~3 格)一般不会堵;若全船仓库都满了,输出滞留会反过来卡住第二步的“输出有空间”检查。
锅炉补煤(BoilerTaskIssuer.cs → Task_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 点,只够打破平局)。
关键公式汇总
Section titled “关键公式汇总”| 公式 | 出处 |
|---|---|
| 实际生产周期 = 配方生产时间 ÷ (生产效率 × 建筑效率) | 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 |
生产建筑参数表
Section titled “生产建筑参数表”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 格无过滤。
节奏与频率参数
Section titled “节奏与频率参数”| 参数 | 值 | 来源 |
|---|---|---|
| 生产 / 管网 / 引擎动力 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 |
动力链产能核算(满效率)
Section titled “动力链产能核算(满效率)”- 水泵:每 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 个,是不靠岸时的淡水来源(饮用水有保鲜期,见物品与库存)。
与其他系统的交互
Section titled “与其他系统的交互”- 物品与库存:生产建筑的输入/输出容器是标准容器;输入容器被全局取货扫描排除(料不被偷);搬运全程走预留机制防止超卖;流体(水/蒸汽)也是普通堆叠物品。
- 任务与工作:四个生产相关发布器(搬料/制作/出货/补煤)全部走统一任务框架;涉及烹饪/制作/搬运三个工种;玩家可在工作优先级面板为每个船员调整工种优先级(0 = 禁用该工种)。
- 船员:船员是唯一劳动力。注意制作耗时不吃技能加成;铲煤速度吃搬运工作速度。
- 船只:引擎动力信号汇总成船速;蒸汽断供约 1 秒后船开始失去动力。
- 武器与弹药:军械台是子弹/炮弹/黑火药的唯一生产源;防空炮靠管道供水(每发耗水 5);火焰喷射器烧兽油(屠宰台产出)。
- 修建:生产建筑与管道的建造;管道放置受“不可连接两种流体网络”校验。
- 伤害与护甲 / 元素与状态效果:建筑血量 ≤ 30% 时生产效率减半;停转 debuff 冻结自动生产。
- 怪物 / 战利品与掉落:怪物尸体是食物链和兽油链的源头原料。
- 时间与调度:生产、管网、引擎全部挂在每秒 10 次的 Tick 档位。
- 存档:制造队列不持久化,读档后需重新下单。
- 界面总览:制造面板(Modal 层)、建筑头顶状态条(UGUI 世界标签)、容器悬浮窗。
- 物品数据表:所有生产物品的堆叠/保鲜/腐败参数。
配置与调参指南
Section titled “配置与调参指南”| 想调什么 | 改哪里 |
|---|---|
| 配方的输入/输出/耗时/工种 | 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 |
已知限制与注意事项
Section titled “已知限制与注意事项”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 个候选里预留;极端情况下(原料分散在大量容器)可能预检通过但取货失败,下一轮发布器扫描会自动重试。