Skip to content

验证环境

本页示例已使用 Build 740622 对应的本机 Managed DLL 完成编译检查;尚未在游戏内完成运行验证。

科技树

本页只提供当前 API 已确认的做法:把建筑或物品加入已有科技的解锁列表。

当前版本限制

“创建全新的科技节点”涉及 TechResourceTreeNode 和连线 API。当前游戏 DLL 的公开成员与旧示例不一致,本页暂不提供可复制的新增节点代码。请不要直接使用旧版示例修改科技树布局。

将内容加入已有科技

Db.Initialize 之后找到目标科技,并把内容 ID 加入 unlockedItemIDs。完整可编译示例位于 examples/ResearchExistingTech/Mod.cs

csharp
using HarmonyLib;
using KMod;
using UnityEngine;

namespace ONITutorial.ResearchExistingTech
{
    public sealed class Mod : UserMod2
    {
        public const string UnlockId = "ONITutorialResearchUnlock";

        public override void OnLoad(Harmony harmony)
        {
            base.OnLoad(harmony);
            Debug.Log("[ONITutorial.ResearchExistingTech] Loaded");
        }

        [HarmonyPatch(typeof(Db), nameof(Db.Initialize))]
        private static class DbInitializePatch
        {
            private static void Postfix()
            {
                Tech tech = Db.Get().Techs.TryGet("BasicRefinement");
                if (tech != null && !tech.unlockedItemIDs.Contains(UnlockId))
                    tech.unlockedItemIDs.Add(UnlockId);
            }
        }
    }
}

TryGet 在科技 ID 写错时返回 null,比直接调用 Get 更容易排查。示例应在新档中确认建筑出现在目标科技的解锁项里。

和内容注册配合

科技解锁应该放在内容注册之后处理:

text
创建建筑/物品 → 注册内容 ID → 找到已有 Tech → 加入 unlockedItemIDs

如果只写科技补丁,却没有对应的建筑或物品,研究界面可能有一项空解锁;如果只注册内容而没有科技补丁,它通常会直接出现在调试菜单,但不会出现在研究树中。

建议把注册和解锁拆成两个补丁,出了问题可以分别看日志。examples/Building/Mod.cs 展示了建筑注册和科技解锁,examples/ResearchExistingTech/Mod.cs 只保留科技部分,适合对照阅读。

常用原版科技 ID:

科技 ID中文名
FarmingTech基础耕种
FineDining食物制备
BasicRefinement蛮力精炼
AdvancedResearch高级研究
SanitationSciences卫生设备
TemperatureModulation温度调节
LogicControl智能家居
GenericSensors通用传感器
HVAC暖通空调
LiquidTemperature液体微调

为什么暂不提供新增节点示例

当前 DLL 中已确认的相关 API 包括:

  • Tech 通过 node 保存节点,但该字段是私有字段。
  • Tech 当前构造函数需要研究消耗字典等参数,旧的三参数调用不匹配。
  • 当前没有 Tech.GetResourceTreeNode()
  • ResourceTreeNode 当前只有以节点对象为参数的 Edge 构造函数,没有旧示例使用的 EdgePoint 类型。

因此,新增节点至少需要重新确认节点创建、坐标、前置关系、连线和存档兼容性,不能只根据旧文章拼接 API。待有完整项目在当前 DLL 上编译并在新旧存档中验证后,再恢复本节。

检查是否生效

  1. 使用当前游戏 DLL 编译 Mod。
  2. 查看 Player.log,确认 Db.Initialize 补丁没有异常。
  3. 创建新档并打开研究界面。
  4. 检查目标科技是否包含新的解锁项。
  5. 研究完成后确认建筑或物品可以正常使用。