Skip to content

验证环境

本页已在游戏 Build 740622、.NET Standard 2.1、Mod API 2 下验证。

科技树

本页只提供当前 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 更容易排查。示例应在新档中确认建筑出现在目标科技的解锁项里。

常用原版科技 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. 研究完成后确认建筑或物品可以正常使用。