制作一个承载想法的东西(十三)—— 使用HybridCLR进行代码热更新

  • A+
所属分类:Unity3d

尝试最近很火的HybridCLR,看了文档,有推荐使用Unity版本的,为了少踩坑,所以采用了2021.3.1f1c1版本的Unity。HybridCLR版本用的是最新版本。

将原来的lua热更版本,复制一份到新的项目中去,移除Xlua和lua相关的代码和内容。保留Addressable进行Bundler的管理,后面的热更dll将会复制到LevelAsset标记地址的目录下,打包成Bundler,然后就会像普通的其他资源一样进行更新。

 

一、安装

下载unity的时候如果要在Windows下跑,记得勾选il2cpp。打开ProjectSettings,把ScriptingBackend修改未IL2CPP,ApiCompatibilityLevel修改为.Net Framework。最后取消勾选Use incremental GC。

打开Package Manager,点击通过git url安装Package,链接为:“https://gitee.com/focus-creative-games/hybridclr_unity.git”。Package安装完成后,会有一个菜单叫HybridCLR,点击菜单下的Installer,插件会自动识别Unity版本,点击安装即可。插件会对对应版本的il2cpp进行修改,放到项目目录下的HybridCLRData目录下。好了就这么简单的就完成安装了。

 

二、区分AOT+Interpreter

AOT部分的代码是无法进行热更新的,Interpreter部分是可以热更新的,所以除了必要的东西放在AOT外,其他的都放在Interpreter进行热更新。什么是必要的东西,首先就是热更新逻辑的代码和热更新逻辑驱动的入口代码。项目中使用的是Addressable进行资源热更新的,所以这部分是需要放在AOT的,还有的就是进行热更新检测的入口逻辑,剩余的就可以不需要放在这里了。我这里确定的两个热更新程序集是Frame的程序集和Assembly-Csharp程序集。

制作一个承载想法的东西(十三)—— 使用HybridCLR进行代码热更新

制作一个承载想法的东西(十三)—— 使用HybridCLR进行代码热更新

 

三、AOT部分的Main入口

在以前使用xlua的时候是创建虚拟机后驱动lua侧的启动入口方法,在lua中进行热更新的,这样其实热更新逻辑也是可以热更的。但是用HybridCLR时,需要把热更新的dll在启动的时候加载,如果热更逻辑放在热更新的程序集中就必须先加载热更新的程序集,更新后又无法卸载原先加载的,这样使用的还是原来旧的逻辑。所以还是把热更新的逻辑写在AOT部分,毕竟这部分的东西一般来说不会修改。(注意,DHE好像是可以进行卸载的)

总的来说就是需要在Main中写一个热更新逻辑和dll加载逻辑,最后驱动热更新逻辑入口就可以了。同样的,初始化一下Addressable,然后如果是编辑器的话就直接驱动入口就可以了。如果不是的话就像lua逻辑一样检测版本号,设置加载资源地址,更新资源等。在这个完成后,需要做一个补充元数据的操作,unity是有剪裁代码的机制的,对于AOT代码转化成c++后就会丢失一些泛型的元数据,需要告诉HybridCLR,这样热更新代码才能使用新的泛型创建的类型。最后就是把热更新的dll加载了,这里需要注意顺序问题。

 

这里的dll加载都是用Addressable的lable进行批量加载的,下面打包的部分会说明是怎么标记这些lable的。

 

 

四、打包

不同平台的打包,大概的方法都是一样的,首先在打包前需要做一些准备后再调用打包的方法。需要准备的就是HybridCLR中需要的,已经提供好给我们了,调用PrebuildCommand.GenerateAll()就可以了,然后编译程序集,把热更新的程序集和补充元数据的程序集复制到Addressable的地址标记目录,对程序集做一个lable的标志方便批量加载。最后标记地址打包Bundle准备操作就算完成了。

 

 

 

 

对了,补充元数据的dll的生成需要事先打包一次,每个平台都需要打包一次。不要走正式的打包流程,只需要点击Unity的Build即可。

IOS导出为xcode工程后,需要去编译一个魔改过的il2cpp.a替换导出后的il2cpp.a文件,可以根据需要手动替换或则写个python自动编译和替换。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: