七日杀DLL类MOD开发入门:从零完成第一个MOD

发布于 2026-08-20 17:00 953 字 5 min read ... 访问量

KK avatar

KK

KK 的个人技术博客,记录服务器、网络、编程相关的折腾日常

DLL 类 MOD 是七日杀最强大的 MOD 形式,通过 C# 编写动态链接库实现 XML 无法做到的功能。这篇文章带你从零开始,完成第一个 DLL MOD。 什么是 DLL MOD DLL MOD 通过 C# 代码直接调用七日杀的游戏 API,可以实现: 自定义 UI 界面 复杂的游戏逻辑修改 NPC AI 行为定制 自定义武器/技能效果 服务器专用功能 相比 XML MOD,DLL MOD...

DLL 类 MOD 是七日杀最强大的 MOD 形式,通过 C# 编写动态链接库实现 XML 无法做到的功能。这篇文章带你从零开始,完成第一个 DLL MOD。

什么是 DLL MOD

DLL MOD 通过 C# 代码直接调用七日杀的游戏 API,可以实现:

  • 自定义 UI 界面
  • 复杂的游戏逻辑修改
  • NPC AI 行为定制
  • 自定义武器/技能效果
  • 服务器专用功能

相比 XML MOD,DLL MOD 功能更强但门槛也更高,需要基础的 C# 编程知识。

开发环境搭建

必需工具

工具用途下载
Visual Studio 2022IDE 编辑器visualstudio.microsoft.com
.NET Framework 4.7.2运行时Windows 自带
Assembly-CSharp.dll游戏核心库七日杀安装目录

项目创建

  1. 打开 Visual Studio,创建新项目
  2. 选择 类库 (.NET Framework) 模板
  3. 目标框架选择 .NET Framework 4.7.2
  4. 添加引用:指向七日杀目录下的 7DaysToDie_Data/Managed/Assembly-CSharp.dll

引用库说明

库名作用
Assembly-CSharp.dll七日杀核心游戏逻辑
UnityEngine.dllUnity 引擎核心
UnityEngine.UI.dllUnity UI 系统
UnityEngine.CoreModule.dllUnity 核心模块

MOD 基础结构

Mods/my-dll-mod/
├── ModInfo.xml
├── Config/
│   └── ... (XML配置文件,可选)
└── bin/
    └── Release/
        └── my-dll-mod.dll  ← 编译输出

ModInfo.xml

<?xml version="1.0" encoding="UTF-8"?>
<xml>
    <ModInfo>
        <Name>我的DLL MOD</Name>
        <Description>第一个DLL MOD</Description>
        <Author>KK</Author>
        <Version>1.0.0</Version>
    </ModInfo>
</xml>

第一个 DLL MOD:实体扫描器

这个 MOD 实现扫描周围实体并显示信息的功能。

代码实现

using UnityEngine;
using HarmonyLib;

public class EntityScannerMod
{
    // Harmony 补丁:在游戏 Update 中注入扫描逻辑
    [HarmonyPatch(typeof(XUi))]
    [HarmonyPatch("Update")]
    public class XUiUpdatePatch
    {
        static float lastScanTime = 0f;
        static float scanInterval = 2f; // 每2秒扫描一次
        
        static void Postfix(XUi __instance)
        {
            if (Time.time - lastScanTime < scanInterval) return;
            lastScanTime = Time.time;
            
            // 获取本地玩家
            EntityPlayerLocal player = __instance.xui.playerUI.entityPlayer;
            if (player == null) return;
            
            // 扫描周围10格内的实体
            Vector3 playerPos = player.position;
            float scanRadius = 10f;
            
            // 使用游戏API获取实体列表
            var entities = GameManager.Instance.World.GetEntitiesInBounds(
                typeof(Entity), 
                new Bounds(playerPos, Vector3.one * scanRadius * 2)
            );
            
            int entityCount = 0;
            foreach (var entity in entities)
            {
                if (entity is EntityAlive alive && alive != player)
                {
                    entityCount++;
                    float distance = Vector3.Distance(playerPos, alive.position);
                    // 可以在这里添加自定义逻辑
                }
            }
        }
    }
}

Harmony 补丁基础

七日杀使用 Harmony 库进行方法补丁。常用补丁类型:

// 前置补丁:在原方法执行前运行
[HarmonyPatch(typeof(ClassName))]
[HarmonyPatch("MethodName")]
[HarmonyPrefix]
static bool Prefix() { return true; } // 返回 false 则跳过原方法

// 后置补丁:在原方法执行后运行
[HarmonyPatch(typeof(ClassName))]
[HarmonyPatch("MethodName")]
[HarmonyPostfix]
static void Postfix() { }

// 转译补丁:替换原方法的 IL 代码
[HarmonyPatch(typeof(ClassName))]
[HarmonyPatch("MethodName")]
[HarmonyTranspiler]
static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { }

编译与调试

编译步骤

  1. 在 Visual Studio 中选择 Release 配置
  2. 生成解决方案(Ctrl+Shift+B)
  3. 复制 bin/Release/my-dll-mod.dll 到 MOD 目录

调试方法

  • 日志输出:使用 Debug.Log() 输出到游戏日志
  • 控制台命令:注册自定义控制台命令用于测试
  • 断点调试:附加到游戏进程进行断点调试(高级)
// 日志输出
Debug.Log("[我的MOD] 扫描完成,发现 " + entityCount + " 个实体");

// 控制台命令注册
public class MyConsoleCommand : IConsoleCommand
{
    public string GetDescription() => "测试命令";
    public string[] GetCommands() => new[] { "testcmd" };
    
    public void Execute(string[] _params, int _minParams)
    {
        SdtdConsole.Instance.Output("命令执行成功!");
    }
}

常见问题

DLL 加载失败

  • 检查 .NET Framework 版本是否匹配
  • 确认引用的 Assembly-CSharp.dll 版本与游戏版本一致
  • 查看日志文件中的错误信息

Harmony 补丁冲突

  • 多个 MOD 修改同一方法时可能冲突
  • 使用 Harmony.PatchAll() 的顺序可能影响结果
  • 建议在 ModInfo.xml 中声明依赖关系

游戏更新后 MOD 失效

  • 游戏更新可能修改 API,导致 DLL 编译失败
  • 需要更新引用的 Assembly-CSharp.dll
  • 重新编译 MOD

参考来源