RimWorld:修改defs的几种方法简介

前言

相关内容来自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非常简单,支持良好,兼容性强只支持静态数据当你想添加静态字段/数据时。
子类相当强大,半数工作已由父类完成兼容性问题,不是很灵活CompDefModExtension 都不起作用时。
自定义Def完全控制特化于你的模组给定的 Def 对你来都说还不够时。

覆盖Defs

主词条:Modding_Tutorials/Compatibility_with_defs

如果两个模组对同类型且具有相同 defNameDef 都进行了修改,则后一个加载模组优先。例如,如果模组A添加了一个 defNamePemmicanResearchDef,而模组B也向同一个地方添加了一个 defNamePemmicanResearchDef,则游戏将使用模组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#扩展方法相比,子类化没有提供太多额外的功能;

何时使用:

CompDefModExtension 都不起作用时。

自定义Def

主条目:Modding Tutorials/Def_classes

Def 继承(可选)并告知RimWorld如何使用你的自定义 Def

优点:

完全属于你自己的类型,完全由你控制。没有兼容问题,因为它们独属于你。

缺点:

需要自己从头开始实现。

何时使用:

当你的模组或特定目的需要一些独一无二的 Def 时。

其他方法

标签检查

除了使用自定义 defClassescomps,你还可以使用标签。这对于轻量级功能和简单的兼容性特别有用。

一些标签永远不会被某个事物使用,例如 Building 上的 <ApparelTag>标签。如果一个标签从未被使用过,它同样也不会引起错误。因此你可以将任意数量的无用标签引入一个模组,而不会让游戏报错。其他模组同样可以毫无问题的检查这些标签。通过这种方式,你可以添加任意名称的标签,并让其他人通过这些标签检查兼容性。

优点:

轻量,简单。

缺点:

有潜在的风险,这听起来优点吓人。

更改Def使用的类

许多 Def 都有一个字段,用于指定它们所绑定的 C# 类。例如,EclipseGameConditionDefconditionClassGameCondition_Eclipse。希望为 Eclipse 添加一些 Spark 的模组制作者可以创建一个名为 GameCondition_EclipseWithSparkles 的新 GameCondition 类,并使用 XPath 将conditionClass更改为 MyNameSpace.GameCondition_EclipseWithSparkles

优点:

简单。保持原始 Def 的大多数值不变。

缺点:

会导致作用于原始类上的Harmony补丁失效,因此存在潜在的兼容性问题。

Harmony 补丁

主条目: Modding Tutorials/Harmony

如果在了解上述所有选择之后,你仍然希望使用Harmony,那么你可能已经陷入了Golden Hammer反模式。不过,请继续。

另请参阅

Compatibility with defs :从XML方面解释了兼容性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值