C# 模组开发
C# 模组通过 TN 的托管运行时加载,API 形状对齐 tModLoader 1.4.4; 模组的 C# 入口源码在设备上(或宿主侧编译环境)编译为程序集后加载。
1. 最小目录
example-mod-csharp/
tnmod.json
scripts/
ExampleModCSharp.cs
2. tnmod.json
{
class="s">"format": class="s">"tnmod",
class="s">"formatVersion": 1,
class="s">"apiVersion": 1,
class="s">"id": class="s">"example.csharp",
class="s">"name": class="s">"ExampleModCSharp",
class="s">"version": class="s">"1.0.0",
class="s">"description": class="s">"Minimal C# mod.",
class="s">"entry": class="s">"ExampleModCSharp.cs",
class="s">"targetGame": { class="s">"package": class="s">"com.and.games505.Terraria", class="s">"minVersionCode": 301720, class="s">"maxVersionCode": 301729 },
class="s">"dependencies": [],
class="s">"permissions": [class="s">"content.register", class="s">"localization.read", class="s">"log"],
class="s">"capabilities": [class="s">"content", class="s">"localization"]
}
与 JS 模组的区别:entry 指向 .cs 源文件,capabilities 使用 C# 运行时能力。
3. 入口
using Terraria.ModLoader;
namespace ExampleModCSharp;
public sealed class ExampleModCSharp : Mod
{
public override void Load()
{
Logger.Info(class="s">"loaded");
}
public override void PostSetupContent()
{
Logger.Info(class="s">"content ready");
}
public override void Unload() { }
}
- 类名与
id不要求一致;运行时通过入口源文件找到Mod子类; Logger.Info/Warn/Error写入boot.log;Load()在内容注册前调用,PostSetupContent()在内容就绪后调用,Unload()在卸载时调用。
4. 内容 API
常用基类与 tModLoader 1.4.4 一致:
| 基类 | 用途 |
|---|---|
ModItem | 物品 |
ModProjectile | 弹幕 |
ModBuff | Buff |
ModTile / ModWall | 图块 / 墙壁 |
ModNPC | NPC |
ModPlayer | 玩家钩子 |
ModWorld | 世界钩子 |
ModSystem | 系统级注册与钩子 |
ModConfig | 配置界面 |
内容注册通过 ModContent 完成;本地化、贴图与 tModLoader 的项目结构一致。
5. 构建与调试
.tnmod内的 C# 源文件由运行时在设备上编译(无需在手机上装 SDK);- 编译错误会写入
boot.log(含文件、行号、错误码),管理器日志页可直接查看; - 开发迭代建议:先用最小入口跑通加载,再逐步添加内容类;
- 当前版本的 API 覆盖以文档与实测为准;不支持的类型/成员会在编译期或加载期以明错 fail-closed,
不会静默降级。
大型模组(含大量内容与资源)建议先确认目标版本的内存预算; 运行时会按资产预算做降级加载,详见运行时能力与边界。
TerraNova Loader