From 有点好奇MOD是怎么制作的 178
首先,中文教程在这里https://www.bilibili.com/read/cv8997376
但更建议使用英文教程,因为中文教程作者大概已经好久不更新了,想提issue的话,还是找github的0Harmony的作者比较好。
---
很久很久之前,我们是使用UMM(全称懒得拼)管理mod的,这玩意会强制修改dll,修改后的dll会优先加载UMM的相应逻辑,于是UMM就可以借助“一次修改”完成其他Mod的安装
--你也看到了,这里需要一次修改,对经常更新的游戏,我们必须一次次修改游戏的dll,非常麻烦。
于是有大神(大概是unitydoorstop这个程序的制作人)想到了一个神奇技巧:
已知Unity游戏打开时候需要读若干dll,我们能否劫持某个dll,让这个dll执行我们的逻辑呢?
这里,为了方便,作者选择了,修改http相关的某个dll,在这个dll中注入一个逻辑,在加载dll的时候,这个dll需要加载另一个(由配置文件指定的)文件(比如bepinex的dll)
BepInEx的作者利用了UnityDoorStop,完成了加载。
由于dll的搜索是,工作目录优先于系统目录,所以,工作目录的dll会被优先加载(不知道这算不算劫持)
这大概是BepInEx系Mod的原理
之后就是BepInEx调用0Harmony.dll对现有程序进行patch了,这也是大多数Modder必须熟悉的内容:如何写Patch
教程里有,但不够详细(比如,如果某函数(DSP的StorageComponent的TakeTailItems)存在多个同名函数,你需要修改的函数的某个参数的类型带ref(比如,ref int),你将不能用教程的方法给这个函数加patch)
(真正解决问题,可以提/搜索issue,运气好,作者会帮你解决问题的~)
比如这里,可以用
1:
2:
3:
[HarmonyPatch(typeof(StorageComponent), "TakeTailItems",new Type[]{typeof(int) ,typeof(int),typeof(bool)},new ArgumentType[]{ArgumentType.Ref,ArgumentType.Ref,ArgumentType.Normal})]
https://nga.178.com/read.php?&tid=26889695&pid=518725946&to=1 标签:教程,ArgumentType,unitydoorstop,dll,随拾,typeof,修改,加载 From: https://www.cnblogs.com/bakabird/p/18253029