跳转到内容

建筑

建筑是船甲板上的一切可放置设施——地板、墙、门、武器、生产设备、储物箱、床铺等。每个建筑占据船本地网格的一个或多个格子,沿“蓝图框架 → 材料运送 → 船员施工 → 完工使用 → 损坏维修 / 摧毁拆除”的生命周期流转。

建筑系统是本作基地建设玩法的核心载体(参考 RimWorld / 缺氧的“格子 + 蓝图 + 殖民者施工”模式)。玩家按 B 进入建造模式,从建造栏选择建筑(或按 CSV 配置的快捷键),在船的网格上点击 / 拖拽放置;放置后建筑以半透明“框架”形态出现,船员(见 船员)自动接取搬运材料和施工任务(见 任务与工作修建),完工后建筑开始发挥功能并可被敌人攻击。

建筑的静态数据分散在四张 CSV 配置表(策划可直接修改):

配置表 内容 出处
BuildingConfig.csv 建筑身份:尺寸、层级、建造策略、最大生命值、快捷键 Assets/StreamingAssets/
BuildingConstructionCost.csv 建造材料配方与建造时间 同上
BuildingContainerConfig.csv 输入 / 输出 / 存储容器容量 同上
FluidPortConfig.csv 流体端口(水 / 蒸汽接口)位置与类型 同上

运行时核心组件:Building.cs(身份与生命周期)、Constructable.cs(建造阶段)、Repairable.cs(维修)、BuildingComponentContainers.cs(容器)、BuildingRegistry.cs(全局注册表与占格索引)。

以下为 BuildingConfig.csv 全量 30 行(除表头)。MaxHealth 单位为 HP 点;ConstructionTime 单位为秒(但见“已知限制”——该字段实际参与的是工作量换算,并不直接等于秒数)。

