跳到主要内容

修改UnityEngine dll

由于有些版本的dll与热重载并不兼容,需要小幅修改代码。

使用dnspy工具

我们使用 dnspy 来修改 dll文件。而dnspy只能在Win下运行,故哪怕是mac版本dll, 你也得先将相应dll复制到Win下后再修改。下载 dnspy,选择 Win64版本

修改dll的操作大致如下:

  • dnspy中清空左侧所有dll
  • 打开dll
  • 找到你要修改的函数 ToModifiedType.ToModifiedMethod 函数, 右键菜单 -> 编辑方法(c#)...,弹出源码编辑界面。
  • 如果编辑器提示缺少某些dll引用,点击源码编辑窗口左下角类似文件夹的按钮,进行添加。
  • 修改代码
  • 点击右下角的 编译 按钮,如果成功,则无任何提示,退出编辑界面,返回反编译查看模式。如果失败,请自行处理编译错误。有时候dnspy会有莫名其妙的引用错误,退出源码编辑模式,重新右键编辑方法,再次进入就能解决。
  • 菜单 文件 -> 保存模块 保存修改后的dll文件。如果在Win或Mac下,有可能会遇到权限问题,请酌情处理(比如先保存到其他位置,再手动覆盖)

修改 UnityEngine.CoreModule.dll

警告

只有 Unity 2022+版本才需要修改。

Unity对于每个BuildTarget提供了单独一套UnityEngine dll,它们位置在 {editor_install_dir}/Editor/Data/PlaybackEngines/{platform}/Variations/il2cpp(iOS平台为iOSSupport\Variations\il2cpp\Releasearm64_managed)目录下, 请根据自己需要打包的平台,替换每个平台下的相关dll。

由于UnityEngine.CoreModule.dll引用了NetStandard 2.1,编译前需要先将Editor\Data\NetStandard\ref\2.1.0\netstandard.dll拉入 dnspy左侧程序集资源管理器中。

原始代码:

namespace Unity.Collections.LowLevel.Unsafe
{
// Token: 0x020000A6 RID: 166
internal static partial class BurstRuntime
{
// Token: 0x020000A7 RID: 167
private partial struct HashCode64<T>
{
// Token: 0x06000348 RID: 840 RVA: 0x000063F5 File Offset: 0x000045F5
// Note: this type is marked as 'beforefieldinit'.
static HashCode64()
{
BurstRuntime.HashCode64<T>.Value = BurstRuntime.HashStringWithFNV1A64(typeof(T).AssemblyQualifiedName);
}
}
}
}

修改后的代码:

using System;

namespace Unity.Collections.LowLevel.Unsafe
{
// Token: 0x020000A6 RID: 166
internal static partial class BurstRuntime
{
// Token: 0x020000A7 RID: 167
private partial struct HashCode64<T>
{
// Token: 0x06000348 RID: 840 RVA: 0x000063F5 File Offset: 0x000045F5
// Note: this type is marked as 'beforefieldinit'.
static HashCode64()
{
BurstRuntime.HashCode64<T>.Value = BurstRuntime.HashStringWithFNV1A64(typeof(T).AssemblyQualifiedName + ":" + typeof(T).GetHashCode().ToString());
}
}
}
}