修建
This content is not available in your language yet.
玩家在船上下达建筑蓝图,船员自动搬运材料并施工完成;拆除即时生效但不返还任何材料,受损建筑由船员免费维修。
修建系统是船只成长的核心循环之一:玩家通过建造模式在船体网格上放置建筑(地板、墙、工坊、武器、蒸汽设备等),建筑以“框架”形式落地,随后由分配了“建造”工作的船员自动完成两段劳动——先把所需材料从船上容器搬到工地,再到工地持续施工,直到建筑完工可用。整个流程参考 RimWorld:玩家只下指令,不直接操作船员。
玩家接触入口:
- 底栏 BuildBar(B 键开关)进入建造模式,选择建筑后在甲板上点击/拖拽放置(
BuildingController.cs、BuildBar 见界面总览)。 - 建造模式下按住 Ctrl 点击/拖拽即为拆除。
- 框架放置后无需再操作,搬料、施工、维修全部由任务系统自动派发给船员。
系统代码主体位于 Assets/Scripts/Service/ConstructionSystem/(放置、验证、预览、拆除),施工与维修的劳动部分位于 Core/BuildingSystem/(Constructable.cs、Repairable.cs)与 Core/Task/(Task_Build.cs、Task_Haul.cs、Task_Repair.cs)。
建筑生命周期(状态机)
Section titled “建筑生命周期(状态机)”建筑状态定义在 BuildingState.cs,状态只能单向推进:
| 状态 | 含义 | 进入条件 |
|---|---|---|
| Idle(空闲) | 建筑实体不存在 | 初始 |
| Frame(框架) | 已放置蓝图,半透明显示,等材料和施工 | 玩家放置且该建筑在成本表中 |
| Completed(完工) | 可正常使用 | 工作进度 100%,或即时建造 |
| Destroyed(已摧毁) | 终态 | 被攻击摧毁 |
| Removed(已拆除) | 终态 | 玩家拆除 |
合法转换:Idle→Frame、Frame→Completed/Destroyed/Removed、Completed→Destroyed/Removed。非法转换会被拒绝并记录警告(BuildingData.cs 的 SetState)。
注意:框架阶段建筑不可被攻击——完工时才调用开启“可被攻击”开关(Constructable.cs 的 EnableBuildingCombat),框架本体不会被敌人打掉,但施工现场的材料堆和地板可能受战斗波及。
第一步:下蓝图(放置与验证)
Section titled “第一步:下蓝图(放置与验证)”建造模式下鼠标悬停显示预览虚影(绿=可放置、红=不可放置,红色位置上的冲突建筑同时被红色高亮,BuildingPreview.cs)。点击(或拖拽后松开)执行放置。每个候选格逐一通过以下检查(ConstructionUtils.cs 的 ValidateCoordinate):
- 网格范围:建筑锚点格与全部占用格都必须在船体网格内。网格为船本地坐标系,跟随船移动旋转;默认 100 × 100 格、甲板层 Y 范围 -5 ~ +5(共 11 层)、每格 1 米(
GridManager.cs的 Inspector 序列化字段 xCount/zCount/gridSize/minDeck/maxDeck)。 - 同名排斥:占用格上已有同名建筑 → 拒绝(“已有相同建筑”)。
- 层级互斥:建筑分 5 个 Layer——Floor(0)/Facility(1)/Pipe(2)/Light(3)/Room(100)。同 Layer 互斥;Room 只与 Room 互斥;不同 Layer 可叠放在同一格(
BuildingLayer.cs)。 - 地基检查:Facility/Pipe/Light 层建筑要求锚点格上存在 Floor 层建筑(
BuildingLayer.RequiresFoundation+BuildingRegistry.HasFoundationAt)。注意两点:只查锚点格,多格建筑的其余占用格不查地板;地板处于框架状态也算地基(不要求完工)。 - 专用验证器:目前仅管道有——放置
Pipe时检查不会把两种不兼容流体的管网连通(PipeCompatibilityValidator.cs,经BuildingPlacementValidatorRegistry.cs注册)。 - 批内重叠:一次拖拽放多个建筑时,占用格互相重叠的后续建筑被标记无效(
ConstructionUtils.cs的 BatchValidateBuildings)。
放置时不预扣任何材料——成本在后续搬运阶段从船上库存实际取走。放置预览还会向船只性能面板广播质量增量预估(墙按墙体重量、其他建筑按每格 1.0 计,BuildingPreview.cs 的 ComputePreviewMassDelta),详见船只。
建造策略(点 / 直线 / 矩形)
Section titled “建造策略(点 / 直线 / 矩形)”每种建筑的拖拽方式由 BuildingConfig.csv 的 ConstructStrategyType 列决定(PointConstructStrategy.cs / LineConstructStrategy.cs / RectangleConstructStrategy.cs):
| 策略 | 行为 | 典型建筑 |
|---|---|---|
| Point(单点) | 点一下放一个,拖拽无效 | 门、窗、锅炉、武器、工坊 |
| Line(直线) | 沿拖拽主轴(X/Z 取变化大者)每隔“建筑尺寸”放一个 | 墙、管道 |
| Rectangle(矩形) | 填满拖拽矩形,按建筑尺寸为步长、以起点对齐 | 地板 |
墙体直线拖拽有专门的朝向规则(BuildingController.cs 的 GetConstructionRotation):墙段长度方向自动跟随拖拽轴,反向拖拽会翻转墙的内外法线;原地单击放单面墙时,从四邻已有墙推断朝向(邻墙朝向不一致则放弃推断,用当前手动旋转值)。
| 按键 | 作用 | 生效范围 | 来源 |
|---|---|---|---|
| B | 开关 BuildBar / 建造模式 | 全局 | 保留键(UI 层) |
| R | 预览顺时针旋转 90° | 建造模式 | BuildingController.cs Inspector 字段 rotateKey |
| Z / X | 上一层 / 下一层甲板 | 任何时候(非建造模式也可巡视甲板) | Inspector 字段 moveUpDeckKey/moveDownDeckKey |
| Ctrl + 左键(点/拖) | 拆除 | 建造模式 | 代码固定 |
| 左键拖拽 | 按策略连续放置/批量拆除 | 建造模式 | 代码固定 |
| W/A/S/D | 推动建造焦点(相机锚点),相对镜头方向 | 建造模式 | 代码固定 |
| CSV Hotkey 列(如 Alpha1=地板、L=锅炉) | 直接选中建筑并进入建造模式 | 建造模式选择;非建造模式按下会触发进入 | BuildingConfig.csv Hotkey 列 |
CSV Hotkey 禁止使用保留键 B / R / Q / E / F / Z / X / V(BuildingController.cs 的 ReservedHotkeys,大小写不敏感)。
建造模式相机焦点被限制在以船心为中心的椭圆内:短半轴(左右)6 米、长半轴(前后)18 米、推动速度 12 米/秒(BuildingController.cs Inspector 字段 buildFocusHalfWidth/buildFocusHalfLength/buildFocusPanSpeed)。切换甲板层时相机高度平滑过渡 0.6 秒,目标高度 = 10 + 层数 × 3 米(代码常量)。
第二步:运料(材料搬运)
Section titled “第二步:运料(材料搬运)”框架落地后,ConstructionTaskIssuer.cs 持续扫描本船 BuildingRegistry(任务请求收集随 TaskManager 节拍每秒 5 次,TaskManager.cs 的 Frequency = FiveTimesPerSecond),对每个材料未齐的框架、按每种缺料一条生成搬运请求(FetchRequest):
- 在全船容器中查找该物品,最多取 8 个候选来源,按“来源交互点到工地的直线距离”升序尝试(
FetchRequest.cs)。 - 对选中来源做预约(防止两个任务抢同一堆料),预约失败换下一个来源。单次搬运量 = min(还缺的数量, 该来源现有数量)。
- 创建
Task_Haul.cs:船员走到来源 → 拾起 → 走到工地 → 把材料放进框架脚下的地面容器(FloorContainer)。任务中途取消时预约自动释放、已拿起的物品就地丢弃。 - 材料送达回调刷新框架的材料进度。
材料进度 = Σ min(地面容器中该材料数, 需求数) / Σ 需求数(Constructable.cs 的 CalculateMaterialProgress)。注意材料是“堆在工地”而非锁进建筑——完工那一刻才真正消耗;在此之前如果地面容器里的料被其他系统取走,进度会回退。
搬运建材的工作类型是 Construction(建造)而不是 Hauling(搬运)(TaskDefs.cs 的 FetchForConstruction = WorkType.Construction)——即只有开了“建造”工作的船员才会去运建材,搬运优先级不影响它。请求默认优先级 5(1-9 档,ConsumerPriorityConfig.cs)。
第三步:施工
Section titled “第三步:施工”材料进度达 100% 后,Issuer 改为生成建造请求(BuildRequest → Task_Build.cs):
-
船员走到建筑的交互点——优先建筑自身格(可站立时),否则在占用格四邻中选连通性最好、偏向船体内侧的可站立格(
InteractionPointResolver.cs)。可站立要求该格有完工地板且无阻挡设施(楼梯类除外)。 -
到位后每帧推进工作量(任务驱动循环每帧执行一次,
TaskBase.cs的 DriverTick):每帧工作量 = 15 × 船员建造速度系数(
Task_Build.cs的 BASE_WORK_PER_TICK = 15)工作进度 = 累计工作量 / 总工作量,总工作量 = round(ConstructionTime × 15),ConstructionTime 取自
BuildingConstructionCost.csv(MultiConstructHandler.cs)。 -
施工期间每 10 帧复查一次材料是否仍齐全(
Task_Build.cs的 MATERIAL_CHECK_INTERVAL_TICKS = 10),料被拿走则中止任务(之后 Issuer 会重新发搬运请求)。 -
工作进度满 100% 即完工(
Constructable.cs的 OnWorkComplete):从地面容器实际扣除全部需求材料 → 状态切到 Completed → 半透明框架外观恢复为不透明 → 开启可被攻击。
框架头顶显示一条综合进度条:显示值 = (材料进度 + 工作进度) / 2,每 0.08 秒刷新(BuildingProgressBar.cs)。
船员建造速度系数(Crew.cs 的 GetWorkSpeedMultiplier,详见船员):
建造速度系数 = 修正(技艺属性) × 修正(建造技能) × 状态效率系数 修正(x) = 0.2 × e^(0.0805 × x),x 取值 1-20(
CrewAttributes.cs)
无船员速度数据时回退 0.09(约等于 5 属性/5 技能船员);系数算出 ≤ 0 时强制按 15 × 0.04 = 0.6/帧 兜底(Task_Build.cs)。
即时建造(开发者/工厂路径)
Section titled “即时建造(开发者/工厂路径)”两条路径跳过框架-运料-施工全流程,直接落地完工建筑:
- 作弊开关:开发者工具面板“即时建造”勾选(
DevToolsPanel.cs)置位CheatFlags.InstantBuild(CheatFlags.cs代码静态字段,默认 false),玩家手动放置即变完工。见开发者工具。 - 系统调用:AI 船工厂、初始船队生成、自动船壳、墙体升级(
WallUpgradeService.cs)等通过 API 参数显式声明 instantBuild=true,不读作弊开关。
此外,凡是不在 BuildingConstructionCost.csv 里的建筑,玩家放置时一律免费即时完工(MultiConstructHandler.cs:costData == null 时按即时建造处理)。当前受影响建筑见下文成本表后的清单。
建造模式按住 Ctrl 即拆除模式,单击或按当前策略拖拽框选(拆除框选始终按 1×1 格计算,与建筑尺寸无关)。规则(MultiDestructHandler.cs、BuildingPreview.cs):
- 按层匹配:拆除以“当前选中建筑的 Layer”为准——选中地板时命中范围内所有建筑;选中设施/管道/顶灯/房间时只拆同层建筑。
- 整体拆除:多格建筑任一占用格被框中即整体拆除。
- 即时生效:无拆除工时,无需船员,确认即从注册表移除并销毁。
- 返还规则:零返还。 拆完工建筑不退任何材料(材料在完工时已消耗);拆框架时,已搬到工地、还堆在地面容器里的材料连容器一起删除、直接丢失(
Constructable.cs的 OnBuildingDestroy →FloorContainerManager.cs的 OnFloorDestroyed,日志明确记录“材料丢失”)。 - 自动船壳标记:玩家拆除的每个坐标都会打上“玩家已清除”标记,阻止自动船壳生成器把该格补回自动墙(
MultiDestructHandler.cs的 Continue);墙体升级替换旧墙时刻意不打该标记。 - 框架被拆除/摧毁时,关联的搬运与建造任务全部销毁(
ConstructionTaskIssuer.cs的 OnBuildingUnregistered)。
完工建筑掉血后自动进入维修流程,不消耗任何材料(Steps.Repair.cs 注释明确“无材料消耗”):
-
Repairable.cs监听建筑伤害事件,受损时在头顶挂血条。受损程度分级(按当前血量百分比):等级 血量阈值 维修任务优先级 Light(轻伤) ≤ 100%(未满血) 5(默认) Moderate(中伤) ≤ 70% 7 Heavy(重伤) ≤ 40% 9 Critical(危重) ≤ 15% 10(紧急档) (阈值为
Repairable.cs代码常量;优先级映射在RepairTaskIssuer.cs,运行中只升不降,避免任务抖动。) -
血量 ≤ 30% 时建筑判定“重度受损”,工作效率系数压到 0.5(
Repairable.cs的 SevereDamageThreshold = 0.3f、EfficiencyModifier),影响该建筑作为工作台/设备的产出。 -
RepairTaskIssuer.cs扫描受损完工建筑发出维修请求,同一建筑同时只存在一个维修任务。 -
Task_Repair.cs:船员走到交互点 → 每帧恢复血量,公式与施工同构:每帧维修量 = 15 × 船员建造速度系数(HP,小数累积、凑满 1 点才实际治疗)
修到满血结束;中途建筑被别人修满会正常完成。维修与施工共用 Construction 工作类型与“技艺”属性。
只有 Completed 状态、有血量组件、未满血且未死亡的建筑可维修(Repairable.cs 的 CanRepair);框架不维修,被摧毁的建筑不可修复,只能重建。建筑血量与摧毁机制见建筑与伤害与护甲。
核心公式汇总
Section titled “核心公式汇总”| 公式 | 表达式 | 出处 |
|---|---|---|
| 总工作量 | round(ConstructionTime × 15),单位:工作点 | MultiConstructHandler.cs(×15 为代码常量) |
| 每帧施工量 | 15 × 速度系数,单位:工作点/帧 | Task_Build.cs |
| 每帧维修量 | 15 × 速度系数,单位:HP/帧 | Task_Repair.cs |
| 速度系数 | 0.2e^(0.0805×技艺) × 0.2e^(0.0805×建造技能) × 状态效率 | Crew.cs、CrewAttributes.cs |
| 速度系数回退值 | 0.09(无船员数据);≤0 时施工量按 0.6/帧 | Task_Build.cs、Task_Repair.cs |
| 纯施工耗时 | ConstructionTime / (速度系数 × 帧率) 秒 | 由上式推导 |
| 材料进度 | Σmin(工地现有, 需求) / Σ需求 | Constructable.cs |
| 工作进度 | 累计工作量 / 总工作量,上限 1 | BuildingData.cs |
| 进度条显示 | (材料进度 + 工作进度) / 2 | BuildingProgressBar.cs |
| 施工中材料复查 | 每 10 帧一次 | Task_Build.cs |
| 任务请求扫描 | 每秒 5 次(200 毫秒) | TaskManager.cs |
速度系数参考值(属性=技能、状态效率 1.0 时):
| 技艺/技能 | 单项修正 | 速度系数 | 每帧施工量(点) | 纯施工耗时(60 帧/秒) |
|---|---|---|---|---|
| 1 / 1 | 0.217 | 0.047 | 0.70 | ConstructionTime × 0.355 秒 |
| 5 / 5 | 0.299 | 0.089 | 1.34 | ConstructionTime × 0.186 秒 |
| 10 / 10 | 0.447 | 0.200 | 3.00 | ConstructionTime × 0.083 秒 |
| 20 / 20 | 1.000 | 1.000 | 15.0 | ConstructionTime × 0.017 秒 |
可见纯施工时间极短(普遍不到 1 秒),实际建造节奏几乎完全由船员走路和搬料时间决定;ConstructionTime 数值目前对手感影响很小。另外施工按渲染帧推进,帧率越高建得越快(见已知限制)。
建造成本全表(BuildingConstructionCost.csv,共 23 行,全量)
Section titled “建造成本全表(BuildingConstructionCost.csv,共 23 行,全量)”材料 ID 对照:Wood=木头、Stone=石头、IronPlate=铁板(StaticItemConfig.csv)。总工作量 = ConstructionTime × 15。
| BuildingId | 名称 | 材料 | ConstructionTime(秒,名义值) | 总工作量(点) |
|---|---|---|---|---|
| Floor | 木地板 | 木头×5 | 1.0 | 15 |
| WoodContainer | 木箱 | 木头×30 + 石头×20 | 1.0 | 15 |
| WallPine | 松木墙 | 木头×2 | 1.0 | 15 |
| WallOak | 橡木墙 | 木头×4 | 2.0 | 30 |
| WallBrass | 黄铜墙 | 铁板×2 | 3.0 | 45 |
| WallIron | 铁墙 | 铁板×3 | 4.0 | 60 |
| Door | 木门 | 木头×15 | 1.5 | 23 |
| Window | 木窗 | 木头×8 | 1.5 | 23 |
| WaterPump | 水泵 | 木头×20 + 铁板×10 | 1.5 | 23 |
| Boiler | 锅炉 | 木头×30 + 石头×20 + 铁板×15 | 2.0 | 30 |
| Engine | 引擎 | 木头×40 + 石头×25 + 铁板×20 | 2.0 | 30 |
| Cannon_Dev | 加农炮(开发版) | 木头×25 + 铁板×30 | 1.0 | 15 |
| MachineGun_Dev | 机枪(开发版) | 木头×15 + 铁板×20 | 1.0 | 15 |
| Flame_Dev | 火焰喷射器(开发版) | 木头×20 + 铁板×15 | 1.0 | 15 |
| Cannon_Prod | 加农炮 | 木头×25 + 铁板×30 | 1.0 | 15 |
| MachineGun_Prod | 机枪 | 木头×15 + 铁板×20 | 1.0 | 15 |
| Flame_Prod | 火焰喷射器 | 木头×20 + 铁板×15 | 1.0 | 15 |
| AA_Gun_Dev | 防空炮(开发版) | 木头×30 + 铁板×35 | 1.0 | 15 |
| AA_Gun_Prod | 防空炮 | 木头×30 + 铁板×35 | 1.0 | 15 |
| ButcherTable | 屠宰台 | 木头×15 | 1.5 | 23 |
| Galley | 灶台 | 木头×25 | 2.0 | 30 |
| AmmoBench | 军械台 | 木头×30 | 2.0 | 30 |
| Brewery | 酒坊 | 木头×30 | 2.0 | 30 |
黄铜墙备注(CSV 原文):暂用铁板替代 Brass 材料。
免费即时建筑清单:BuildingConfig.csv 中存在、但成本表中没有的建筑——Railing(栏杆)、LargeFacility、PipeDebug、Light(顶灯)、Pipe(管道)、PurchaseBox(买入箱)、Stair(楼梯)、MagicContainer(魔法箱)、Bed(床)、WaterBarrel(水桶)、Toilet(厕所)。这些放置即完工、零材料(MultiConstructHandler.cs 回退逻辑)。
建筑放置属性表(BuildingConfig.csv,共 30 行,全量)
Section titled “建筑放置属性表(BuildingConfig.csv,共 30 行,全量)”| Name | 显示名 | 尺寸(X×Y 格) | Layer | 策略 | 最大生命值 | 快捷键 |
|---|---|---|---|---|---|---|
| Floor | 地板 | 1×1 | Floor | Rectangle | 100 | 1 |
| Railing | 栏杆 | 1×1 | Facility | Point | 1 | — |
| WallPine | 松木墙 | 1×1 | Facility | Line | 30 | 2 |
| WallOak | 橡木墙 | 1×1 | Facility | Line | 80 | — |
| WallBrass | 黄铜墙 | 1×1 | Facility | Line | 100 | — |
| WallIron | 铁墙 | 1×1 | Facility | Line | 150 | — |
| Door | 门 | 1×1 | Facility | Point | 80 | 3 |
| Window | 窗 | 1×2 | Facility | Point | 60 | 4 |
| LargeFacility | 大型设施 | 2×2 | Facility | Point | 300 | 5 |
| PipeDebug | 调试管道 | 1×1 | Pipe | Line | 50 | 6 |
| Light | 顶灯 | 1×1 | Light | Point | 30 | 7 |
| Cannon_Prod | 加农炮 | 1×2 | Facility | Point | 100 | 8 |
| MachineGun_Prod | 机枪 | 1×2 | Facility | Point | 100 | 9 |
| Flame_Prod | 火焰喷射器 | 1×2 | Facility | Point | 100 | 0 |
| WoodContainer | 木箱 | 1×1 | Facility | Point | 100 | I |
| WaterPump | 水泵 | 1×1 | Facility | Point | 100 | P |
| Pipe | 管道 | 1×1 | Pipe | Line | 50 | O |
| Boiler | 锅炉 | 2×2 | Facility | Point | 150 | L |
| Engine | 引擎 | 2×2 | Facility | Point | 150 | K |
| AA_Gun_Prod | 防空炮 | 1×2 | Facility | Point | 100 | U |
| PurchaseBox | 买入箱 | 1×1 | Facility | Point | 100 | T |
| Stair | 楼梯 | 1×1 | Facility | Point | 150 | N |
| MagicContainer | 魔法箱 | 1×1 | Facility | Point | 100 | J |
| Bed | 床 | 1×2 | Facility | Point | 80 | C |
| WaterBarrel | 水桶 | 1×1 | Facility | Point | 60 | — |
| Toilet | 厕所 | 1×1 | Facility | Point | 50 | G |
| ButcherTable | 屠宰台 | 1×1 | Facility | Point | 100 | — |
| Galley | 灶台 | 2×1 | Facility | Point | 120 | — |
| AmmoBench | 军械台 | 2×1 | Facility | Point | 100 | — |
| Brewery | 酒坊 | 2×2 | Facility | Point | 120 | Y |
(BuildingConfig.csv 还有一列 ConstructionTime,但实际工作量只读成本表的同名列,此列当前不参与任何计算,见已知限制。)
| 项目 | 数值 | 来源 |
|---|---|---|
| 维修材料消耗 | 无 | Steps.Repair.cs 代码 |
| 受损分级阈值 | 危重 ≤15% / 重伤 ≤40% / 中伤 ≤70% / 轻伤 <100% | Repairable.cs 代码常量 |
| 重度受损阈值 | 血量 ≤30% | Repairable.cs SevereDamageThreshold |
| 重度受损效率惩罚 | 建筑效率 ×0.5 | Repairable.cs EfficiencyModifier |
| 维修任务优先级 | 轻 5 / 中 7 / 重 9 / 危重 10 | RepairTaskIssuer.cs 代码常量 |
| 每帧恢复量 | 15 × 速度系数 HP(5/5 船员约 1.34 HP/帧 ≈ 80 HP/秒 @60帧) | Task_Repair.cs |
| 维修对象 | 仅 Completed 状态且未满血 | Repairable.cs CanRepair |
与其他系统的交互
Section titled “与其他系统的交互”- 任务与工作:搬料(FetchForConstruction)、施工(Build)、维修(Repair)全部属于 Construction 工作类型;船员的建造工作优先级决定是否接单。任务请求由 Issuer 每秒 5 次扫描生成,TaskManager 统一去重分配。
- 船员:施工/维修速度由“技艺”属性 × “建造”技能 × 状态效率决定;眩晕、力竭等状态效率系数会直接拖慢工地进度。
- 物品与库存:建材从全船容器按距离就近预约取料;工地材料暂存在框架脚下的地面容器,完工瞬间才消耗。拆框架时地面容器连同剩料一起删除。
- 生产与制作:木头/石头/铁板等建材的获取链路;工坊类建筑(屠宰台、灶台、军械台、酒坊)建成后才解锁对应配方。
- 建筑:建筑完工后的功能、血量、效率机制;墙体升级走“拆旧墙 + 即时建新墙”的替换流程(
WallUpgradeService.cs,材料扣除由调用方负责)。 - 船只:建筑网格挂在船本地坐标系上随船移动;放置预览实时广播质量增量影响船只性能预估;自动船壳生成器与玩家拆除标记联动。
- 伤害与护甲:维修的触发源是建筑受击掉血;框架在完工前不可被直接攻击。
- 寻路与移动:交互点解析要求“完工地板 + 无阻挡设施”才可站立,工地不可达会导致任务无法分配(任务面板可见原因“材料未齐全/建筑状态不是Frame”等诊断文本)。
- 开发者工具:即时建造作弊开关、场景测试中批量 InstantBuild。
- 存档:
BuildingData.cs为纯数据类,框架的材料/工作进度、需求表均可序列化恢复。 - 配置表总览:本页涉及
BuildingConfig.csv与BuildingConstructionCost.csv两张表。
配置与调参指南
Section titled “配置与调参指南”| 想调什么 | 改哪里 | 类型 |
|---|---|---|
| 某建筑的材料种类/数量 | Assets/StreamingAssets/BuildingConstructionCost.csv MaterialsJson 列(JSON 格式,如 {"Wood":5}) |
CSV(改后需 Tools → CSV Code Generator → Generate All) |
| 某建筑的施工工作量 | 同上 ConstructionTime 列(总工作量 = 该值 × 15) | CSV |
| 让某建筑免费即时建造 | 从成本表删掉该行 | CSV |
| 建筑尺寸 / 所在 Layer / 拖拽策略 / 血量 / 快捷键 | Assets/StreamingAssets/BuildingConfig.csv 对应列 |
CSV |
| 全局施工/维修基础速度 | Task_Build.cs / Task_Repair.cs 的 BASE_WORK_PER_TICK / BASE_REPAIR_PER_TICK(均 15) |
代码常量 |
| 工作量换算倍率(×15) | MultiConstructHandler.cs CreateBuildingInstance 内的硬编码 15 |
代码常量 |
| 船员速度成长曲线 | CrewAttributes.cs 的 BASE_COEF(0.2) / GROWTH_RATE(0.0805) |
代码常量 |
| 施工中材料复查间隔 | Task_Build.cs MATERIAL_CHECK_INTERVAL_TICKS(10 帧) |
代码常量 |
| 维修分级阈值 / 重伤效率惩罚 | Repairable.cs 四个阈值常量 + EfficiencyModifier |
代码常量 |
| 维修任务优先级 | RepairTaskIssuer.cs ModerateDamagePriority(7) / HeavyDamagePriority(9) |
代码常量 |
| 网格大小 / 甲板层数 / 格子尺寸 | mvp_002 场景 GridManager 组件的 xCount/zCount/gridSize/minDeck/maxDeck | Inspector 序列化字段 |
| 建造焦点椭圆 / 相机速度 | BuildingController 组件的 buildFocus* / camera* 字段 | Inspector 序列化字段 |
| 预览绿/红材质 | BuildingPreview 组件的 validPreviewMaterial / invalidPreviewMaterial | Inspector 序列化字段 |
| BuildBar 分类归属 | BuildBarCategories.cs 硬编码 7 类清单 |
代码常量 |
| 框架半透明度 | MultiConstructHandler.cs SetFrameAppearance 的 alpha 0.5 |
代码常量 |
已知限制与注意事项
Section titled “已知限制与注意事项”- 施工速度与帧率挂钩:工作量推进发生在任务驱动循环里、每渲染帧一次(
TaskBase.cs的 Do 循环逐帧 DriverTick),未做 deltaTime 归一。120 帧环境施工速度是 60 帧的两倍。维修同理。 - ConstructionTime 字段语义已过时:
MultiConstructHandler.cs中有明确 TODO——“ConstructionTime 字段过时,需重构 CSV 并移除此计算”,其注释中的旧公式(workPerTick = level × 0.3、完成时间 ≈ ConstructionTime × 10 秒)与现行实现不符,现行真实公式见上文。当前纯施工时间普遍不足 1 秒,建造节奏由走路/搬料主导。 BuildingConfig.csv的 ConstructionTime 列完全未被使用:工作量只读BuildingConstructionCost.csv,两表同名列数值还互相矛盾(如 WallIron 配置表写 4、ButcherTable 配置表写 3.0 而成本表写 1.5)。改工时只改成本表。- 拆除零返还与设计文档冲突:Notion 设计文档(修建 Construction)规定框架/成品拆除应“掉落已送达的全部材料”,实际实现是直接删除(框架工地剩料丢失、成品无任何返还)。
- 设计文档中的交互未实现:C 键拆除 tab、Q/E/滚轮旋转(实际为 R 键)、Esc/右键退出、右键建筑菜单(调优先级/拆除)均未实现;逐建筑的建造优先级调整不存在,只有按船员的工作类型优先级。
- 地基检查只查锚点格:2×2 建筑(锅炉、引擎等)只要锚点格有地板即可放置,其余三格可悬空;且框架状态的地板也算合法地基。
- 同批拖拽的链式有效性不重算:批量验证只做静态重叠检查,不会因“本批某个地板无效”连锁判定依赖它的后续格无效。
- 不在成本表中的建筑免费即时完工,包括 Pipe、Stair、Bed、Light 等正经玩法建筑——这是回退逻辑而非有意设计的减负,加新建筑时若忘配成本行就会变成免费建筑。
- 施工期间材料可被抽走:工地材料存放于公共地面容器,完工前可能被其他需求拿走,导致每 10 帧的材料复查触发施工中止(行为正确但表现为船员反复跑空趟)。
- 维修无耗材、无上限次数,纯粹由船员时间换血量;被摧毁(Destroyed)的建筑不可维修。
- 框架不可被攻击:可被攻击开关在完工时才打开,敌人无法拆玩家的在建框架。
StaticBuildingInfo.cs与ConstructStrategyType.cs为历史残留:前者整文件被注释掉(配置已迁移 CSV),后者是空命名空间占位(实际枚举由 CSV 代码生成器产出在Service.Common.Generated)。- 拆除预览的“按层匹配”在预览与执行间一致,但拆除高亮逻辑(
BuildingPreview.cs的 ShouldDestructBuilding)对 Floor 的处理是“全部高亮”,与执行层MultiDestructHandler.cs(Floor 选中时收集所有相交建筑)行为一致——但二者是两份独立实现,改其一须同步另一处。