Name 显示名 尺寸(X×Y 格) 层级 建造策略 最大生命值 建造时间 快捷键 功能分类
Floor 地板 1×1 Floor Rectangle 100 1 Alpha1 地基,其他建筑的基础
Railing 栏杆 1×1 Facility Point 1 1 旧版自动护栏(已被自动墙取代,见“墙的特殊规则”)
WallPine 松木墙 1×1 Facility Line 30 1 Alpha2 墙体(最轻最便宜,易燃)
WallOak 橡木墙 1×1 Facility Line 80 2 墙体(中等防御,可燃)
WallBrass 黄铜墙 1×1 Facility Line 100 3 墙体(防火)
WallIron 铁墙 1×1 Facility Line 150 4 墙体(最高防御,最重)
Door 1×1 Facility Point 80 1.5 Alpha3 通行控制(自动开关门)
Window 1×2 Facility Point 60 1.5 Alpha4 光照与视野
LargeFacility 大型设施 2×2 Facility Point 300 5 Alpha5 调试用占位建筑
PipeDebug 调试管道 1×1 Pipe Line 50 0.5 Alpha6 调试用管道
Light 顶灯 1×1 Light Point 30 1 Alpha7 照明
Cannon_Prod 加农炮 1×2 Facility Point 100 1 Alpha8 武器(见武器与弹药
MachineGun_Prod 机枪 1×2 Facility Point 100 1 Alpha9 武器
Flame_Prod 火焰喷射器 1×2 Facility Point 100 1 Alpha0 武器
WoodContainer 木箱 1×1 Facility Point 100 1 I 存储 + 自动收集掉落物
WaterPump 水泵 1×1 Facility Point 100 1.5 P 流体生产(产水)
Pipe 管道 1×1 Pipe Line 50 0.5 O 流体传输
Boiler 锅炉 2×2 Facility Point 150 2.0 L 流体生产(水→蒸汽)
Engine 引擎 2×2 Facility Point 150 2.0 K 动力(蒸汽→动力+冷凝水)
AA_Gun_Prod 防空炮 1×2 Facility Point 100 1 U 武器(带水输入端口)
PurchaseBox 买入箱 1×1 Facility Point 100 1 T 交易购买物品存放处(见交易
Stair 楼梯 1×1 Facility Point 150 2 N 跨层通行(见寻路与移动
MagicContainer 魔法箱 1×1 Facility Point 100 1 J 开发测试用:开局含所有物品各一组
Bed 1×2 Facility Point 80 1.5 C 船员休息(可预约设施)
WaterBarrel 水桶 1×1 Facility Point 60 1 饮用水供应(有泄漏机制)
Toilet 厕所 1×1 Facility Point 50 1 G 船员排泄(可预约设施)
ButcherTable 屠宰台 1×1 Facility Point 100 3.0 生产(分解怪物尸体)
Galley 灶台 2×1 Facility Point 120 4.0 生产(烹饪)
AmmoBench 军械台 2×1 Facility Point 100 4.0 生产(弹药制造)
Brewery 酒坊 2×2 Facility Point 120 4.0 Y 生产(怪物酒 / Grog)

生产类建筑的配方与速率见 生产与制作ProductionBuildingConfig.csv / RecipeConfig.csv)。

注:建造栏快捷键中 B / R / Q / E / F / Z / X / V 为系统保留键(BuildingController.csReservedHotkeys),CSV 中即使配置了这些键也会被跳过。

建造材料(BuildingConstructionCost.csv 全量)

Section titled “建造材料(BuildingConstructionCost.csv 全量)”

只有在此表中有记录的建筑才走“框架 → 材料 → 施工”流程;表中没有的建筑(Railing、LargeFacility、PipeDebug、Light、Pipe、PurchaseBox、Stair、MagicContainer、Bed、WaterBarrel、Toilet)放置后直接完工,不消耗材料MultiConstructHandler.cscostData == null 时强制走即时建造)。

BuildingId 材料 建造时间(配置值)
Floor Wood×5 1.0
WoodContainer Wood×30 + Stone×20 1.0
WallPine Wood×2 1.0
WallOak Wood×4 2.0
WallBrass IronPlate×2 3.0
WallIron IronPlate×3 4.0
Door Wood×15 1.5
Window Wood×8 1.5
WaterPump Wood×20 + IronPlate×10 1.5
Boiler Wood×30 + Stone×20 + IronPlate×15 2.0
Engine Wood×40 + Stone×25 + IronPlate×20 2.0
Cannon_Dev / Cannon_Prod Wood×25 + IronPlate×30 1.0
MachineGun_Dev / MachineGun_Prod Wood×15 + IronPlate×20 1.0
Flame_Dev / Flame_Prod Wood×20 + IronPlate×15 1.0
AA_Gun_Dev / AA_Gun_Prod Wood×30 + IronPlate×35 1.0
ButcherTable Wood×15 1.5
Galley Wood×25 2.0
AmmoBench Wood×30 2.0
Brewery Wood×30 2.0

注:黄铜墙的材料暂用 IronPlate 替代(CSV 描述注明“用 IronPlate 替代 Brass”)。

容器容量(BuildingContainerConfig.csv 全量)

Section titled “容器容量(BuildingContainerConfig.csv 全量)”

容量单位为容器格数(每格可堆叠一种物品,堆叠上限由物品自身的 MaxStackSize 决定,见 物品与库存)。表中没有的建筑不创建任何可用容器(容量全为 0,避免墙 / 楼梯等暴露存储区,BuildingComponentContainers.cs)。

BuildingId 输入容器 输出容器 存储容器
WaterPump 0 1 0
Boiler 3 3 0
Engine 1 1 0
ButcherTable 2 2 0
Galley 3 2 0
AmmoBench 3 3 0
Brewery 3 2 0
WoodContainer 0 0 30
PurchaseBox 0 0 100
MagicContainer 0 0 100
WaterBarrel 0 0 1
Cannon_Prod / Cannon_Dev 1 0 0
MachineGun_Prod / MachineGun_Dev 1 0 0
Flame_Prod / Flame_Dev 1 0 0
AA_Gun_Prod / AA_Gun_Dev 2 0 0

武器建筑的输入容器会按 WeaponConsumptionConfig.csv 自动设置物品过滤器(多种弹药时按格子均分过滤,BuildingComponentContainers.cs),详见 武器与弹药

  • 建筑网格是船本地坐标系的三维格子:X / Z 为甲板平面,Y 为甲板层(Deck)。船移动 / 旋转时网格随船走(GridManager.cs 通过船根节点 Transform 换算)。
  • 网格尺寸:默认 X×Z = 100×100 格,每格 1 米,Deck 范围 -5 ~ +5 共 11 层。这些都是 GridManager 的 Unity Inspector 序列化字段(场景里改)。
  • Z / X 键切换当前观察的上 / 下一层 Deck(任何时候可用,不限建造模式);切层后只显示 Y 坐标 ≤ 当前 Deck 的建筑(上层隐藏,BuildingRegistry.RefreshBuildingVisibility)。

每个建筑属于一个层级(BuildingLayer.cs,数值越大放置高度越高):

层级 数值 示例 说明
Floor 0 地板 地基层
Facility 1 墙、门、武器、床、生产设备 设施层
Pipe 2 管道 管道层
Light 3 顶灯 顶灯层
Room 100 (预留) 特殊:只与 Room 冲突

层级规则:

  • 同层冲突:同一格上不能放两个相同层级的建筑;不同层级可以叠放(同一格可以同时有地板 + 武器 + 管道 + 顶灯)。
  • 同名禁止:同一格上不能放同名建筑(即使理论上不冲突)。
  • 地基要求:层级 ≥ 1 的建筑(Room 除外)必须放在已有地板(Floor 层建筑)的格子上,否则提示“需要地板作为基础支撑”(ConstructionUtils.ValidateCoordinate + BuildingLayerExtensions.RequiresFoundation)。

放置(含批量拖拽)时每个起始格按以下顺序验证,任一失败即标红(ConstructionUtils.cs):

  1. 起始坐标在网格范围内(0 ≤ x,z < 100,-5 ≤ y ≤ 5);
  2. 建筑配置存在于 BuildingConfig.csv
  3. 旋转后所有占用格均在网格范围内;
  4. 所有占用格上无同名建筑;
  5. 所有占用格上无层级冲突的现有建筑;
  6. 地基要求(见上);
  7. 注册的自定义验证器通过——目前只有管道流体兼容验证器(见“流体接口”一节);
  8. 批量放置时,与同批次其他建筑的占用格不重叠。

校验通过但格子上有其他(不冲突层级的)建筑时,预览会高亮现有建筑提示玩家。预览颜色:可放 = 绿色材质,不可放 = 红色材质(BuildingPreviewMaterial.cs)。

  • R 键将当前待放建筑顺时针旋转 90°(BuildingController.csrotateKey,Inspector 可改键位)。
  • 多格建筑旋转时,占用格按“以起始格为锚点、占格偏移按 90° 步进旋转”计算:旋转一步的偏移变换为 (x, z) → (z, -x)ConstructionUtils.RotationUtils.RotateOffset)。旋转 90°/270° 时建筑有效尺寸 X/Y 互换。
  • 墙在拖拽时不受 R 键控制:直线拖拽墙时,墙段长度方向自动跟随拖拽轴,反向拖拽翻转法线;单点放墙时自动从四邻已有墙推断一致朝向,邻居朝向不一致或无邻居则回退到当前旋转值(此时 R 键设定仍生效,BuildingController.GetConstructionRotation)。自动船壳墙永远朝船外(AutoHullGenerator.ComputeWallRotation)。

