前言
相关内容来自RimWorld Wiki ,本文仅做翻译和有限的补充,除非另有说明,所属内容均在 CC BY-SA 3.0 下提供。
RimWorld Wiki:https://www.rimworldwiki.com/wiki/Main_PageRimWorld
RimWorld Wiki - Modifying defs:https://www.rimworldwiki.com/wiki/Modding_Tutorials/Modifying_defs
水平有限,如有错漏,敬请见谅
如果您喜欢这篇文章,麻烦大家帮我点个赞,谢谢大家的支持!
开始
本教程向您展示了几种修改现有 Def 的方法,以及几种更改其XML格式的替代方法。
下表是本文的长话短说(TL;DR)版本,表中粗体字表示需要C#参与。
方法 | 优点 | 缺点 | 使用时机 |
---|---|---|---|
覆盖Defs | 及其简单 | 几乎没有兼容性 | 当你不在乎任何原版内容或者其他人的时候。 |
XPath补丁 | 高特异性、高兼容性 | 仅限于由XML 定义的 Def | 当你需要更改一些 XML 值时。 |
添加或自定义 Comp | 非常灵活,支持良好,兼容性强 | 不适用于每个 Def | 当你想要添加功能时。 |
DefModExtension | 非常简单,支持良好,兼容性强 | 只支持静态数据 | 当你想添加静态字段/数据时。 |
子类 | 相当强大,半数工作已由父类完成 | 兼容性问题,不是很灵活 | 当 Comp 和 DefModExtension 都不起作用时。 |
自定义Def | 完全控制 | 特化于你的模组 | 给定的 Def 对你来都说还不够时。 |
覆盖Defs
主词条:Modding_Tutorials/Compatibility_with_defs
如果两个模组对同类型且具有相同 defName 的 Def 都进行了修改,则后一个加载模组优先。例如,如果模组A添加了一个 defName 为 Pemmican 的 ResearchDef,而模组B也向同一个地方添加了一个 defName 为 Pemmican 的 ResearchDef,则游戏将使用模组B的 Pemmican。
优点:
及其容易。
缺点:
没有兼容性。
何时使用:
别用。
Xpath
主词条: Modding Tutorials/PatchOperations
XPath允许你以外科手术般精度跨模组的更改 Def 的特定值(如果需要也可以在单个操作中更改多个值)。
优点:
高特异性、高兼容性。
缺点:
仅限于用XML定义的Def(没有肉、尸体或其他生成相关的 Def )。更复杂的操作需要更繁琐的语法。
何时使用:
一直在用。(原文:All the time.)
上文表格:当你需要更改一些 XML 值时。
添加或自定义Comp
主条目:Modding Tutorials/ThingComp
thingcoms 就像一些小模块,你可以将其添加到任何 ThingWithComp 中,以赋予它们额外的功能。
优点:
非常灵活,支持良好和高度兼容。有许多现成的(示例)Comp 可用,可以用来做各种各样的事情。
缺点:
不适用于每个类型Def。
何时使用:
当你想要添加功能、非静态数据或行为时。
DefModExtension
主条目:Modding Tutorials/DefModExtension
优点:
简单,轻量,兼容性强。
缺点:
仅适用于静态数据。
何时使用:
当你想向 Def 添加(静态)字段/数据时。
子类化
主条目:Modding_Tutorials/Def_classes
从 Def 继承,并明确告诉 RimWorld 使用该特定类型。
优点:
子类是属于你自己的类型,所以你可以扩展它们的功能,直到你心满意足为止。
缺点:
-
子类仍然绑定到基础Def,无法访问其私有方法;
-
使用子类需要精挑细选;
-
每个 Def 只有一个自定义类;
-
与 DefModExtensions 或其他C#扩展方法相比,子类化没有提供太多额外的功能;
何时使用:
当 Comp 和 DefModExtension 都不起作用时。
自定义Def
主条目:Modding Tutorials/Def_classes
从 Def 继承(可选)并告知RimWorld如何使用你的自定义 Def。
优点:
完全属于你自己的类型,完全由你控制。没有兼容问题,因为它们独属于你。
缺点:
需要自己从头开始实现。
何时使用:
当你的模组或特定目的需要一些独一无二的 Def 时。
其他方法
标签检查
除了使用自定义 defClasses 和 comps,你还可以使用标签。这对于轻量级功能和简单的兼容性特别有用。
一些标签永远不会被某个事物使用,例如 Building 上的 <ApparelTag>
标签。如果一个标签从未被使用过,它同样也不会引起错误。因此你可以将任意数量的无用标签引入一个模组,而不会让游戏报错。其他模组同样可以毫无问题的检查这些标签。通过这种方式,你可以添加任意名称的标签,并让其他人通过这些标签检查兼容性。
优点:
轻量,简单。
缺点:
有潜在的风险,这听起来优点吓人。
更改Def使用的类
许多 Def 都有一个字段,用于指定它们所绑定的 C# 类。例如,Eclipse 的 GameConditionDef
的 conditionClass
为 GameCondition_Eclipse。希望为 Eclipse 添加一些 Spark 的模组制作者可以创建一个名为 GameCondition_EclipseWithSparkles
的新 GameCondition 类,并使用 XPath 将conditionClass
更改为 MyNameSpace.GameCondition_EclipseWithSparkles
。
优点:
简单。保持原始 Def 的大多数值不变。
缺点:
会导致作用于原始类上的Harmony补丁失效,因此存在潜在的兼容性问题。
Harmony 补丁
主条目: Modding Tutorials/Harmony
如果在了解上述所有选择之后,你仍然希望使用Harmony,那么你可能已经陷入了Golden Hammer反模式。不过,请继续。
另请参阅
Compatibility with defs :从XML方面解释了兼容性。