前言:原本就想基于新资源管理系统来做热更。现在开始做这个事情,以下会记录一些重要步骤及所踩的坑。
Unity版本:2020.1
ILRuntime版本:1.6.6
接上文:基于ILRuntime和Addressable搭建热更框架记录
接入ILRuntime跑通之后现在我们需要热更工程中写代码了。但是我们在使用一些方法的时候没有生效并且报错。
这就需要参考一下对应的demo里面的示例了。示例不再介绍,重要的是要搞清楚这些示例是解决什么问题的。
委托适配器
如果只在热更新的DLL项目中使用的委托,是不需要任何额外操作的,就跟在通常的C#里那样使用即可。
如果你需要将委托实例传给ILRuntime外部使用,那则根据情况,你需要额外添加适配器或者转换器。
跨域继承 生成和注册Adapter的作用
如果你想在热更DLL项目当中继承一个Unity主工程里的类,或者实现一个主工程里的接口,你需要在Unity主工程中实现一个继承适配器。
CLR重定向
在开发中,一些依赖反射的接口是没有办法直接运行的,最典型的就是在Unity主工程中通过new T()创建热更DLL内类型的实例。
ILRuntime为了解决这类问题,引入了CLR重定向机制。 原理就是当IL解译器发现需要调用某个指定CLR方法时,将实际调用重定向到另外一个方法进行挟持,再在这个方法中对ILRuntime的反射的用法进行处理。
其实相当于重写了主工程某个方法。在热更工程调用这个主工程的这个方法时,实际上是调用了重写的这个方法。
关于一些插件在热更工程的引用
例如:Dotween。如果我们需要在热更代码里使用dotween插件的功能怎么办。
其实只需要引入插件对应dll文件就可以了。但因为插件可能也是基于Unity的一些内置Dll来生效的。所以也需要引入相关的UnityDll。
如何判断热更工程应该引入哪些Dll文件呢?
最近看到一个东西,在Unity内创建程序集。
如果使用这种方法创建热更项目的话,(即所有代码都在一个工程)就可以避免dll引用这种问题。但这个参考实例比较少。这里作为一种解决方案来参考。
从以上解决方案不难看出,热更工程和主工程引用的Dll其实是一致的,所以理论上这些把主工程引用的dll库都copy过来,就不用再纠结应该添加什么dll了。
但实际操作经常是需要什么添加什么,这里需要额外注意一下,即如果我们有脚本或第三方插件是在Plugins路径下的话,必须引入以下库
部分宏无法识别
这个很少遇到,不过很坑,因为我们设置生成文件的位置时有可能会点到其实设置。
如果不小心把模式设置成relase模式的话,就可能出现宏无法识别的问题。
以上。
补充一个ILRuntime的问题。
在使用嵌套task或者协成,foreach里多次await的时候会出现卡在某个位置。测试是嵌套必现的,而且不会报错,暂时没有好的解决方案,只能尽量避免这种写法了。