每个建筑在 CSV 中配置一种拖拽策略(ConstructStrategyType):

策略 行为 典型建筑
Point 单击放一个 大多数设施
Line 起点到终点拉直线(自动选变化更大的轴),步长 = 建筑在该轴的尺寸 墙、管道
Rectangle 起点和终点围成的矩形填满,X/Z 步长 = 建筑尺寸 地板

拆除(Ctrl + 左键,可拖拽)复用当前策略的形状,但始终按 1×1 格计算坐标,不受当前建筑尺寸影响(BuildingController.GetDestructionCoords)。

状态机(BuildingState.cs):

Idle(未放置)
└→ Frame(框架)
├→ Completed(完工)
│ ├→ Destroyed(被攻击摧毁,终态)
│ └→ Removed(被玩家拆除,终态)
├→ Destroyed(终态)
└→ Removed(终态)

非法状态转换会被拒绝并记录警告(BuildingData.SetState)。终态不可再转换。

  • 玩家放置后建筑立即实例化,但外观设为 50% 透明(MultiConstructHandler.SetFrameAppearance,alpha = 0.5)。
  • 框架不可被攻击DamageableComponent.SetCanBeAttacked(false))。
  • 框架头顶显示进度条,进度 = (材料进度 + 工作进度) / 2(BuildingProgressBar.cs,每 0.08 秒刷新)。
  • 总工作量 = round(建造时间配置值 × 15)(MultiConstructHandler.cs,代码常量 15)。
  • 建造任务发起器每轮扫描所有 Frame 建筑(ConstructionTaskIssuer.cs);材料不齐时按每种缺口材料各发一个搬运请求(FetchRequest,工种 = Construction,优先级 = 5 默认档)。
  • 船员把材料搬到建筑所在格子的地板容器上;材料进度 = Σ min(地板上数量, 需求量) / Σ 需求量(Constructable.CalculateMaterialProgress)。
  • 拖走地板上的材料会让进度倒退——材料齐不齐以地板容器实时盘点为准。
  • 材料进度 ≥ 100% 后发起建造请求(BuildRequest)。船员走到建筑交互点开始施工(Task_Build.cs):
    • 每次任务推进增加工作进度:workPerTick = 15 × 施工速度系数(代码常量 BASE_WORK_PER_TICK = 15);
    • 施工速度系数 = 船员 Construction 工速 = CalcModifier(技艺属性) × CalcModifier(技能等级) × 状态效率,其中 CalcModifier(等级) = 0.2 × e^(0.0805×等级)(等级 1→0.22,10→0.45,20→1.0,CrewAttributes.cs);无船员数据时回退 0.09;
    • 任务步骤每帧推进一次TaskBase.Do 用逐帧循环驱动),所以实际施工耗时与帧率相关(见“已知限制”);
    • 施工期间每 10 个推进帧重新盘点一次材料,材料被偷走则施工中断(Task_Build.MATERIAL_CHECK_INTERVAL_TICKS = 10)。
  • 工作进度 ≥ 100% 时完工(Constructable.OnWorkComplete):从地板容器实际扣除所需材料 → 状态置 Completed → 外观恢复不透明 → 开启可被攻击。

