【Unity】HybridCLR测试笔记

个人性质笔记。

1 前言

        测试HybridCLR热更新。按照文档操作来,中间遇到了一些问题,记录在此。

2 HybridCLR特别注意点

        在使用HybridCLR生成相关程序集时,主要需要注意四个点:
(1)代码裁剪 → 生成link.xml解决此问题 → 项目打包后,无法修改。
(2)MonoBehaviou支持 → 在HybridCLR配置热更新Dll后,自动添加到Assembly列表实现支持 → 项目打包后,便无法修改。
(3)Aot泛型 → 补充元数据(补充加载Dll/实例化Aot泛型) → 项目打包后,可热更进一步补充。
(4)桥接函数 → HybridCLR提供有一键生成 → 项目打包后,无法修该,但Aot部分确定,函数就确定,所以打包后也没必要修改。

3 生成相关Dll

        通常我们通过HybridCLR/Generate/All来一键全部生成,但有时需要提前进行一些操作,这主要与我们的热更逻辑有关。后面会说。

4 程序集类别划分

        我将代码划分为5类程序集:

  1. Framework。(Aot)
  2. BootLogic(或是Assembly-Csharp)。(Aot)
  3. HotUpdateDllReference。(HotUpdate)
  4. GameLogic。(HotUpdate)
  5. Plugins。(Aot)

1是框架部分。
2是程序起始阶段,主要负责各种系统的初始化,如资源系统,然后负责资源热更、代码热更,并最终跳转到业务逻辑场景。
3是热更新Dll参考提供,负责提供有哪些Dll需要热更,包括逻辑热更、Aot元数据补充热更。同时也会提供相关Dll文件所在路径。以及相关需要在起始阶段所用资源的路径。提供给此程序集,意在这些配置内容也可以被我自己热更修改。
4是业务逻辑。最好是能够全部热更,这是目标,不过就目前项目不太好实现,毕竟最开始没有热更设计。也有暴力方法,打包全场景,但目前存在资源shader复杂时打包不结束问题(极度异常耗时)。
5是项目中导入的插件,这里指这类程序集的集合。
(PS:Aot与HotUpdate程序集之间的关系:Aot不可引用HotUpdate,HotUpdate可引用Aot。)

5 生成相关Dll前的预操作

        那么回到前面提出的All前需要有一些操作,这里指的是HybridCLR/Generate/AotGenericReferenc,会生成link.xml和一.cs文件,两者在同一个文件夹内,我们需要.cs中的内容。其中包含有需要导入的Aot Dll列表,以及需要的元数据类型、方法拥有哪些(这些是注释展示的)。为什么要提前做这一操作,是为了将.cs中的内容复制到我们的HotUpdateDllReference程序集的代码中,作为我们参考数据的一部分,为Aot元数据补充服务。做完以上操作,我们便可以HybridCLR/Generate/All有一次,生成所有。

6 处理生成的Dll

        生成后会有两个文件夹,名字我就不说了,官方文档里都有。一个存放了生成的热更Dll,一个是Aot泛型补充Dll。里面会有很多Dll,但不是所有都需要,选择我们要热更的Dll以及需要用于补充元数据的Dll,复制到相关资源文件夹中,准备后续打包为资源。我是用YooAsset打包,读取资源是按照.bytes读取的,所以复制到相关资源文件夹中的Dll需要在名称后面加上.bytes,修改文件格式。添加即可,不用删除之前的.dll后缀。

7 热更逻辑

        那么接下来讲下热更具体逻辑(基本就是BootLogic的逻辑):

  1. 初始化资源等相关系统。
  2. 通过YooAsset加载HotUpdateDllReference程序集资源,然后加载程序集,反射获取相关参考数据。
  3. 根据参考数据,加载Aot泛型程序集资源,然后加载补充元数据。
  4. 根据参考数据,加载热更程序集资源,然后加载程序集。(需要按照依赖关系加载,先加载被依赖的。)
  5. 根据参考数据,加载用于跳转场景的资源预设体,然后实例化。其上挂有脚本,在实例化后,脚本会执行场景跳转操作。(这里借助了MonoBehaviou支持特性,也表明我把跳转逻辑写在了热更程序集里,这是为了我们可以自由修改跳转逻辑。)

8 问题统计

1、Editor脚本异常,打包失败。
        解决:本人对编辑器脚本添加了UNITY_EDITOR宏,来在打包时屏蔽掉,就解决问题了。
网上问题参考方案:划分热更程序集会将原始在 Editor 目录下归于 Assembly-CSharp-Editor 的代码划分到 HotfixASM 程序集,进而导致打包失败。解决方案两种:1、对迁移完的脚本批量做了添加UNITY_EDITOR宏的操作,确保Editor脚本不会参与真机打包。2、跨文件指定同一个Hotfix-Editor程序集(使用 Assembly Definition Reference,初始脚本批量生成)。(Eu:说实话没太懂,与我遇到的问题结合起来看,不太匹配的样子。)

2、IL2CPP模式下,打包失败。
        解决:关于il2cpp打包报错问题,是Dllimport标识的问题,把不属于当前平台的表示给屏蔽掉才不会报错。项目中是Ump这个插件代码中有些没有屏蔽,我给屏蔽后就OK了(注释掉/加平台判断宏)。目前测试发现,是导入关于到linux平台内容会打包失败。

3、项目打包后,场景对象脚本缺失问题。
        解决:场景中默认挂载的脚本是热更脚本,但场景本身是项目自带资源,不是AB包资源,导致无法使用MonoBehaviou支持,故脚本缺失。将场景打包为AB资源,或是将所有热更脚本相关的对象打包为AB资源加载使用。

4、项目打包后,场景UI交互失效问题。
        解决:场景切换这里用的是AB资源加载,使用的不是原来的场景切换逻辑,导致缺少进度条的逻辑,故进度条逻辑没正常执行,以透明状态在整个Panel上,遮挡住了其他UI,造成无法交互。之后开发完善了场景资源加载切换场景的逻辑,这个问题就解决了。

9 后记

        暂时这么多。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值