验证环境
本页示例已使用 Build 740622 对应的本机 Managed DLL 完成编译检查;尚未在游戏内完成运行验证。
科技树
本页只提供当前 API 已确认的做法:把建筑或物品加入已有科技的解锁列表。
当前版本限制
“创建全新的科技节点”涉及 Tech、ResourceTreeNode 和连线 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 上编译并在新旧存档中验证后,再恢复本节。
检查是否生效
- 使用当前游戏 DLL 编译 Mod。
- 查看
Player.log,确认Db.Initialize补丁没有异常。 - 创建新档并打开研究界面。
- 检查目标科技是否包含新的解锁项。
- 研究完成后确认建筑或物品可以正常使用。