以下路径直接生成完工建筑,不走框架 / 材料 / 施工:

  • 开发者作弊开关 CheatFlags.InstantBuild(见 开发者工具);
  • 初始舰队 / AI 船工厂批量铺设;
  • 自动船壳墙生成与墙材质升级(永远即时,AutoHullGenerator.cs / WallUpgradeService.cs);
  • BuildingConstructionCost.csv 中没有配方的建筑(见上文清单)。
  • 玩家拆除(建造模式下 Ctrl + 左键):按当前选中建筑的层级收集拖拽范围内相交的建筑整体移除;选中地板拆除时无视层级,范围内所有层的建筑一起拆MultiDestructHandler.cs)。拆除不返还任何材料。拆除外缘墙格会打上“玩家已清除”标记,阻止自动船壳在该格补墙。
  • 战斗摧毁:HP 归 0 后 0.1 秒销毁 GameObject 并从注册表注销(Building.HandleBuildingDestroyed)。战斗摧毁的自动船壳墙同样不会被免费补回(按 HP==0 区分战斗摧毁与玩家拆除)。
  • 注销建筑会同步取消其所有未完成的建造 / 维修任务(ConstructionTaskIssuer / RepairTaskIssuer 订阅注销事件)。
数据 来源 类型
建筑最大 HP(运行时实际值) 各建筑 prefab 上 Building 组件的 _maxHP 序列化字段(默认 100) Unity Inspector
放置时的初始当前 HP BuildingConfig.csv 的 MaxHealth 列 CSV
墙类最大 HP(覆盖前者) WallMaterialConfig.cs 代码常量(30/80/100/150) 代码常量

即:Building.cs 用 prefab 的 _maxHP 初始化战斗组件最大 HP,用 CSV MaxHealth 作为初始当前 HP;墙在初始化后期再用材质表覆盖最大 HP。改 CSV 的 MaxHealth 不一定改变运行时最大 HP,三处需要保持同步(见“已知限制”)。

  • 只有 Completed 状态可被攻击;阵营归属继承自所在船(Building.SetContext),伤害结算见 伤害与护甲
  • 建筑可被点燃 / 腐蚀 / 冻结并参与元素传播(初始化时自动挂元素状态承受组件,Building.cs),见 元素与状态效果
  • 受损后头顶出现血条(55×5 像素,每 0.1 秒刷新,颜色从红到绿随血量插值);满血时不创建血条以省性能(BuildingHealthTag.cs / Repairable.cs)。

损坏分级(Repairable.cs 代码常量)

