当前位置: 首页 > article >正文

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

        暂时这么多。


http://www.kler.cn/a/300324.html

相关文章:

  • Linux-C/C++--深入探究文件 I/O (下)(文件共享、原子操作与竞争冒险、系统调用、截断文件)
  • 七大排序算法
  • 第七篇:vue3 计算属性:computed
  • 免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
  • 使用 C++ 实现神经网络:从基础到高级优化
  • Ceph与RAID在存储中的协同工作过程
  • 数据结构代码集训day16(适合考研、自学、期末和专升本)
  • ASP.NET Core 入门教学二十三 模型绑定和验证
  • 高并发内存池项目(3)——项目框架介绍与实现线程池
  • 【2024】Benchmarking Foundation Models with Language-Model-as-an-Examiner
  • 【佳学基因检测】在织梦网站中, 创建或修改目录:/var/www/html/cp 失败! DedeTag Engine Create File False
  • Adobe After Effects下载_AE绿色中文版下载,AE2023软件下...
  • JavaScript 中的 `var`, `let`, `const` 详解
  • --数据库--
  • Kubernetes中Pod和Node标签的添加、修改与删除
  • 如何用python打开csv文件路径
  • Jenkins 构建后操作(Send build artifacts over SSH)
  • 入侵检测与防御系统:网络安全的前沿阵地
  • 原生 input 中的 “type=file“ 上传文件
  • CMU 10423 Generative AI:HW1(理论部分)
  • AUTOSARUDS 理论要点及isolar实战-通用配置/代码梳理
  • 移动安全需求分析与安全保护工程
  • Linux 环境下Mysql没有开放公网端口连接创建数据库
  • Qt_自定义信号
  • 深入浅出:Android屏幕刷新机制
  • 【CanMV K230 AI视觉】 跌倒检测