Rimworld Mod开发:从零构建DLL模块的完整指南
1. 环境准备与工具安装想要开发Rimworld Mod的DLL模块首先得把开发环境搭建好。这里我推荐使用Visual Studio Code简称VSCode作为主要开发工具它轻量、免费而且对C#的支持相当不错。当然如果你习惯用Visual Studio也可以不过我个人觉得VSCode对Mod开发来说更轻便。第一步是安装.NET Framework 4.7.2 Developer Pack。这个开发包是必须的因为Rimworld是基于这个版本的.NET Framework开发的。你可以直接从微软官网下载搜索Download .NET Framework 4.7.2 Developer Pack就能找到。安装过程中可能会遇到一个小坑如果你已经安装了.NET Framework 4.7.2运行时安装开发包时可能会提示失败。别慌重启电脑再试一次通常就能解决。安装完开发包后建议再装几个实用工具ILSpy或dnSpy用来反编译查看游戏原版代码Everything快速查找文件的小工具后面配置项目时会很有用Git版本管理工具虽然不做版本管理也能开发但有了它会更安心提示安装完VSCode后记得安装C#扩展插件这是编写和调试C#代码的基础。2. 创建Mod项目结构现在我们来创建Mod的项目结构。Rimworld Mod有一个标准的目录结构遵循这个结构能让你的Mod更容易被游戏识别和加载。打开命令行创建一个新文件夹作为你的Mod根目录然后在这个目录下运行dotnet new classlib这个命令会创建一个基础的类库项目。接下来我们需要手动创建一些必要的文件夹和文件。完整的Mod结构应该像这样你的Mod名称/ ├── About/ │ ├── About.xml │ └── Preview.png ├── Assemblies/ │ ├── 你的Mod名称.dll │ └── 你的Mod名称.pdb ├── .vscode/ │ └── tasks.json ├── 你的Mod名称.csproj └── Main.csAbout.xml是Mod的元数据文件包含Mod名称、作者、描述等信息。Preview.png则是Mod在游戏中的预览图。Assemblies文件夹存放编译好的DLL文件这是Mod的核心部分。3. 配置项目文件.csproj文件是项目的核心配置文件需要特别注意。原始文章中的示例已经给出了一个基本模板但有几个关键点需要强调首先TargetFramework必须设置为net472因为Rimworld运行在.NET Framework 4.7.2上。其次也是最容易出错的部分——HintPath的配置。这些路径指向Rimworld游戏的核心程序集你需要根据自己电脑上的实际安装路径进行修改。Project SdkMicrosoft.NET.Sdk PropertyGroup TargetFrameworknet472/TargetFramework /PropertyGroup ItemGroup Reference IncludeAssembly-CSharp HintPath你的Rimworld安装路径\RimWorldWin64_Data\Managed\Assembly-CSharp.dll/HintPath Privatefalse/Private /Reference !-- 其他必要引用... -- /ItemGroup /Project这里有个小技巧使用Everything工具搜索Assembly-CSharp.dll可以快速找到游戏安装目录下的这个文件。找到后把完整路径复制到HintPath中。记得要把路径中的反斜杠()改为正斜杠(/)或者在XML中使用转义字符(和)。4. 编写基础Mod代码现在我们可以开始写一些实际的Mod代码了。创建一个Main.cs文件这是Mod的入口点。一个最简单的Mod可能长这样using RimWorld; using Verse; namespace YourModName { [StaticConstructorOnStartup] public static class YourModClass { static YourModClass() { Log.Message(我的第一个Mod加载成功啦); } } }这段代码做了几件事引用了Rimworld的核心命名空间创建了一个静态类使用[StaticConstructorOnStartup]特性标记表示这个类的静态构造函数会在游戏启动时自动执行在构造函数中输出了一条日志信息编译并把这个Mod放到游戏的Mods文件夹后启动游戏就能在开发者控制台看到这条日志了。虽然这个Mod什么都没做但它验证了你的开发环境配置是正确的。5. 编译与调试技巧编译Mod很简单在项目根目录运行dotnet publish -c Release -o ./你的Mod名称/Assemblies这个命令会把Mod编译为Release版本并输出到Assemblies文件夹。为了方便调试我强烈建议配置VSCode的tasks.json文件把编译命令保存为一个任务{ version: 2.0.0, tasks: [ { label: 编译Mod, type: shell, command: dotnet publish -c Release -o ./你的Mod名称/Assemblies, problemMatcher: [], group: { kind: build, isDefault: true } } ] }配置好后按CtrlShiftB就能一键编译了。调试时可以使用Log.Message输出信息到游戏的控制台这是最直接的调试方式。对于复杂问题可能需要用到dnSpy等工具来查看游戏的实际运行状态。6. 常见问题与解决方案在开发过程中你可能会遇到几个典型问题问题1编译时报错无法找到程序集引用这通常是因为HintPath配置不正确。确保路径确实指向了有效的DLL文件路径使用了正确的斜杠方向文件名拼写正确注意大小写问题2Mod加载了但没有效果检查几点确保About.xml配置正确特别是packageId要唯一查看游戏日志是否有错误信息确认你的代码确实被调用了添加日志输出问题3游戏更新后Mod不工作了Rimworld更新可能会改变一些类和方法这时候你需要用dnSpy查看新版本的游戏代码调整你的代码以适应变化更新Mod版本号并通知用户7. 进阶开发建议当你掌握了基础后可以尝试更复杂的功能使用Harmony库进行补丁Harmony是Rimworld Mod开发的核心工具允许你修改游戏原有代码而不直接改动它。安装Harmony后你可以这样使用[HarmonyPatch(typeof(SomeGameClass), SomeMethod)] static class Patch { static void Postfix(ref string __result) { __result 修改后的结果; } }创建自定义DefDef是Rimworld的数据驱动架构基础你可以通过XML定义新的物品、建筑等然后在代码中引用它们。添加设置界面让玩家可以配置你的Mod选项这需要用到ModSettings类。处理多语言通过Keyed语言系统支持多语言提升Mod的可用性。记住Rimworld的Mod开发社区非常活跃遇到问题时不妨去官方论坛或Mod开发Discord频道寻求帮助。大多数资深开发者都很乐意帮助新人解决问题。