Section titled “损坏分级(Repairable.cs 代码常量)”
等级 血量区间 维修任务优先级
Healthy 满血(或不可修) 不发任务
Light 轻伤 70% < HP < 100% 5(默认档)
Moderate 中伤 40% < HP ≤ 70% 7
Heavy 重伤 15% < HP ≤ 40% 9
Critical 危重 0 < HP ≤ 15% 10(紧急档)

优先级映射在 RepairTaskIssuer.cs(任务优先级体系 0~11,默认 5 / 紧急 10,ConsumerPriorityConfig.cs)。已存在的维修任务只升级优先级不降级,避免任务抖动。

另外:HP ≤ 30% 的建筑视为“严重受损”,对外提供 0.5 倍效率系数Repairable.EfficiencyModifier,供生产等系统查询)。

  • 触发条件:建筑 Completed 且 0 < 当前 HP < 最大 HP。维修任务发起器持续扫描并派发(RepairTaskIssuer.cs)。
  • 维修不消耗任何材料Steps.Repair.cs 注明“无材料消耗”)。
  • 维修速率:每帧恢复 HP = 15 × 维修速度系数(代码常量 BASE_REPAIR_PER_TICK = 15,速度系数同施工,走 Construction 工速;小数部分跨帧累积,凑满 1 点才实际回血)。
  • 修到满血任务完成;中途建筑被摧毁 / 变得不可修则任务中断。

水桶(WaterBarrel)受损后有独立的物资流失机制(WaterBarrelLeakHandler.cs,全部为代码常量):

规则 数值
进入泄漏态条件 HP ≤ 50% 且容器内有液体
持续泄漏速度 每 60 现实秒(= 1 游戏小时)漏 1 单位液体
受击瞬时溅出 任何命中船体且落点距水桶 2 米内的伤害,立刻额外漏 1 单位(SplashLeakResponder.cs,半径代码常量 2 m)
扣减优先顺序 DrinkableWater → Grog → StaleWater → MonsterBrew(先漏最值钱的);同种液体先漏最新鲜的

泄漏本身不掉 HP(HP 由战斗驱动),只流失物资并飘字提示“漏 -N”。水桶初始自带 12 单位饮用水(WaterContainerInitializer.cs 的 Inspector 字段 _initialWaterCount)。

材质属性表(WallMaterialConfig.cs 代码常量)

Section titled “材质属性表(WallMaterialConfig.cs 代码常量)”
材质 建筑名 最大 HP 防御加成(减伤) 重量(地板=1.0) 可燃 阻断火灾蔓延
松木 Pine WallPine 30 0% 0.5
橡木 Oak WallOak 80 10% 1.0
黄铜 Brass WallBrass 100 20% 2.0
铁 Iron WallIron 150 30% 3.0
  • 防御加成是墙作为掩体提供的减伤百分比(由伤害系统查询,见 伤害与护甲)。
  • HP ≤ 40% 时防御加成归零WallComponent.GetDamageReduction,对应设计文档“重伤墙失去防御”)。
  • 门的防御加成恒为 0(门是通行控制不是工事,DoorComponent.cs)。

每艘船自动挂载自动船壳生成器(WallSystemBootstrapper.cs 在船注册时挂 AutoHullSettings + AutoHullGenerator + WallBreachListener):

  • 规则:每层 Deck 上,凡是“外圈地板”(该地板有至少一个四方向邻格连通到船外开放空间;船体内部的洞不算船外)且该格没有 Facility 层建筑,自动即时放一面默认材质墙并标记为“自动生成”。
  • 默认材质 = 松木(AutoHullSettings Inspector 字段 _defaultMaterial,可在运行时切换,切换后整船自动墙重建为新材质);总开关 _enabled 默认开。
  • 自动墙朝向永远朝船外。
  • 触发重算的时机:地板增删、设置变更、存档加载完成。加载存档过程中完全不响应,避免与存档里的墙冲突。
  • 玩家拆除过的格子不再自动补墙;玩家在该格重新放任何建筑后解除标记。战斗中被摧毁的自动墙同样不免费补回。
  • 旧版“Railing 栏杆”自动护栏规则已废弃:扫描时发现名为 Railing 的旧自动护栏会被移除 / 替换为墙。

玩家可把现有墙原位升级为更高材质(WallUpgradeService.cs):销毁旧墙 → 同坐标同朝向即时建造新材质墙。同材质拒绝升级;升级后的墙脱离自动船壳管理(视为玩家手动墙,floor 拓扑变化时保留)。材料扣除由调用方负责,本服务只做替换

