【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 后记

暂时这么多。

相关推荐
Charles Ray15 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码15 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java3 小时前
JDBC笔记
笔记
GEEKVIP3 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
铁匠匠匠5 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
Moliay6 小时前
【资料分析】刷题日记2
笔记·公考·行测·常识·资料分析