外观
C# / DLL 插件开发
当数据文件无法表达新的行为、界面或系统时,需要编写 C# 代码并随 .scmod 一起构建。最重要的不是复制某个示例类,而是让 SDK、NuGet 依赖和 API 分支完全一致。
开发环境
当前 API 1.9 模板使用 .NET 10 SDK 和 NuGet 包。实际安装时:
- 安装 .NET 10 SDK;
- 克隆 API 1.9 示例模板;
- 保留模板的
nuget.config并执行dotnet restore; - 不要引用另一个游戏版本目录中的同名 DLL;
- 把 API 包版本和模板提交写入项目说明。
旧教程需要隔离
历史教程使用过 .NET Framework 4.5、4.7.2 等环境,仅适用于对应旧分支。当前 API 1.9 以仓库模板声明的 .NET 10 SDK 为准,不要混合依赖。
建立最小项目
建议先让空插件完成“编译—加载—输出一条可确认信息”的闭环,再加入方块或组件。项目结构可以这样组织:
text
MyMod/
├─ MyMod.csproj
├─ src/
│ ├─ Entry.cs
│ ├─ Blocks/
│ ├─ Components/
│ └─ Subsystems/
├─ content/
└─ README.md具体入口、初始化方法和注册方式从目标 API 示例项目取得。先完成项目搭建,再阅读源码。
增加方块或物品
一个新内容通常不只是一段 C# 类,还涉及多处一致性:
text
代码中的类型与行为
↓
方块数据中的标识与属性
↓
配方中的名称和产物
↓
纹理或模型资源
↓
API 加载清单 / 封装信息任何一层名称不一致,都可能表现为缺失纹理、配方无效、类型找不到或世界加载失败。
组件与子系统
- 组件(Component) 通常描述附着在实体上的一部分状态或行为。
- 子系统(Subsystem) 通常管理世界范围的服务、数据或更新逻辑。
- 覆盖加载、保存、实体加入与移除等生命周期时,要调用或保留目标 API 要求的基础行为。
- 每帧更新代码中避免文件 IO、网络请求、大量分配和无边界遍历。
修改既有逻辑
直接复制并替换原有类虽然能快速验证想法,但维护成本很高。优先顺序应是:
- 使用 API 提供的事件或扩展点;
- 继承可扩展类型并只覆盖必要方法;
- 用独立组件或子系统组合行为;
- 只有目标 API 没有扩展点时,才考虑替换核心逻辑,并记录被替换的原始版本。
调试编译错误
| 错误类型 | 优先检查 |
|---|---|
| 类型或命名空间不存在 | 引用程序集、API 分支、using 与类型是否已改名 |
| 程序集无法加载 | 目标框架、CPU 架构、依赖 DLL 与加载目录 |
| 编译成功但插件不出现 | 入口类型、访问级别、加载清单与日志 |
| 进入世界后崩溃 | 数据标识、生命周期顺序、空引用与旧存档兼容 |
| 性能持续下降 | 每帧逻辑、事件重复注册、未释放集合与资源 |
参考资料
IyBDIyAvIERMTCDmj5Lku7blvIDlj5EKCuW9k+aVsOaNruaWh+S7tuaXoOazleihqOi+vuaWsOeahOihjOS4uuOAgeeVjOmdouaIluezu+e7n+aXtu+8jOmcgOimgee8luWGmSBDIyDku6PnoIHlubbpmo8gYC5zY21vZGAg5LiA6LW35p6E5bu644CC5pyA6YeN6KaB55qE5LiN5piv5aSN5Yi25p+Q5Liq56S65L6L57G777yM6ICM5piv6K6pIFNES+OAgU51R2V0IOS+nei1luWSjCBBUEkg5YiG5pSv5a6M5YWo5LiA6Ie044CCCgojIyDlvIDlj5Hnjq/looMKCuW9k+WJjSBBUEkgMS45IOaooeadv+S9v+eUqCAuTkVUIDEwIFNESyDlkowgTnVHZXQg5YyF44CC5a6e6ZmF5a6J6KOF5pe277yaCgoxLiDlronoo4UgWy5ORVQgMTAgU0RLXShodHRwczovL2RvdG5ldC5taWNyb3NvZnQuY29tL2Rvd25sb2FkL2RvdG5ldC8xMC4wKe+8mwoyLiDlhYvpmoYgW0FQSSAxLjkg56S65L6L5qih5p2/XShodHRwczovL2dpdGVlLmNvbS9TQy1TUE0vU3Vydml2YWxjcmFmdFRlbXBsYXRlTW9kRm9yQVBJKe+8mwozLiDkv53nlZnmqKHmnb/nmoQgYG51Z2V0LmNvbmZpZ2Ag5bm25omn6KGMIGBkb3RuZXQgcmVzdG9yZWDvvJsKNC4g5LiN6KaB5byV55So5Y+m5LiA5Liq5ri45oiP54mI5pys55uu5b2V5Lit55qE5ZCM5ZCNIERMTO+8mwo1LiDmioogQVBJIOWMheeJiOacrOWSjOaooeadv+aPkOS6pOWGmeWFpemhueebruivtOaYjuOAggoKOjo6IHdhcm5pbmcg5pen5pWZ56iL6ZyA6KaB6ZqU56a7CuWOhuWPsuaVmeeoi+S9v+eUqOi/hyAuTkVUIEZyYW1ld29yayA0LjXjgIE0LjcuMiDnrYnnjq/looPvvIzku4XpgILnlKjkuo7lr7nlupTml6fliIbmlK/jgILlvZPliY0gQVBJIDEuOSDku6Xku5PlupPmqKHmnb/lo7DmmI7nmoQgLk5FVCAxMCBTREsg5Li65YeG77yM5LiN6KaB5re35ZCI5L6d6LWW44CCCjo6OgoKIyMg5bu656uL5pyA5bCP6aG555uuCgrlu7rorq7lhYjorqnnqbrmj5Lku7blrozmiJDigJznvJbor5HigJTliqDovb3igJTovpPlh7rkuIDmnaHlj6/noa7orqTkv6Hmga/igJ3nmoTpl63njq/vvIzlho3liqDlhaXmlrnlnZfmiJbnu4Tku7bjgILpobnnm67nu5PmnoTlj6/ku6Xov5nmoLfnu4Tnu4fvvJoKCmBgYHRleHQKTXlNb2QvCuKUnOKUgCBNeU1vZC5jc3Byb2oK4pSc4pSAIHNyYy8K4pSCICDilJzilIAgRW50cnkuY3MK4pSCICDilJzilIAgQmxvY2tzLwrilIIgIOKUnOKUgCBDb21wb25lbnRzLwrilIIgIOKUlOKUgCBTdWJzeXN0ZW1zLwrilJzilIAgY29udGVudC8K4pSU4pSAIFJFQURNRS5tZApgYGAKCuWFt+S9k+WFpeWPo+OAgeWIneWni+WMluaWueazleWSjOazqOWGjOaWueW8j+S7juebruaghyBBUEkg56S65L6L6aG555uu5Y+W5b6X44CC5YWI5a6M5oiQW+mhueebruaQreW7ul0oL2RldmVsb3Blci9tb2RkaW5nL3Byb2plY3Qtc2V0dXAp77yM5YaN6ZiF6K+75rqQ56CB44CCCgojIyDlop7liqDmlrnlnZfmiJbnianlk4EKCuS4gOS4quaWsOWGheWuuemAmuW4uOS4jeWPquaYr+S4gOautSBDIyDnsbvvvIzov5jmtonlj4rlpJrlpITkuIDoh7TmgKfvvJoKCmBgYHRleHQK5Luj56CB5Lit55qE57G75Z6L5LiO6KGM5Li6CiAgICAgICAg4oaTCuaWueWdl+aVsOaNruS4reeahOagh+ivhuS4juWxnuaApwogICAgICAgIOKGkwrphY3mlrnkuK3nmoTlkI3np7DlkozkuqfniakKICAgICAgICDihpMK57q555CG5oiW5qih5Z6L6LWE5rqQCiAgICAgICAg4oaTCkFQSSDliqDovb3muIXljZUgLyDlsIHoo4Xkv6Hmga8KYGBgCgrku7vkvZXkuIDlsYLlkI3np7DkuI3kuIDoh7TvvIzpg73lj6/og73ooajnjrDkuLrnvLrlpLHnurnnkIbjgIHphY3mlrnml6DmlYjjgIHnsbvlnovmib7kuI3liLDmiJbkuJbnlYzliqDovb3lpLHotKXjgIIKCiMjIOe7hOS7tuS4juWtkOezu+e7nwoKLSAqKue7hOS7tu+8iENvbXBvbmVudO+8iSoqIOmAmuW4uOaPj+i/sOmZhOedgOWcqOWunuS9k+S4iueahOS4gOmDqOWIhueKtuaAgeaIluihjOS4uuOAggotICoq5a2Q57O757uf77yIU3Vic3lzdGVt77yJKiog6YCa5bi4566h55CG5LiW55WM6IyD5Zu055qE5pyN5Yqh44CB5pWw5o2u5oiW5pu05paw6YC76L6R44CCCi0g6KaG55uW5Yqg6L2944CB5L+d5a2Y44CB5a6e5L2T5Yqg5YWl5LiO56e76Zmk562J55Sf5ZG95ZGo5pyf5pe277yM6KaB6LCD55So5oiW5L+d55WZ55uu5qCHIEFQSSDopoHmsYLnmoTln7rnoYDooYzkuLrjgIIKLSDmr4/luKfmm7TmlrDku6PnoIHkuK3pgb/lhY3mlofku7YgSU/jgIHnvZHnu5zor7fmsYLjgIHlpKfph4/liIbphY3lkozml6DovrnnlYzpgY3ljobjgIIKCiMjIOS/ruaUueaXouaciemAu+i+kQoK55u05o6l5aSN5Yi25bm25pu/5o2i5Y6f5pyJ57G76Jm954S26IO95b+r6YCf6aqM6K+B5oOz5rOV77yM5L2G57u05oqk5oiQ5pys5b6I6auY44CC5LyY5YWI6aG65bqP5bqU5piv77yaCgoxLiDkvb/nlKggQVBJIOaPkOS+m+eahOS6i+S7tuaIluaJqeWxleeCue+8mwoyLiDnu6fmib/lj6/mianlsZXnsbvlnovlubblj6ropobnm5blv4XopoHmlrnms5XvvJsKMy4g55So54us56uL57uE5Lu25oiW5a2Q57O757uf57uE5ZCI6KGM5Li677ybCjQuIOWPquacieebruaghyBBUEkg5rKh5pyJ5omp5bGV54K55pe277yM5omN6ICD6JmR5pu/5o2i5qC45b+D6YC76L6R77yM5bm26K6w5b2V6KKr5pu/5o2i55qE5Y6f5aeL54mI5pys44CCCgojIyDosIPor5XnvJbor5HplJnor68KCnwg6ZSZ6K+v57G75Z6LIHwg5LyY5YWI5qOA5p+lIHwKfCAtLS0gfCAtLS0gfAp8IOexu+Wei+aIluWRveWQjeepuumXtOS4jeWtmOWcqCB8IOW8leeUqOeoi+W6j+mbhuOAgUFQSSDliIbmlK/jgIFgdXNpbmdgIOS4juexu+Wei+aYr+WQpuW3suaUueWQjSB8Cnwg56iL5bqP6ZuG5peg5rOV5Yqg6L29IHwg55uu5qCH5qGG5p6244CBQ1BVIOaetuaehOOAgeS+nei1liBETEwg5LiO5Yqg6L2955uu5b2VIHwKfCDnvJbor5HmiJDlip/kvYbmj5Lku7bkuI3lh7rnjrAgfCDlhaXlj6PnsbvlnovjgIHorr/pl67nuqfliKvjgIHliqDovb3muIXljZXkuI7ml6Xlv5cgfAp8IOi/m+WFpeS4lueVjOWQjuW0qea6gyB8IOaVsOaNruagh+ivhuOAgeeUn+WRveWRqOacn+mhuuW6j+OAgeepuuW8leeUqOS4juaXp+WtmOaho+WFvOWuuSB8Cnwg5oCn6IO95oyB57ut5LiL6ZmNIHwg5q+P5bin6YC76L6R44CB5LqL5Lu26YeN5aSN5rOo5YaM44CB5pyq6YeK5pS+6ZuG5ZCI5LiO6LWE5rqQIHwKCiMjIOWPguiAg+i1hOaWmQoKLSBbTU9EIOaetuaehOOAgeW3peWFt+S4juaOkumUmV0oL2RldmVsb3Blci9tb2RkaW5nL2FyY2hpdGVjdHVyZS10b29saW5nKQotIFvljoblj7IgUEFLIOS4juaVsOaNruaWh+S7tuWPguiAg10oL2RldmVsb3Blci9tb2RkaW5nL2xlZ2FjeS1kYXRhLWZpbGVzKQotIFtTQ0FQSSAxLjkg6aG555uu5pCt5bu6XSgvZGV2ZWxvcGVyL21vZGRpbmcvcHJvamVjdC1zZXR1cCkK
