项目配置

huatuo 由两部分构成il2cpp_huatuo 仓库huatuo 仓库 

il2cpp_huatuo 仓库基于 unity 原始 il2cpp 作了少量修改(几百行),使得它可以支持动态注册元数据,进行可以动态加载 dll

huatuo 仓库是 huatuo 的核心源代码

注意,il2cpp部分需要和unity版本契合,版本对应关系如图

上面两部分并不用下载,我们到这里,下载示例工程

然后进入项目的HuatuoData目录,这里存放了所有插件相关的东西

其实都是git/svn相关的一些快捷指令,我们不使用这些指令自己手动克隆仓库也是可以的,但偷懒直接用指令吧

首先我们初始化仓库,bat是git命令,sh是svn命令,自己选择合适的就好

运行init_huatuo_repos.bat,克隆到下面两个文件夹

然后我们设置一下分支版本,选择的版本一定要和你使用的unity版本一致,在这里我们选用2020.3.33

然后我们运行init_local_il2cpp_data.bat扩展il2cpp插件,但是,我们需要先右键编辑文件 这个路径应该是对应你本地unity版本的路径,图里是2020.3.18,我们应该改成本地3.33版本的路径,然后运行

然后就可以用目标版本的unity打开项目啦

项目流程简介

打开脚本LoadDll

void Start()  
{  
    BetterStreamingAssets.Initialize();  
    LoadGameDll();  
    RunMain();  
}
  • BetterStreamingAssets 一个访问StreamingAssets的插件,更高效安全,当然不在ht范围内,我们不关心
  • LoadGameDll 加载Dll
  • RunMain 运行
private void LoadGameDll()  
{  
    AssetBundle dllAB = AssemblyAssetBundle = BetterStreamingAssets.LoadAssetBundle("common");  
#if !UNITY_EDITOR  
    TextAsset dllBytes1 = dllAB.LoadAsset<TextAsset("HotFix.dll.bytes");  
    System.Reflection.Assembly.Load(dllBytes1.bytes);        
	TextAsset dllBytes2 = dllAB.LoadAsset<TextAsset("HotFix2.dll.bytes");        
	gameAss = System.Reflection.Assembly.Load(dllBytes2.bytes);
#else  
    gameAss = AppDomain.CurrentDomain.GetAssemblies().First(assembly => assembly.GetName().Name == "HotFix2");  
#endif  
  
    GameObject testPrefab = GameObject.Instantiate(dllAB.LoadAsset<UnityEngine.GameObject>("HotUpdatePrefab.prefab"));  
}

首先我们加载common AssetBundle包 然后 如果我们在编辑器模式,我们直接通过AppDomain获得当前所有程序集,并找到名称为HotFix2的 如果我们在真机模式,那么是通过加载AB包然后再读取我们打包的DLL 然后架子啊了一个Prefab

public void RunMain()  
{  
    if (gameAss == null)  
    {  
        UnityEngine.Debug.LogError("dll未加载");  
        return;  
    }  
    var appType = gameAss.GetType("App");  
    var mainMethod = appType.GetMethod("Main");  
    mainMethod.Invoke(null, null);  

这里就很简单了,就是找到App类的Main方法,执行一下,我们可以看一下这个方法

总结一下,在编辑器模式那就是直接找到程序集然后运行,不重要,而在真机模式中,同样是通过AB包读取dll资源然后进行的热更,热更只需要替换新的AB包就好了,所以热更新的流程就是:编译DLL、打AB包、替换旧的AB包,很简单

热更新测试

首先编译DLL

然后打AB包

然后打包,注意一些打包设置

有两个注意点

  1. 其实直接打AB也会进行编译(不过从流程上来说就应该先编译的)
  2. 在第一次打包项目之前,打AB会出错,具体原因还不清楚,涉及裁剪问题,待研究(反正只要先打包一次项目之后就好了)

打包之后运行一下项目

然后我们修改一下App中的方法,随便加一点

public class App  
{  
    public static int Main()  
    {  
  		...
        Debug.Log("hello, huatuo");  
        Debug.Log("hello world"); // 新加的  
    	...
	}
}

打一下AB包,用StreamingAsset下新的AB包替换打包目录下的AB包,打包目录的AB包位置位于huatuo_Data/StreamingAssets

再次运行

热更成功!