Deck 0(水线层)的外缘墙被战斗摧毁(HP 归 0)时,向船体浮力系统登记一个破洞造成浮力损失;在同一坐标重新建成(必须是 Completed 状态,框架不算)任意墙后撤销该浮力损失(WallBreachListener.cs)。玩家主动拆墙不触发破洞。浮力机制详见 船只

门走 RimWorld 式自动门逻辑(DoorComponent.cs,参数为 Inspector 序列化字段):

参数 默认值 含义
OpenDelay 0.5 秒 船员到门前申请开门后的开门动作时长(船员在门口等待这么久)
AutoCloseDelay 3.0 秒 最后一人通过后自动关门的延迟
状态检查频率 每秒 5 次 门逻辑的更新频率(与游戏暂停同步)

寻路始终把门视为可通行;玩家无法手动开关门。自动关门要求:门已开 + 距上次通行 ≥ 3 秒 + 门所有占用格上当前没有船员。寻路服务缺失时门保守地视为“有人”而保持开启,不会夹死正在通过的船员。

流体端口让建筑接入管道网络(水 / 蒸汽),配置全部来自 FluidPortConfig.csv,建筑初始化时按建筑名自动加载(FluidPortComponent.cs)。

含义
ConfigId 配置项 ID(仅标识用)
BuildingId 归属建筑名(与 BuildingConfig.csv 的 Name 对应)
PortType 0 = 输入端口,1 = 输出端口
AcceptedFluidType 0 = 无,1 = 水(Water),2 = 蒸汽(Steam)
FluidItemId 流体对应的物品 ID(流体在容器中以物品堆形式存储)
GridOffsetX/Y/Z 端口相对建筑主格的网格偏移(格);多格建筑可以把不同端口放在不同格上
Description 注释
BuildingId 端口 流体 物品 偏移(X,Y,Z) 说明
WaterPump 输出 Water (0,0,0) 水泵出水口
Boiler 输入 Water (0,0,0) 锅炉进水口(左下角格)
Boiler 输出 蒸汽 Steam (1,0,1) 锅炉蒸汽出口(右上角格)
Engine 输入 蒸汽 Steam (0,0,0) 引擎蒸汽入口
Engine 输出 Water (1,0,1) 引擎冷凝水出口
AA_Gun_Dev 输入 Water (0,0,0) 防空炮水输入
AA_Gun_Prod 输入 Water (0,0,0) 防空炮水输入
  • 输入端口绑定建筑的输入容器,输出端口绑定输出容器;端口本身没有独立容量,完全依赖容器容量(FluidPort.cs)。
  • 建筑初始化时端口注册到流体系统空间索引,并连接端口所在格四邻的管道;建筑拆除时断开并触发管道网络拆分检查。
  • 管道放置兼容校验:放管道时,如果该管道直接相邻的已有管道网络中存在与参考流体不同的流体(水网不能接蒸汽网),放置被拒绝(PipeCompatibilityValidator.cs,作为放置验证器自动参与第二节的校验流程)。批量拖管道时以拖拽起始格相邻网络确定参考流体。
  • 生产配方如何消耗 / 产出流体见 生产与制作

七、可预约设施与其他功能组件

Section titled “七、可预约设施与其他功能组件”
  • 可预约设施(床、厕所等):通用预约组件容量默认 1 人(prefab Inspector 字段 _maxCapacityReservableBuilding.cs),状态流转 空闲 → 预留 → 占用 → 释放;只有 Completed 状态可预约。船员需求行为详见 船员
  • 木箱自动收集ItemCollector.cs,Inspector 字段):每 0.5 秒扫描一次半径 10 米内已落地的掉落物,以 5 米/秒吸向自身,距离 ≤ 0.5 米时收入存储容器;容器装不下则中途放弃并归还掉落物。掉落物来源见 战利品与掉落
  • 魔法箱MagicContainerInitializer.cs):开发测试用,建成时把物品表中所有物品(除饮用水)各塞入一组(组大小 = 物品 MaxStackSize)。
  • 买入箱PurchaseBox.cs):交易系统购买物品的落地容器,存储容量 100 格。
  • 开发期调试浮层(建筑信息 / 管道信息 / 生产调试,Testing/ 目录)见 开发者工具
