🎮
环境配置
1 2 3 4 5 6
| <linker> <assembly fullname="Unity.Model" preserve="all" /> <assembly fullname="Unity.ThirdParty" preserve="all" /> <assembly fullname="UnityEngine" preserve="all" /> <assembly fullname="System" preserve="all" /> </linker>
|
link.xml 标记了在打包的时候哪些文件类型不被剔除掉
建议
创建的脚本最好放到 Hotfix 下
或者 Model 下
要么 放到 ThirdPart 下
有相关的dll文件
可以把依赖文件留着 以后项目也能用
ILRuntime 的实现原理
ILRuntime借助Mono.Cecil库来读取DLL的PE信息,以及当中类型的所有信息,最终得到方法的IL汇编码,然后通过内置的IL解译执行虚拟机来执行DLL中的代码。
扩展接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;
[InitializeOnLoad] public class BuildHotfixEditor { private const string scriptAssembliesDir = "Library/ScriptAssemblies";
private const string codeDir = "Assets/Res/Code/";
const string hotfixDll = "Unity.Hotfix.dll";
const string hotfixPdb = "Unity.Hotfix.pdb";
static BuildHotfixEditor() { File.Copy(Path.Combine(scriptAssembliesDir,hotfixDll),Path.Combine(codeDir,hotfixDll+".bytes"),true); File.Copy(Path.Combine(scriptAssembliesDir,hotfixPdb),Path.Combine(codeDir,hotfixPdb+".bytes"),true); Debug.Log("复制hotfix文件成功"); AssetDatabase.Refresh(); } }
|
Unity主工程 和 热更新工程 的交互
1 2 3 4 5 6 7 8 9 10 11 12 13
| void Start() { Load(); CallStaticFunction(); }
void CallStaticFunction() { appDomain.Invoke("Unity.Hotfix.Init", "Log",null,null); appDomain.Invoke("Unity.Hotfix.Init", "Log",null,"Hello ILR!"); appDomain.Invoke("Unity.Hotfix.Init", "Log",null, new string[]{"hello","ilr"}); }
|
所调用的函数区域👇
或许是”重载”由参数自动匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| using System.Collections; using System.Collections.Generic; using UnityEngine;
namespace Unity.Hotfix { public class Init { static void Log() { Debug.Log("Log1被调用了"); } static void Log(string text) { Debug.Log("Log1被调用了"+text); } static void Log(string str1,string str2) { Debug.Log("Log1被调用了"+str1+":"+str2); } }
}
|