【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用


3楼猫 发布时间:2024-12-07 05:36:36 作者:甄别 Language

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第0张
【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第1张

本期教程将是整个系列教程的重点部分,这是最核心的内容。在本期中,我们将讨论Harmony补丁的基础知识。首先,让我们来了解一下什么是Harmony。

Harmony是一个用于对游戏内方法进行补丁的库,是我们经常使用的工具之一。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第2张

举例来说,假设我们之前实现了一个按键R来触发某项功能。但很多时候,我们并不希望通过按键来触发功能,比如我想要我的收入翻倍,我不可能每按一次快捷键就会增加相应金额,那并非我们想要的效果。我们希望的是完全不需要按键,而是自动实现收入翻倍或其他随机效果。这时候我们就需要使用Harmony,在其中找到“Harmony”,然后找到我们的手册进行操作。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

这期教程中,我会先介绍一些基础的使用方法,如何创建一个简单的后置补丁。什么是后置呢?简单来说,就是在函数执行完毕后再执行其他操作。与之相对应的是前置,即在函数即将执行之前先执行其他操作。通过这两种方式,我们可以实现大多数功能。

在mod制作中,后置和前置是最常用的两种技术。接下来,我们将编写一个后置补丁,当游戏中显示伤害数字时,在控制台打印出造成的伤害值。我们将编写一个静态方法,确保函数命名符合习惯格式,以便更好地管理代码。接下来,我们将把这个函数转换为后置补丁,通过蓝图编辑器添加必要的设置来实现我们的目标。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

接着,让我们优先创建一个标签。在这里,我们添加一个名为"HAMMCOFFIX"的标签,这是一个持续生效的标签。这个标签可以写在同一行,也可以另起一行,我通常会选择写在同一行并在逗号旁边加上"pass"。

首先,我们将第一个参数选为函数类型。接下来是函数名的参数设置。完成后,我们就成功创建了一个后置补丁。但目前我们还没有将其注入到游戏中,参数方面需要进一步调整。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

在此过程中,我们可以查看参数的获取方式。通过下划线两次的方式(__instance)代表对象本身,而"In test"则表示对象发生时的调用者。如果函数有返回值,我们可以在这里处理返回值。"set"的作用是定义了一个后置定位,用于在前置和后置之间传输数据。

在最后,参数名称需要具体指明,数量要保持一致。通过复制粘贴方法可以获取数量,并输出结果。另外,需要注意的是由于静态属性无法直接使用,我们可以将其保存为静态变量或将插件制作成一个单元进行间接使用。最后,我们可以使用内插字符串的方式进行输出,美元符号表示内插字符串。

如果对内插字符串不熟悉,建议学习一下基础知识,以便更好地理解。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

我们可以记录伤害是多少G。这样,一个后置补丁就写好了,但目前尚未生效,因为我们还没有进行注入。之前的步骤已经无用,需要特别注释掉。

接下来,我们将创建一个"Harmonycreate and party"类,并输出一个类。记住,这个类的作用是自动创建一个哈密实例,并对该类下所有带有MTT标签的函数进行补丁操作。因为手动一个一个输出非常繁琐,在本期视频中不涉及手工操作的内容。

在未来的教程中会介绍如何使用注入,实际情况下很少需要,除非遇到大量相似命名的情况。绝大多数情况都不需要使用这种方式,因为Harmony已经能解决95%以上的问题。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

重新生成后,启动游戏,放置一个防御塔,然后检查输出,确认伤害值已被记录。如果塔的攻击力是24,而敌人有防御值,那么我们成功完成了最基础的后置补丁。

接下来,我们将编写一个前置补丁。虽然和后置补丁相似,但前置补丁会返回一个boss对象。需要注意的是要做出区分,并学习相关知识。

另外再说一下,在之前的代码中,如果有未使用的参数,可以将其删除,只保留使用到的参数。可以复制一份代码并修改,这样的代码重构也是有效的。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

在前面所提到的post中,将其改为pr就表示前置补丁。在前置补丁中返回一个布尔值,用来表示是否要拦截原函数的执行。如果返回true,则在执行完自己的代码后会继续执行原函数;若返回false,则执行完自己的代码后原函数会被直接抛弃,不再执行。

这种方式通常有两个主要用途,比如传入伤害值并输出,或者在前置处对数值进行修改。如果要修改数值,可以使用REF关键字对实际数值进行修改。例如,无论造成多少伤害,都传入9999这个数值。预期的结果是显示的伤害数字为9999,但实际伤害仍然是六。

【干货】Unity引擎游戏MOD开发教程06:Harmony补丁基础使用-第3张

对于否则情况,当再次建立一个塔时,观察发现下一波攻击敌人没有任何输出,但控制台中输出了。这说明函数已经执行过,但实际体现被拒绝了。这种拒绝操作通常很少需要,主要用来重写输入参数,或者重新实现逻辑。

重写一般在你需要改变具体实现逻辑时使用,比如生成敌人的逻辑等。你想要自定义生成规则时,可以拒绝原函数并进行重写。学会了这些基础使用方法,已经能够实现许多效果。分析代码功能,修改参数或重写就能完成任务。


© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com