公式 / 数值 单位 来源
总建造工作量 round(ConstructionTime × 15) 工作点 代码常量(MultiConstructHandler.cs)× CSV ConstructionTime
施工速度 每帧工作点 = 15 × 工速系数(系数 ≤0 时回退 0.6/帧) 工作点/帧 代码常量(Task_Build.cs
维修速度 每帧回血 = 15 × 工速系数(小数累积取整) HP/帧 代码常量(Task_Repair.cs / Steps.Repair.cs
工速系数 CalcModifier(技艺) × CalcModifier(技能) × 状态效率;CalcModifier(L) = 0.2×e^(0.0805L) 倍率 代码常量(CrewAttributes.cs / Crew.cs
施工中材料盘点间隔 每 10 个推进帧 代码常量(Task_Build.cs
框架进度条进度 (材料进度 + 工作进度) / 2 0~1 代码(BuildingProgressBar.cs
框架透明度 alpha = 0.5 代码常量(MultiConstructHandler.cs
摧毁后销毁延迟 0.1 秒 代码常量(Building.cs
损坏分级阈值 危重 ≤15% / 重伤 ≤40% / 中伤 ≤70% / 轻伤 <100% HP 百分比 代码常量(Repairable.cs
严重受损效率惩罚 HP ≤ 30% → 效率 ×0.5 倍率 代码常量(Repairable.cs
维修优先级 轻伤 5 / 中伤 7 / 重伤 9 / 危重 10 优先级档 代码常量(RepairTaskIssuer.cs
墙防御失效阈值 HP ≤ 40% → 减伤归 0 HP 百分比 代码常量(WallComponent.cs
墙材质 HP / 减伤 / 重量 松木 30/0%/0.5;橡木 80/10%/1.0;黄铜 100/20%/2.0;铁 150/30%/3.0 代码常量(WallMaterialConfig.cs
门开门 / 自动关门延迟 0.5 秒 / 3.0 秒 Inspector(DoorComponent.cs
门逻辑更新频率 每秒 5 次 次/秒 代码(DoorComponent.cs,TickFrequency.FiveTimesPerSecond)
水桶泄漏阈值 / 速度 HP ≤ 50%;每 60 现实秒漏 1 单位 代码常量(WaterBarrelLeakHandler.cs
受击溅出半径 / 量 命中点 2 米内的水桶漏 1 单位 米 / 单位 代码常量(SplashLeakResponder.cs
水桶初始饮用水 12 单位 单位 Inspector(WaterContainerInitializer.cs
木箱收集参数 半径 10 m / 间隔 0.5 s / 吸引速度 5 m/s / 收集判定 0.5 m Inspector(ItemCollector.cs
网格规模 100×100 格 ×11 层(Deck -5~+5),格边长 1 m 格 / 米 Inspector(GridManager.cs
建筑血条显示 0% < HP < 99.9% 时显示;每 0.1 s 刷新 代码常量(BuildingHealthTag.cs
可预约设施容量 默认 1 Inspector(ReservableBuilding.cs
系统 关系
修建 建造模式 UI、建造栏、拖拽放置的玩家侧流程
任务与工作 材料搬运(FetchRequest)、施工(BuildRequest)、维修(RepairRequest)全部走任务框架,由船员按优先级认领
船员 施工 / 维修速度由船员技艺属性 + 技能 + 状态效率决定;床 / 厕所是船员需求目标
生产与制作 生产建筑(锅炉 / 灶台 / 军械台等)的配方、速率与船员操作要求
物品与库存 建筑三容器(输入 / 输出 / 存储)接入全局容器注册与预约体系
伤害与护甲 建筑受击结算;墙的减伤加成作为防御提供者参与计算
元素与状态效果 建筑可被点燃 / 腐蚀 / 冻结并参与元素传播网络
船只 网格挂在船本地坐标系;Deck 0 外缘墙破洞造成浮力损失;建筑重量影响船性能
武器与弹药 武器是建筑的一类;弹药通过输入容器供给
交易 买入箱是交易购买物品的落地点
战利品与掉落 木箱自动吸取掉落物
寻路与移动 墙阻挡通行、门自动开关、楼梯跨层
存档 建筑数据(坐标 / 旋转 / HP / 建造进度 / 占格)为纯数据类可序列化;自动船壳在读档期间挂起
开发者工具 InstantBuild / BuildingGodMode 作弊开关;建筑 / 管道调试浮层
数据/配置表总览 本页四张 CSV 的索引
想调什么 改哪里
新增一种建筑 BuildingConfig.csv 加行(含尺寸 / 层级 / 策略 / HP / 快捷键)+ 制作 prefab(须挂 Building 组件并保持 _maxHP 与 CSV 一致)+ 注册到 prefab 注册表(Unity 菜单 Tools → Buildings → Rebuild Prefab Registry);要走施工流程再到 BuildingConstructionCost.csv 加配方
建筑造价 / 建造时长 BuildingConstructionCost.csv 的 MaterialsJson / ConstructionTime
建筑最大 HP 同时改三处:prefab Building._maxHP(Inspector)+ BuildingConfig.csv MaxHealth;墙还要改 WallMaterialConfig.cs(程序)
容器容量 / 武器弹药槽 BuildingContainerConfig.csv
流体端口位置 / 类型 FluidPortConfig.csv(多格建筑用 GridOffset 把端口放到指定格)
墙的减伤 / 重量 / 防火 WallMaterialConfig.cs(程序改代码常量)
自动船壳默认材质 / 开关 船上 AutoHullSettings 组件(Inspector / 运行时 UI)
施工 / 维修基础速度 Task_Build.cs / Task_Repair.cs 的 BASE 常量(程序)
损坏分级阈值 / 效率惩罚 Repairable.cs 代码常量(程序)
维修优先级档位 RepairTaskIssuer.cs 代码常量(程序)
门开关门节奏 Door prefab 上 DoorComponent 的 OpenDelay / AutoCloseDelay(Inspector)
水桶泄漏阈值 / 速度 WaterBarrelLeakHandler.cs 代码常量(程序)
网格大小 / Deck 范围 场景中 GridManager(Inspector)
建造模式键位(旋转 / 切层) 场景中 BuildingController(Inspector)
建筑选择快捷键 BuildingConfig.csv 的 Hotkey 列(避开保留键 B/R/Q/E/F/Z/X/V)
  1. 建筑最大 HP 三处数据源不同步风险:运行时最大 HP 取 prefab 的 Building._maxHP(Inspector),CSV 的 MaxHealth 只作为放置时的初始当前 HP,墙又被 WallMaterialConfig.cs 覆盖。策划只改 CSV 不会改变实际最大 HP。
  2. ConstructionTime 字段语义过时MultiConstructHandler.cs 中有明确 TODO——总工作量 = ConstructionTime × 15 是临时换算,注释中的速度模型(workPerTick = level × 0.3)与现行实现(15 × 工速系数)已不一致,该字段不等于“建成所需秒数”,待重构。
  3. 施工 / 维修速度与帧率挂钩:任务步骤每帧推进一次(TaskBase.Do 逐帧循环),workPerTick 按帧应用,高帧率下建造 / 维修更快。设计上的“tick”并没有固定时长。
  4. BuildingGodMode 不区分阵营:开启建筑无敌作弊时敌方建筑也被保护(DamageableComponent.cs 内注释明确标注的已知问题,根因是 Building 与 Defender 初始化顺序导致 factionId 可能未正确传递)。
  5. 拆除无返还:玩家拆除建筑不返还任何已消耗材料;框架阶段拆除时,已搬到该格地板容器的材料也会随容器一并清除丢失(Constructable.OnBuildingDestroyFloorContainerManager.OnFloorDestroyed,日志记“材料丢失”)。
  6. Railing(栏杆)是遗留物:CSV 中仍有配置(HP=1),但自动船壳现行规则统一生成实墙;扫描到旧自动栏杆会被移除。设计文档中的“顶层防坠护栏”未在现行实现中生成。
  7. LargeFacility / PipeDebug / MagicContainer 为开发调试建筑,不应出现在正式建造栏体验中。
  8. 木箱收集器使用全场景扫描ItemCollector.cs 每 0.5 秒 FindObjectsOfType 扫掉落物),与项目“禁止 FindObjectOfType”的规范冲突,是现存例外,掉落物多时有性能开销。
  9. 墙升级不扣材料WallUpgradeService.cs 注明资源扣除由调用方负责,当前升级本身是免费替换。
  10. 维修不消耗材料:与部分设计文档中“维修耗材”的设想不同,现行实现纯靠船员时间。
  11. 同格异层建筑互不阻挡放置但共享格子:拆地板会连带拆掉该格所有层级的建筑,玩家容易误拆,操作时注意。