C# 模组开发

用 C# 编写 tModLoader 形状的模组,由运行时在设备上编译并加载。 · UPDATED 2026-11-08

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() { }
}

4. 内容 API

常用基类与 tModLoader 1.4.4 一致:

基类用途
ModItem物品
ModProjectile弹幕
ModBuffBuff
ModTile / ModWall图块 / 墙壁
ModNPCNPC
ModPlayer玩家钩子
ModWorld世界钩子
ModSystem系统级注册与钩子
ModConfig配置界面

内容注册通过 ModContent 完成;本地化、贴图与 tModLoader 的项目结构一致。

5. 构建与调试

不会静默降级。

大型模组(含大量内容与资源)建议先确认目标版本的内存预算; 运行时会按资产预算做降级加载,详见运行时能力与边界。