建筑
This content is not available in your language yet.
建筑是船甲板上的一切可放置设施——地板、墙、门、武器、生产设备、储物箱、床铺等。每个建筑占据船本地网格的一个或多个格子,沿“蓝图框架 → 材料运送 → 船员施工 → 完工使用 → 损坏维修 / 摧毁拆除”的生命周期流转。
建筑系统是本作基地建设玩法的核心载体(参考 RimWorld / 缺氧的“格子 + 蓝图 + 殖民者施工”模式)。玩家按 B 进入建造模式,从建造栏选择建筑(或按 CSV 配置的快捷键),在船的网格上点击 / 拖拽放置;放置后建筑以半透明“框架”形态出现,船员(见 船员)自动接取搬运材料和施工任务(见 任务与工作、修建),完工后建筑开始发挥功能并可被敌人攻击。
建筑的静态数据分散在四张 CSV 配置表(策划可直接修改):
| 配置表 | 内容 | 出处 |
|---|---|---|
BuildingConfig.csv |
建筑身份:尺寸、层级、建造策略、最大生命值、快捷键 | Assets/StreamingAssets/ |
BuildingConstructionCost.csv |
建造材料配方与建造时间 | 同上 |
BuildingContainerConfig.csv |
输入 / 输出 / 存储容器容量 | 同上 |
FluidPortConfig.csv |
流体端口(水 / 蒸汽接口)位置与类型 | 同上 |
运行时核心组件:Building.cs(身份与生命周期)、Constructable.cs(建造阶段)、Repairable.cs(维修)、BuildingComponentContainers.cs(容器)、BuildingRegistry.cs(全局注册表与占格索引)。
一、建筑清单与属性表
Section titled “一、建筑清单与属性表”以下为 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.cs 的 ReservedHotkeys),CSV 中即使配置了这些键也会被跳过。
建造材料(BuildingConstructionCost.csv 全量)
Section titled “建造材料(BuildingConstructionCost.csv 全量)”只有在此表中有记录的建筑才走“框架 → 材料 → 施工”流程;表中没有的建筑(Railing、LargeFacility、PipeDebug、Light、Pipe、PurchaseBox、Stair、MagicContainer、Bed、WaterBarrel、Toilet)放置后直接完工,不消耗材料(MultiConstructHandler.cs:costData == 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),详见 武器与弹药。
二、占格与放置规则
Section titled “二、占格与放置规则”- 建筑网格是船本地坐标系的三维格子: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)
Section titled “建筑层级(BuildingLayer)”每个建筑属于一个层级(BuildingLayer.cs,数值越大放置高度越高):
| 层级 | 数值 | 示例 | 说明 |
|---|---|---|---|
| Floor | 0 | 地板 | 地基层 |
| Facility | 1 | 墙、门、武器、床、生产设备 | 设施层 |
| Pipe | 2 | 管道 | 管道层 |
| Light | 3 | 顶灯 | 顶灯层 |
| Room | 100 | (预留) | 特殊:只与 Room 冲突 |
层级规则:
- 同层冲突:同一格上不能放两个相同层级的建筑;不同层级可以叠放(同一格可以同时有地板 + 武器 + 管道 + 顶灯)。
- 同名禁止:同一格上不能放同名建筑(即使理论上不冲突)。
- 地基要求:层级 ≥ 1 的建筑(Room 除外)必须放在已有地板(Floor 层建筑)的格子上,否则提示“需要地板作为基础支撑”(
ConstructionUtils.ValidateCoordinate+BuildingLayerExtensions.RequiresFoundation)。
放置校验顺序
Section titled “放置校验顺序”放置(含批量拖拽)时每个起始格按以下顺序验证,任一失败即标红(ConstructionUtils.cs):
- 起始坐标在网格范围内(0 ≤ x,z < 100,-5 ≤ y ≤ 5);
- 建筑配置存在于
BuildingConfig.csv; - 旋转后所有占用格均在网格范围内;
- 所有占用格上无同名建筑;
- 所有占用格上无层级冲突的现有建筑;
- 地基要求(见上);
- 注册的自定义验证器通过——目前只有管道流体兼容验证器(见“流体接口”一节);
- 批量放置时,与同批次其他建筑的占用格不重叠。
校验通过但格子上有其他(不冲突层级的)建筑时,预览会高亮现有建筑提示玩家。预览颜色:可放 = 绿色材质,不可放 = 红色材质(BuildingPreviewMaterial.cs)。
- R 键将当前待放建筑顺时针旋转 90°(
BuildingController.cs的rotateKey,Inspector 可改键位)。 - 多格建筑旋转时,占用格按“以起始格为锚点、占格偏移按 90° 步进旋转”计算:旋转一步的偏移变换为
(x, z) → (z, -x)(ConstructionUtils.RotationUtils.RotateOffset)。旋转 90°/270° 时建筑有效尺寸 X/Y 互换。 - 墙在拖拽时不受 R 键控制:直线拖拽墙时,墙段长度方向自动跟随拖拽轴,反向拖拽翻转法线;单点放墙时自动从四邻已有墙推断一致朝向,邻居朝向不一致或无邻居则回退到当前旋转值(此时 R 键设定仍生效,
BuildingController.GetConstructionRotation)。自动船壳墙永远朝船外(AutoHullGenerator.ComputeWallRotation)。
建造策略(拖拽形状)
Section titled “建造策略(拖拽形状)”每个建筑在 CSV 中配置一种拖拽策略(ConstructStrategyType):
| 策略 | 行为 | 典型建筑 |
|---|---|---|
| Point | 单击放一个 | 大多数设施 |
| Line | 起点到终点拉直线(自动选变化更大的轴),步长 = 建筑在该轴的尺寸 | 墙、管道 |
| Rectangle | 起点和终点围成的矩形填满,X/Z 步长 = 建筑尺寸 | 地板 |
拆除(Ctrl + 左键,可拖拽)复用当前策略的形状,但始终按 1×1 格计算坐标,不受当前建筑尺寸影响(BuildingController.GetDestructionCoords)。
三、建筑生命周期
Section titled “三、建筑生命周期”状态机(BuildingState.cs):
Idle(未放置) └→ Frame(框架) ├→ Completed(完工) │ ├→ Destroyed(被攻击摧毁,终态) │ └→ Removed(被玩家拆除,终态) ├→ Destroyed(终态) └→ Removed(终态)非法状态转换会被拒绝并记录警告(BuildingData.SetState)。终态不可再转换。
阶段 1:框架(Frame)
Section titled “阶段 1:框架(Frame)”- 玩家放置后建筑立即实例化,但外观设为 50% 透明(
MultiConstructHandler.SetFrameAppearance,alpha = 0.5)。 - 框架不可被攻击(
DamageableComponent.SetCanBeAttacked(false))。 - 框架头顶显示进度条,进度 = (材料进度 + 工作进度) / 2(
BuildingProgressBar.cs,每 0.08 秒刷新)。 - 总工作量 = round(建造时间配置值 × 15)(
MultiConstructHandler.cs,代码常量 15)。
阶段 2:材料运送
Section titled “阶段 2:材料运送”- 建造任务发起器每轮扫描所有 Frame 建筑(
ConstructionTaskIssuer.cs);材料不齐时按每种缺口材料各发一个搬运请求(FetchRequest,工种 = Construction,优先级 = 5 默认档)。 - 船员把材料搬到建筑所在格子的地板容器上;材料进度 = Σ min(地板上数量, 需求量) / Σ 需求量(
Constructable.CalculateMaterialProgress)。 - 拖走地板上的材料会让进度倒退——材料齐不齐以地板容器实时盘点为准。
阶段 3:施工
Section titled “阶段 3:施工”- 材料进度 ≥ 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 → 外观恢复不透明 → 开启可被攻击。
即时建造(跳过框架)
Section titled “即时建造(跳过框架)”以下路径直接生成完工建筑,不走框架 / 材料 / 施工:
- 开发者作弊开关
CheatFlags.InstantBuild(见 开发者工具); - 初始舰队 / AI 船工厂批量铺设;
- 自动船壳墙生成与墙材质升级(永远即时,
AutoHullGenerator.cs/WallUpgradeService.cs); - 在
BuildingConstructionCost.csv中没有配方的建筑(见上文清单)。
- 玩家拆除(建造模式下 Ctrl + 左键):按当前选中建筑的层级收集拖拽范围内相交的建筑整体移除;选中地板拆除时无视层级,范围内所有层的建筑一起拆(
MultiDestructHandler.cs)。拆除不返还任何材料。拆除外缘墙格会打上“玩家已清除”标记,阻止自动船壳在该格补墙。 - 战斗摧毁:HP 归 0 后 0.1 秒销毁 GameObject 并从注册表注销(
Building.HandleBuildingDestroyed)。战斗摧毁的自动船壳墙同样不会被免费补回(按 HP==0 区分战斗摧毁与玩家拆除)。 - 注销建筑会同步取消其所有未完成的建造 / 维修任务(
ConstructionTaskIssuer/RepairTaskIssuer订阅注销事件)。
四、HP 与损坏维修
Section titled “四、HP 与损坏维修”HP 的三个数据源(重要)
Section titled “HP 的三个数据源(重要)”| 数据 | 来源 | 类型 |
|---|---|---|
| 建筑最大 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 点才实际回血)。 - 修到满血任务完成;中途建筑被摧毁 / 变得不可修则任务中断。
水桶泄漏(特殊损坏行为)
Section titled “水桶泄漏(特殊损坏行为)”水桶(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)。
五、墙的特殊规则
Section titled “五、墙的特殊规则”材质属性表(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)。
自动船壳(AutoHull)
Section titled “自动船壳(AutoHull)”每艘船自动挂载自动船壳生成器(WallSystemBootstrapper.cs 在船注册时挂 AutoHullSettings + AutoHullGenerator + WallBreachListener):
- 规则:每层 Deck 上,凡是“外圈地板”(该地板有至少一个四方向邻格连通到船外开放空间;船体内部的洞不算船外)且该格没有 Facility 层建筑,自动即时放一面默认材质墙并标记为“自动生成”。
- 默认材质 = 松木(
AutoHullSettingsInspector 字段_defaultMaterial,可在运行时切换,切换后整船自动墙重建为新材质);总开关_enabled默认开。 - 自动墙朝向永远朝船外。
- 触发重算的时机:地板增删、设置变更、存档加载完成。加载存档过程中完全不响应,避免与存档里的墙冲突。
- 玩家拆除过的格子不再自动补墙;玩家在该格重新放任何建筑后解除标记。战斗中被摧毁的自动墙同样不免费补回。
- 旧版“Railing 栏杆”自动护栏规则已废弃:扫描时发现名为 Railing 的旧自动护栏会被移除 / 替换为墙。
玩家可把现有墙原位升级为更高材质(WallUpgradeService.cs):销毁旧墙 → 同坐标同朝向即时建造新材质墙。同材质拒绝升级;升级后的墙脱离自动船壳管理(视为玩家手动墙,floor 拓扑变化时保留)。材料扣除由调用方负责,本服务只做替换。
Deck 0(水线层)的外缘墙被战斗摧毁(HP 归 0)时,向船体浮力系统登记一个破洞造成浮力损失;在同一坐标重新建成(必须是 Completed 状态,框架不算)任意墙后撤销该浮力损失(WallBreachListener.cs)。玩家主动拆墙不触发破洞。浮力机制详见 船只。
门(自动门)
Section titled “门(自动门)”门走 RimWorld 式自动门逻辑(DoorComponent.cs,参数为 Inspector 序列化字段):
| 参数 | 默认值 | 含义 |
|---|---|---|
| OpenDelay | 0.5 秒 | 船员到门前申请开门后的开门动作时长(船员在门口等待这么久) |
| AutoCloseDelay | 3.0 秒 | 最后一人通过后自动关门的延迟 |
| 状态检查频率 | 每秒 5 次 | 门逻辑的更新频率(与游戏暂停同步) |
寻路始终把门视为可通行;玩家无法手动开关门。自动关门要求:门已开 + 距上次通行 ≥ 3 秒 + 门所有占用格上当前没有船员。寻路服务缺失时门保守地视为“有人”而保持开启,不会夹死正在通过的船员。
六、流体接口(FluidPort)
Section titled “六、流体接口(FluidPort)”流体端口让建筑接入管道网络(水 / 蒸汽),配置全部来自 FluidPortConfig.csv,建筑初始化时按建筑名自动加载(FluidPortComponent.cs)。
CSV 列含义
Section titled “CSV 列含义”| 列 | 含义 |
|---|---|
| ConfigId | 配置项 ID(仅标识用) |
| BuildingId | 归属建筑名(与 BuildingConfig.csv 的 Name 对应) |
| PortType | 0 = 输入端口,1 = 输出端口 |
| AcceptedFluidType | 0 = 无,1 = 水(Water),2 = 蒸汽(Steam) |
| FluidItemId | 流体对应的物品 ID(流体在容器中以物品堆形式存储) |
| GridOffsetX/Y/Z | 端口相对建筑主格的网格偏移(格);多格建筑可以把不同端口放在不同格上 |
| Description | 注释 |
当前全量配置(7 行)
Section titled “当前全量配置(7 行)”| 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 字段
_maxCapacity,ReservableBuilding.cs),状态流转 空闲 → 预留 → 占用 → 释放;只有 Completed 状态可预约。船员需求行为详见 船员。 - 木箱自动收集(
ItemCollector.cs,Inspector 字段):每 0.5 秒扫描一次半径 10 米内已落地的掉落物,以 5 米/秒吸向自身,距离 ≤ 0.5 米时收入存储容器;容器装不下则中途放弃并归还掉落物。掉落物来源见 战利品与掉落。 - 魔法箱(
MagicContainerInitializer.cs):开发测试用,建成时把物品表中所有物品(除饮用水)各塞入一组(组大小 = 物品 MaxStackSize)。 - 买入箱(
PurchaseBox.cs):交易系统购买物品的落地容器,存储容量 100 格。 - 开发期调试浮层(建筑信息 / 管道信息 / 生产调试,
Testing/目录)见 开发者工具。
公式与数值(集中表格)
Section titled “公式与数值(集中表格)”| 项 | 公式 / 数值 | 单位 | 来源 |
|---|---|---|---|
| 总建造工作量 | 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) |
与其他系统的交互
Section titled “与其他系统的交互”| 系统 | 关系 |
|---|---|
| 修建 | 建造模式 UI、建造栏、拖拽放置的玩家侧流程 |
| 任务与工作 | 材料搬运(FetchRequest)、施工(BuildRequest)、维修(RepairRequest)全部走任务框架,由船员按优先级认领 |
| 船员 | 施工 / 维修速度由船员技艺属性 + 技能 + 状态效率决定;床 / 厕所是船员需求目标 |
| 生产与制作 | 生产建筑(锅炉 / 灶台 / 军械台等)的配方、速率与船员操作要求 |
| 物品与库存 | 建筑三容器(输入 / 输出 / 存储)接入全局容器注册与预约体系 |
| 伤害与护甲 | 建筑受击结算;墙的减伤加成作为防御提供者参与计算 |
| 元素与状态效果 | 建筑可被点燃 / 腐蚀 / 冻结并参与元素传播网络 |
| 船只 | 网格挂在船本地坐标系;Deck 0 外缘墙破洞造成浮力损失;建筑重量影响船性能 |
| 武器与弹药 | 武器是建筑的一类;弹药通过输入容器供给 |
| 交易 | 买入箱是交易购买物品的落地点 |
| 战利品与掉落 | 木箱自动吸取掉落物 |
| 寻路与移动 | 墙阻挡通行、门自动开关、楼梯跨层 |
| 存档 | 建筑数据(坐标 / 旋转 / HP / 建造进度 / 占格)为纯数据类可序列化;自动船壳在读档期间挂起 |
| 开发者工具 | InstantBuild / BuildingGodMode 作弊开关;建筑 / 管道调试浮层 |
| 数据/配置表总览 | 本页四张 CSV 的索引 |
配置与调参指南
Section titled “配置与调参指南”| 想调什么 | 改哪里 |
|---|---|
| 新增一种建筑 | 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) |
已知限制与注意事项
Section titled “已知限制与注意事项”- 建筑最大 HP 三处数据源不同步风险:运行时最大 HP 取 prefab 的
Building._maxHP(Inspector),CSV 的 MaxHealth 只作为放置时的初始当前 HP,墙又被WallMaterialConfig.cs覆盖。策划只改 CSV 不会改变实际最大 HP。 - ConstructionTime 字段语义过时:
MultiConstructHandler.cs中有明确 TODO——总工作量 = ConstructionTime × 15 是临时换算,注释中的速度模型(workPerTick = level × 0.3)与现行实现(15 × 工速系数)已不一致,该字段不等于“建成所需秒数”,待重构。 - 施工 / 维修速度与帧率挂钩:任务步骤每帧推进一次(
TaskBase.Do逐帧循环),workPerTick 按帧应用,高帧率下建造 / 维修更快。设计上的“tick”并没有固定时长。 - BuildingGodMode 不区分阵营:开启建筑无敌作弊时敌方建筑也被保护(
DamageableComponent.cs内注释明确标注的已知问题,根因是 Building 与 Defender 初始化顺序导致 factionId 可能未正确传递)。 - 拆除无返还:玩家拆除建筑不返还任何已消耗材料;框架阶段拆除时,已搬到该格地板容器的材料也会随容器一并清除丢失(
Constructable.OnBuildingDestroy→FloorContainerManager.OnFloorDestroyed,日志记“材料丢失”)。 - Railing(栏杆)是遗留物:CSV 中仍有配置(HP=1),但自动船壳现行规则统一生成实墙;扫描到旧自动栏杆会被移除。设计文档中的“顶层防坠护栏”未在现行实现中生成。
- LargeFacility / PipeDebug / MagicContainer 为开发调试建筑,不应出现在正式建造栏体验中。
- 木箱收集器使用全场景扫描(
ItemCollector.cs每 0.5 秒 FindObjectsOfType 扫掉落物),与项目“禁止 FindObjectOfType”的规范冲突,是现存例外,掉落物多时有性能开销。 - 墙升级不扣材料:
WallUpgradeService.cs注明资源扣除由调用方负责,当前升级本身是免费替换。 - 维修不消耗材料:与部分设计文档中“维修耗材”的设想不同,现行实现纯靠船员时间。
- 同格异层建筑互不阻挡放置但共享格子:拆地板会连带拆掉该格所有层级的建筑,玩家容易误拆,操作时注意。