Skip to content

Harmony 入门

Harmony 是 ADOFAI Mod 最核心的能力:在不修改游戏源码的前提下,拦截并修改游戏方法

为什么需要 Harmony

游戏是一个已编译的 Unity 程序,我们不能直接改它的源码。Harmony 通过运行时改写方法,让我们的代码在游戏方法之前、之后、甚至内部执行。

四种补丁类型

类型时机用途
Prefix方法执行前修改参数、提前返回(拦截)
Postfix方法执行后读取 / 修改返回值
Finalizer方法结束后(无论是否异常)异常处理
TranspilerIL 层面深度修改方法内部逻辑

本系列将用 11 章逐个讲透:

章节内容
Prefix 补丁拦截方法、修改参数
Postfix 补丁读取 / 修改返回值
Finalizer 补丁异常处理
魔法参数详解__instance / __result / __state
HarmonyPatch 详解各种目标写法与优先级
补丁生命周期补丁如何应用与移除
Transpiler 入门IL 是什么、补丁怎么写
Transpiler 实战CodeMatcher 高级用法
手动补丁用代码动态打补丁
Reverse Patch反向调用游戏方法

一个完整的补丁长什么样

csharp
using HarmonyLib;

namespace MyFirstMod
{
    [HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod))]
    public static class SomeMethod_Prefix
    {
        public static bool Prefix()
        {
            // 返回 false 会跳过原方法,实现拦截
            return false;
        }
    }
}

三个要素缺一不可:

  1. [HarmonyPatch] —— 声明要补丁的目标(类 + 方法)
  2. 补丁方法名 —— Prefix / Postfix / Finalizer / Transpiler,Harmony 靠名字识别
  3. 补丁类 —— 必须是 static classPatchAll 会自动扫描

找到目标方法

找到目标方法是 Mod 开发中最困难的部分之一。推荐用 dnSpyILSpy 反编译游戏程序集来定位。完整的定位教程见 定位目标方法

你学到了什么

  • Harmony 为什么存在
  • 四种补丁类型与时机
  • 一个补丁的三个要素

下一步

学习最常用的 Prefix 补丁 → Prefix 补丁

An organization that researches and expands the functions of ADOFAI