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

暂时这么多。

相关推荐
心前阳光15 分钟前
Unity WebGL文本输入
unity·游戏引擎·webgl
DKPT1 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
崔高杰1 小时前
微调性能赶不上提示工程怎么办?Can Gradient Descent Simulate Prompting?——论文阅读笔记
论文阅读·人工智能·笔记·语言模型
天涯过客TYGK2 小时前
unity A星寻路
unity·游戏引擎
KhalilRuan2 小时前
Unity Demo——3D平台跳跃游戏笔记
笔记·游戏·unity·游戏引擎
MUTA️4 小时前
《MAE: Masked Autoencoders Are Scalable Vision Learners》论文精读笔记
人工智能·笔记·深度学习·transformer
使一颗心免于哀伤4 小时前
《设计模式之禅》笔记摘录 - 6.原型模式
笔记·设计模式
刘孬孬沉迷学习4 小时前
5G标准学习笔记15 --CSI-RS测量
网络·笔记·学习·5g·信息与通信·信号处理
给自己记录用5 小时前
qt笔记(1)——Qtablewidget使用
笔记·qt
飞升不如收破烂~5 小时前
英语学习笔记2.0
笔记·学习