Unity YooAsset HybridCLR 热更基础教程
Unity YooAsset & HybridCLR 热更基础教程
- Unity YooAsset & HybridCLR 热更基础教程
- YooAsset
- YooAsset 前期准备
- YooAsset 下载
- YooAsset 基础教程
- 全局配置
- 资源构建
- AssetBundle Builder 参数
- 开始构建
- 资源部署
- Editor Simulate Mode
- Offline Play Mode
- Host Play Mode
- UOS 一站式游戏云服务平台 部署
- 基础设置以及代码修改
- 资源上传以及更新
- HybridCLR
- HybridCLR 前提准备
- HybridCLR 下载
- HybridCLR 基础教程
- HybridCLR 基础配置
- HybridCLR 代码热更测试
- YooAsset & HybridCLR 结合教程
- 前期准备
- 本地执行移动
- 程序集创建
- 加载测试
- 关联代码修改
- HybridCLR 构建
- Yooasset 构建
- UOS 加载方法
- 本地服务加载方法
- 数据热更
- 数据资源更新
- 代码逻辑更新
Unity YooAsset & HybridCLR 热更基础教程
YooAsset
YooAsset是一套用于Unity3D的资源管理系统,用于帮助研发团队快速部署和交付游戏。
它可以满足商业化游戏的各类需求,并且经历多款百万DAU游戏产品的验证。
YooAsset可以满足以下任何需求:
- 一个不包含任何游戏资源的安装包,然后玩家边玩边下载。
- 一个可以保证前期体验的安装包,然后玩家自己选择下载关卡内容。
- 一个保证300MB以下内容的安装包,然后进入游戏之前把剩余内容下载完毕。
- 一个保证300MB以下内容的安装包,然后进入游戏之前把剩余内容下载完毕。
- 一个偏单机的游戏安装包,在网络畅通的时候,支持正常更新。
- 一个在没有网络的时候,支持游玩老版本。
- 一个MOD游戏安装包,玩家把自己制作的MOD内容上传到服务器,其它玩家可以下载游玩。
- 一个超大体量的项目,有上百GB的资源内容,每次构建花费大量时间,可以分工程构建?
YooAsset 前期准备
YooAsset 下载
1. 新建一个Unity 项目 最好是2022.3.x。

2. 在项目 Packages 文件夹下 打开 manifest.json 文件。

3. 加入这下面的字段。


{"dependencies": {"com.tuyoogame.yooasset": "2.3.17",......},"scopedRegistries": [{"name": "package.openupm.com","url": "https://package.openupm.com","scopes": ["com.tuyoogame.yooasset"]}]
}
4. 点击 Samples 下载 Space Shooter 官方示例。

5. 在菜单栏 带年纪 YooAsset -> AssetBundle Collector 调出 AssetBundle收集器 界面。

6. 点击 Fix 修复按钮 那样就会自动添加上。

7. 这里面显示的文件夹只要是文件夹内的资产都会被作为资源打包;点击 Save按钮 保存配置。

8. 这样设置就行,当然默认也可以。

YooAsset 基础教程
全局配置
1. 在 Assets/Samples/YooAsset/2.3.17/Space Shooter/Resources 文件夹右键创建配置文件。

2. 可名字改不改都行,默认名字是 yoo。

3. 当你构建资源包的时候的会在 StreamingAssets 创建一个文件夹存放资源内容。

资源构建
1. 在主菜单 点击YooAsse -> AssetBundle Builder。

2. 一般没有特殊需求直接点击 Click Build 构建就行。
AssetBundle Builder 参数
Build Version:构建的资源包版本。 默认就行,一般不怎么修改。

Clear Build Cache:清理构建缓存,将会重新构建所有资源包。当不勾选此项的时候,引擎会开启增量打包模式,会提高构建速度。Use Asset Depend DB:在资源收集过程中,使用资源依赖关系数据库。当开启此项的时候,会提高构建速度。

Encryption Services:资源包加密类列表。Manifest Process Services:资源清单加密或压缩类列表。Manifest Restore Services:资源清单解密或解压类列表。

Compression:资源包的压缩方式。 LZ4就行看自己需求。

Uncompressed:最小压缩。
LZMA:中等压缩。
LZ4:最大压缩。

File Name Style:输出的资源包文件名称样式 默认就行。Copy Buildin File Option:首包资源文件的拷贝方式。

None:不拷贝任何文件。
ClearAndCopyAll:先清空已有文件,然后拷贝所有文件。
ClearAndCopyByTags:先清空已有文件,然后按照资源标签拷贝文件。
OnlyCopyAll:不清空已有文件,直接拷贝所有文件。
OnlyCopyByTags:不清空已有文件,直接按照资源标签拷贝文件。

Click Build:点击构建按钮会开始构建流程,构建流程分为多个节点顺序执行。如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。

开始构建
1. 在 AssetBundle Builder 界面 点击构建按钮。

2. 等待资源构建。

3. 资源构建成功之后会自动打开存储文件夹。

4. 基本上是这样的,除非是你更改的文件样式。

5. 构建的文件夹如非意外一般都在当前项目工程文件夹下的 Bundles 文件夹下。

资源部署
1. 在 Assets/Samples/YooAsset/2.3.17/Space Shooter 打开 Boot 场景。

2. 在Hierarchy 窗口 点击 Boot 物体,在Inspector 更改Play Mode 运行模式。

运行模式:Editor Simulate Mode:编辑模拟模式Offline Play Mode:离线游戏模式Host Play Mode:主机游戏模式Web Play Mode:网页模式Custom Play Mode:自定义游戏模式

Editor Simulate Mode
1. 直接点击 Play 运行就能直接试玩,这个没什么好说的只能在编辑器条件下运行,打包票运行会有错误。

Offline Play Mode
1. 更改运行模式 更改为 Offline Play Mode 离线模式。

2. 如果没有构建资源的话会出现 Falled to initialize package! 错误警告。

3. 在 Console 窗口也会出现这个错误提示。这个提示意思就是在 StreamingAssets/YooAsset/DefaultPackage 没有找到相关资源。

4. 在 Assets/Samples/YooAsset/2.3.17/Space Shooter/Resources文件夹下新建一个 YooAsset Seetings 文件,如果创建过就不用再次创建了。

5. 更改一下子资源文件存储文件夹名称。当然不更改也行。

6. 在菜单栏点击 YooAsset -> AssetBundle Builder -> Click Build 构建资源。


7. 直接点击运行,就可以在右下角看到构建的离线版本。因为在当前项目的 StreamingAssets 文件夹下有相关资源所有打包之后运行也不会出现错误。

Host Play Mode
1. 在 Boot 中把Play Mode 更改为 Host Plau Mode,就是服务器模式。

2. 如果没有修改服务器的话会显示这样错误。

3. 简单说一下关联的地方,找到 FsmInitializePackage 脚本。在 GetHostServerURL 方法中我们发现资源加载在哪个地址、文件夹以及版本号信息。如下图:PC 加载 其他版本也类似。地址: http://127.0.0.1:8086文件夹:/CDN/PC/版本号:v1.0

4. 创建一个你能记住的文件,我的就放在工程文件夹内了。

5. 然后在这个文件夹内创建要你使用平台,如果只是打包PC 就创建一个PC的就行。

6. 创建版本文件夹。

7. 把打包好的资源文件全都放进来。

8. 资源文件就是我们上面在Unity 中打包好。地址在:项目文件夹\Bundles\StandaloneWindows64\DefaultPackage。

9. 就是这样打包好的。

10. 打开命令提示窗口。

11. 键入 python 看看是否有安装 python 如果安装的有就会如下图所示进入到 python 模式。如果没有就去官网下载安装一下。
Python 官网:Python 官网访问地址

12. CTRL + Z 退出 返回命令提示行。

13. 导航到 项目工程\UnityServer 本地服务文件夹内。


14. 键入 python -m http.server 8086 开启本地服务器。

15. 在Unity中选择 Host Plau Mode 模式点击运行。

16. 成功运行就是这样的 会返回代码 200。

17. 说一个更加简单的方法,在 项目文夹\UnityServer下新建一个文本文档。

18. 更改为 .bat 文件,名字的话可以自己按自己喜欢。

19. 如果看不到的话扩展名的话 点击 查看->显示->文件扩展名 打开就能看到。

20. 右键在记事本中编辑。

21. python -m http.server 8086 把这一行粘贴进去.意思是使用 python 新建一个本地服务器端口为8086完整地址是:http://127.0.0.1:8086。

22. 双击直至运行。

23. 在Unity 中点击 Play 就能正确响应加载资源了。


UOS 一站式游戏云服务平台 部署
基础设置以及代码修改
UOS 一站式游戏云服务平台 官网
1. 先在 UOS 上登录 Unity 账号。

2. 创建一个新项目并启动。


3. 点击 CDN 先免费试用一下。

4. 免费有20G 的试用流量,对于测试来说完全够用了。

5. 新建一个Buckets 等会要使用,名字的话按自己喜欢。

6. 点击相关文档 查看官方文档和示例。

7. 点击 CDN -> 资源管路 -> YooAsset 当然大家对其他感兴趣,可以看看其他的。

8. 复制 资源访问地址,等会在工程中修改需要用到。

9. 在 FsmInitializePackage 的 GetHostServerURL方法中修改 hostServerIP属性值。string hostServerIP = "https://a.unity.cn/client_api/v1/buckets/{bucketId}/entry_by_path/content/?path=";

10.在 Buckets 中把 存储器ID 复制一下。

11. 可以直接用变量承接,也可以直接粘贴,我这边就直接粘贴了。

12. 需要在 FsmRequestPackageVersion 的 UpdatePackageVersion 方法中把时间戳关闭,默认是true ,不然会出现:请求软件包版本失败,请检查网络状态,错误提示。改成 false 就行:var operation = package.RequestPackageVersionAsync(false);

资源上传以及更新
1. 找到打包好的资源文件夹 一般都在项目工程\Bundles\StandaloneWindows64\DefaultPackage文件夹下。

2. 复制到 我们自己创建的服务器文件夹下 项目工程\UnityServer\CDN\PC\v1.0。

3. 在 Buckets 点击文件上传按钮。

4. 找到 我们自己创建的本地服务器文件夹。

5. 直接把刚才选中的文件直接拖找到这个界面上,然后点击全部上传。

6. 如果文件很多或则资源太大的时候需要等待一会。

7. 上传完毕之后直接点击完成按钮就行。

8. 可以更改成文件夹显示。


9. 在Unity 中直接运行就可以看到效果了,在Conslole 中也可以看到执行顺序。

10. 找到 UIHome 预制体。


11. 按照自己的喜欢修改,位置、颜色、缩放、材质球什么的都可以。



12. 自己修改完毕之后 需要在 AssetBundle Builder窗口中从新构建一下资源包。

13. 然后把构建好的资源包 放在本地服务器 v1.0 的文件夹内原本v1.0 文件夹内的可以删除了。

14. 然后再 UOS 中把 v1.0 文件删除。


15. 重新上传最新的资源文件。



16. 如果上传的资源修改变动很大的话,可能需要等一会才能显示资源更新。

17. 这就是资源更新后的,当然里面的其他也是可以修改的,大家可以自己尝试一下。

HybridCLR
HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更新解决方案。
HybridCLR扩充了il2cpp运行时代码,使它由纯AOT runtime变成AOT+Interpreter 混合runtime,进而原生支持动态加载assembly,从底层彻底支持了热更新。使用HybridCLR技术的游戏不仅能在Android平台,也能在IOS、Consoles、WebGL等所有il2cpp支持的平台上高效运行。
由于HybridCLR对ECMA-335规范 的良好支持以及对Unity开发工作流的高度兼容,Unity项目在接入HybridCLR后,可以几乎无缝地获得C#代码热更新的能力,开发者不需要改变日常开发习惯和要求。HybridCLR首次实现了将Unity平台的全平台代码热更新方案的工程难度降到几乎为零的水平。
HybridCLR 前提准备
HybridCLR 下载
1. 先在 Unity Hub 中检查你使用的版本是否安装的有 Windows Build Support(IL2CPP) 模块。

3. 在你要使用的版本中点击添加模块按钮。

3. 查看是否已经安装 Windows Build Support(IL2CPP)模块,如果没有就安装一下。

4. 在Unity 主菜单中点击 Windows -> Package Manager。

5. 点击 Add package from git URL。

6. 输入 https://gitee.com/focus-creative-games/hybridclr_unity.git 点击 Add 按钮。

7. 检查是否正确下载。

8. 打开 Project Settings。

9. 在Player 中找到 Configuration 像我这样设置。C++ Compiler Configuration:开发版本选择Debug,正式上线选择Release。

HybridCLR 基础教程
HybridCLR 基础配置
1. 在菜单栏点击 HybridCLR -> Install 按钮

2. 点击 Instll 安装 L2cpp 依赖。

3. 安装完毕之后会在项目工程/HybridCLRData 文件夹下多出 hybridclr_repo 和 il2cpp_plus_repo 文件夹。


4. 在Unity中新建一个场景,并创建一个空物体 ConsoleToScreen。

5. 在Assets创建一个名为 HotUpdate 的文件夹。

6. 在 HotUpdate文件夹内 右键Create->Assembly Definition 程序集。

7. 注意更改程序集默认名称不然会找不到,还有就是把Auto Referenced(自动引用)勾选掉如果不勾选后期打包的时候会剪切引用程序集导致报错。

8. 在 Project Settings->HybridCLR Settings->Hot Update Assembly Definitions添加刚刚创建的程序集。

9. 只要在当前程序集所在文件夹内创建的脚本都属于HotUpdate 程序集。

HotEntry 完整代码,后期可以测试调用。
using UnityEngine;public class HotEntry
{public static void Run(){Debug.Log("HotUpdate 模块启动第一次");}
}
10. 在 Assets 点击 HotEntry 脚本就能看到所属程序集。

11. 在 HybridCLR 官方文档中点击快速上手,找到 ConsoleToScreen.cs 点击复制按钮。
HybridCLR 文档地址

12. 在Unity工程中创建 ConsoleToScreen 脚本。

13. 并把内容完整粘贴到这个脚本中。这个脚本的作用就是打印日志到屏幕上,方便定位错误,对于热更新没有直接作用。

ConsoleToScreen.cs 完整代码。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConsoleToScreen : MonoBehaviour
{const int maxLines = 50;const int maxLineLength = 120;private string _logStr = "";private readonly List<string> _lines = new List<string>();public int fontSize = 15;void OnEnable() { Application.logMessageReceived += Log; }void OnDisable() { Application.logMessageReceived -= Log; }public void Log(string logString, string stackTrace, LogType type){foreach (var line in logString.Split('\n')){if (line.Length <= maxLineLength){_lines.Add(line);continue;}var lineCount = line.Length / maxLineLength + 1;for (int i = 0; i < lineCount; i++){if ((i + 1) * maxLineLength <= line.Length){_lines.Add(line.Substring(i * maxLineLength, maxLineLength));}else{_lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));}}}if (_lines.Count > maxLines){_lines.RemoveRange(0, _lines.Count - maxLines);}_logStr = string.Join("\n", _lines);}void OnGUI(){GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = Math.Max(10, fontSize) });}
}
14. 创建一个 LoadHotUpdate_ZH 代码,这个脚本主要是验证代码是否可以正确更新。

LoadHotUpdate_ZH 完整代码,注意引用不要删不然会报错。
using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;public class LoadHotUpdate_ZH : MonoBehaviour
{void Start(){// 防止 GameObject 类型被裁切掉 如果有其他类型也可能被裁切掉,可以在这里添加引用GameObject go = new GameObject("HotUpdateLoader");// Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
#if !UNITY_EDITORAssembly hotUpdateAss = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#else// Editor下无需加载,直接查找获得HotUpdate程序集Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endifType type = hotUpdateAss.GetType("HotEntry");type.GetMethod("Run").Invoke(null, null);}
}
15. 在菜单栏 点击 HybridCLR->Generate->All 按钮,构建 HybridCLR 程序热更。

16. 等待构建。

17. 构建完毕之后会在 项目工程\HybridCLRData\HotUpdateDlls\StandaloneWindows64文件夹中找到名为 HotUpdate.dll 的文件,这个文件就是代码热更文件,拷贝一下。

18. 在Unity 工程 Asset 中创建一个 StreamingAssets 文件夹,用来存放代码热更文件。

19. 把刚才拷贝的 代码热更文件名称更改为 .bytes 文件。

HybridCLR 代码热更测试
1. 在菜单栏点击 File->Build Settings->Build 打包,注意场景要正确哈。

2. 这是打包之后的样子。

3. 双击运行软件如果左上角有 HotUpdate 模块启动第一次文字显示就证明打包正确。

3. HotEntry 代码修改。
using UnityEngine;public class HotEntry
{public static void Run(){Debug.Log("HotUpdate 模块启动第一次");GameObject go = new GameObject("Test1");go.AddComponent<Print_ZH>();Debug.Log(go);}
}

4. 在 Asset/HotUpdate 创建一个 Print_ZH 用来验证代码热更 组件添加。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Print_ZH : MonoBehaviour
{void Start(){print("HybridCLR 代码热更新。");}
}


5. 重新构建一下代码

6. 在 项目工程\HybridCLRData\HotUpdateDlls\StandaloneWindows64 文件下选中 HotUpdate.dll 并修改名称为 HotUpdate.dll.bytes。

7. 替换打包后的 项目工程\HybridCLR_Data\StreamingAssets 文件夹下的HotUpdate.dll.bytes 文件。

8. 双击运行。

9. 如果正常更新之后会显示类的消息。

10. 如果你的显示类似于这样的:MissingMethodException: MethodNotFind UnityEngine.GameObject::ctor有两个方法可以解决,我的这个意思就是:UnityEngine.GameObject 丢失。

方法一:在你执行的代码中添加上这样的引用,然后点击 菜单栏->HybridCLR ->Generate->All 重新构建一下再替换HotUpdate.dll.bytes文件。

方法二:打开 Assets/HybridCLRGenerate/link.xml 文件把确实的类型添加上,当然最为推荐的还是第一种简单,稳定。

YooAsset & HybridCLR 结合教程
在 Unity 项目中实现 “可热更 + 资源可更新 + 轻量包体 + 长线维护”,最常见的组合就是:
YooAsset 负责 资源热更新(AB、场景、配置、模型、音频、UI 等)。
HybridCLR 负责 代码热更新(HotUpdate.dll + AOT 元数据补充)。
二者结合后形成 Unity 项目最完整、最实用的热更体系:
| 功能 | YooAsset | HybridCLR |
|---|---|---|
| 热更代码 | ❌ | ✅(IL2CPP 下可真正热更) |
| 热更资源 | ✅(AB、场景、配置、模型等) | (AB、场景、配置、模型等) |
| 首包减重 | ✅ | ✅(把逻辑放到热更 DLL 中) |
| 远程 Patch | ✅ | ✅(配合 DLL 热更新) |
| 工作流程 | 资源构建/分发 | DLL 构建/补元/加载 |
最终效果是 比 ILRuntime 更快、比传统热更更稳定、兼容原生性能。
YooAsset + HybridCLR 的目录结构(标准)
Assets/├── AOT/│ ├── Scripts/│ │ ├── Editor/ (只在编辑器运行)│ │ ├── Shared/ (AOT 公共代码)│ │ └── PatchLogic/│ └── AOT.dll (生成)├── HotUpdate/│ ├── Scripts/│ └── YooAssetHotUpdate.dll(热更dll)├── Bundles/│ └── DLLTxtAssets/ (将 DLL 做成 TextAsset)│ ├── mscorlib.dll│ ├── System.dll│ ├── YooAssetHotUpdate.dll│ └── xxx...
前期准备
本地执行移动
1. 在Asset新建一个 AOT/Scripts/Shared 文件夹。

2. 把 Runtime 文件夹内的 Boot 代码放在 Scripts 文件夹下。

3. 把 Editor 文件夹整个拉到 Scripts 文件夹下,注意路径别错误。

4. 把 EventDefine、PatchLogic文件夹整个拉到 Scripts 文件夹下,注意路径。

5. 把 GameLogic文件夹内的 GameManager 代码放在 Scripts/Shared文件夹下。

6. 放置好的样子。

程序集创建
1. 在 Assets/AOT/Scripts/Editor 文件夹右键新建一个名为 AOT.Editor 的程序集。


2. AOT.Editor 程序集参数这样设置。

3. 在 Assets/AOT/Scripts/EventDefine 文件夹右键新建一个名为 AOT.EventDefine 的程序集。

4. AOT.EventDefine 程序集参数这样设置。

5. 在 Assets/AOT/Scripts/PatchLogic文件夹右键新建一个名为 AOT.PatchLogic 的程序集。

6. AOT.PatchLogic 程序集参数这样设置。

7. 在 Assets/AOT/Scripts文件夹右键新建一个名为 AOT.Script 的程序集。

8. AOT.Script 程序集参数这样设置。

9. 在 Assets/Samples/YooAsset/2.3.17/Space Shooter 文件夹右键新建一个名为 YooAssetHotUpdate 的程序集。

10. YooAssetHotUpdate 程序集参数这样设置。自动引用设置为 false,添加组件引用。YooAsset:资源更新包程序集YooAsset.Editor:资源更新编辑器程序集UniFramework.Event:事件框架程序集UniFramework.Machin:状态机框架程序集UniFramework.Utility:工具程序集AOT.EventDefine:自定义事件程序集HybridCLR.Editor:HybridCLR 编辑器程序集(可去除)HybridCLR.Runtime:HybridCLR 运行程序集

11. 记得要保存或者应用一下哈。


12. 在 Hot Update Assembly Definitions 添加程序集。

加载测试
关联代码修改
1. 打开 Boot 添加一个数组填充需要的补元数据。

2. 添加一个补元数据方法。

3. 在添加一下加载程序集的方法。

Boot 完整代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniFramework.Event;
using YooAsset;
using System.Linq;
using UnityEngine.TextCore.Text;
using TextAsset = UnityEngine.TextAsset;
using HybridCLR;
using System.Reflection;public class Boot : MonoBehaviour
{public static List<string> AOTMetaAssemblyFiles { get; } = new List<string>{"mscorlib.dll","System.dll","System.Core.dll","YooAsset.dll","UniFramework.Event.dll","UniFramework.Machine.dll","UniFramework.Utility.dll"};//补元 数据 字典private static Dictionary<string, TextAsset> _AssetDatas = new Dictionary<string, TextAsset>();/// <summary>/// 资源系统运行模式/// </summary>public EPlayMode PlayMode = EPlayMode.EditorSimulateMode;// 默认资源包private ResourcePackage gamePackage;// 加载的热更程序集private static Assembly _YooAssetHotUpdate;void Awake(){Debug.Log($"资源系统运行模式:{PlayMode}");Application.targetFrameRate = 60;Application.runInBackground = true;DontDestroyOnLoad(this.gameObject);}IEnumerator Start(){// 游戏管理器GameManager.Instance.Behaviour = this;// 初始化事件系统UniEvent.Initalize();// 初始化资源系统YooAssets.Initialize();// 加载更新页面var go = Resources.Load<GameObject>("PatchWindow");GameObject.Instantiate(go);// 开始补丁更新流程var operation = new PatchOperation("DefaultPackage", PlayMode);YooAssets.StartOperation(operation);yield return operation;// 设置默认的资源包gamePackage = YooAssets.GetPackage("DefaultPackage");YooAssets.SetDefaultPackage(gamePackage);// 切换到主页面场景// SceneEventDefine.ChangeToHomeScene.SendEventMessage();yield return LoadDlls();}/// <summary>/// 资源加载热更DLL/// </summary>/// <returns></returns>private IEnumerator LoadDlls(){// 加载补元数据资源// 字符拼接操作var _LoadTasks = new List<string> { "YooAssetHotUpdate.dll" }.Concat(AOTMetaAssemblyFiles);// 逐个加载程序集字节数据foreach (var fileName in _LoadTasks){Debug.Log($"正在加载程序集:{fileName}");// 加载补元数据资源var request = gamePackage.LoadAssetAsync<TextAsset>(fileName);yield return request;//如果加载成功if (request.Status== EOperationStatus.Succeed){TextAsset textAsset = request.AssetObject as TextAsset;_AssetDatas[fileName]= textAsset;Debug.Log($"程序集:{fileName} 加载成功,大小:{textAsset.bytes.Length}字节。");}else{Debug.LogError($"程序集:{fileName} 加载失败,错误:{request.LastError}。");}//释放句柄request.Release();}LoadMetadataForAOTAssemblies();LoadHotUpdateDlls();//切换到主页面场景SceneEventDefine.ChangeToHomeScene.SendEventMessage();}/// <summary>/// 加载AOT程序集元数据/// </summary>private void LoadMetadataForAOTAssemblies(){if (_AssetDatas.Count == 0){Debug.Log("程序集字节数据为空,跳过加载热更dll;");}
#if !UNITY_EDITOR_YooAssetHotUpdate = Assembly.Load(_AssetDatas["YooAssetHotUpdate.dll"].bytes);
#else_YooAssetHotUpdate = AppDomain.CurrentDomain.GetAssemblies().First((assembly) => assembly.GetName().Name == "YooAssetHotUpdate");
#endif}/// <summary>/// 补充元数据/// </summary>private void LoadHotUpdateDlls(){// HomologousImageMode.SuperSet// 补充的dll是打包时裁剪后的dl的超集,既可以用裁剪后的AOT.dll,也可以用原始AOT.dllHomologousImageMode _Mode = HomologousImageMode.SuperSet;foreach (var _AOtDllName in AOTMetaAssemblyFiles){//数据加载byte[] _Bytes = _AssetDatas[_AOtDllName].bytes;LoadImageErrorCode err= RuntimeApi.LoadMetadataForAOTAssembly(_Bytes, _Mode);}}
}
HybridCLR 构建
1. 在菜单栏->HybridCLR ->Generate->All 重新构建一下。

2. 在 Assets/HybridCLRGenerate 文件夹找到 AOTGenericReferences 脚本。

3. 这个是 HybridCLR 提供的小工具,用来查找需要补充的数据集。

4. 在 项目工程\HybridCLRData\HotUpdateDlls\StandaloneWindows64 文件夹找到YooAssetHotUpdate.dll 文件。

5. 改下名字 改成 YooAssetHotUpdate.dll.bytes 文件放在 Assets\DLL 文件夹内。

6. 打开 项目工程\HybridCLRData\AssembliesPostIl2CppStrip\StandaloneWindows64文件夹在这个文件夹选中这几个程序集,也拷贝到Assets\DLL 文件夹内并更改成.bytes文件。"mscorlib.dll","System.dll","System.Core.dll","YooAsset.dll","UniFramework.Event.dll","UniFramework.Machine.dll","UniFramework.Utility.dll"

7. 基本上就是这样。

Yooasset 构建
1. 打开 Yooasset 资源包管理器。

2. 新建一个组然后起个名字,最好打个备注 热更代码 什么的。

3. 把整个DLL 文件夹拖进来 YooAsset 会自动识别。

4. 记得保存,不然不会应用。

5. 打开构建窗口。

6. 构建一下资源包。

7. 在构建成功文件夹,选中全部文件。我 YooAsset 构建成功的路径是这个:工程文件\Bundles\StandaloneWindows64\DefaultPackage。

8. 放在我们一开始创建的文件路径下,如果有文件可以全删了或者直接替换。我的路径是:工程文件\UnityServer\CDN\PC\v1.0。

UOS 加载方法
1. 在 UOS 上删除原本的资源内容。

2. 上传刚才构建好的资源包。

3. 直接运行就能看到效果了。


本地服务加载方法
1. 当然也可以运行本地的服务。在 工程文件\UnityServer文件夹内双击 资源加载本地服务.bat 文件,运行本地服务。

2. 主要注意的一点是如果运行本地服务需要修改 FsmInitializePackage 代码。把网络访问的地址改成本地的。

3. 本地服务运行。

数据热更
数据资源更新
1. 在Assets/Samples/YooAsset/2.3.17/Space Shooter/GameRes/Entity文件夹下找到 player_ship.prefab。

2. 选中主题可以更改颜色也可以更改其他,大家随意。

3. 在菜单栏->HybridCLR ->Generate->All 重新构建一下。

4. 选中 YooAssetHotUpdate.dll 文件进行更名 YooAssetHotUpdate.dll.bytes。

5. 替换 Assets\DLL 文件夹内 YooAssetHotUpdate.dll.bytes 文件。

6. 再重新构建一下 YooAsset 资源包。

7. 把构建好的资源包复制一下然后拷贝到 HybridCLR\UnityServer\CDN\PC\v1.0 文件夹内进行资源替换。


8. 双击运行 资源加载本地服务.bat 文件。

9. 然后一运行就能看到 玩家操控角色材质球变更了。

代码逻辑更新
1. 在玩家预制体 player_ship.prefab 上打开 EntityPlayer 玩家操控脚本。

2. 更改初始玩家大小。

3. 修改一下移动速度。

4. 设置一下死亡不销毁。

EntityPlayer 完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EntityPlayer : MonoBehaviour
{ public RoomBoundary Boundary;public float MoveSpeed = 10f;public float FireRate = 0.25f;private float _nextFireTime = 0f;private Transform _shotSpawn;private Rigidbody _rigidbody;private AudioSource _audioSource;void Awake(){_rigidbody = this.gameObject.GetComponent<Rigidbody>();_audioSource = this.gameObject.GetComponent<AudioSource>();_shotSpawn = this.transform.Find("shot_spawn");// 设置玩家缩放transform.localScale = Vector3.one * 0.5f;}void Update(){if (Input.GetButton("Fire1") && Time.time > _nextFireTime){_nextFireTime = Time.time + FireRate;_audioSource.Play();BattleEventDefine.PlayerFireBullet.SendEventMessage(_shotSpawn.position, _shotSpawn.rotation);}}void FixedUpdate(){float moveHorizontal = Input.GetAxis("Horizontal");float moveVertical = Input.GetAxis("Vertical");Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);_rigidbody.velocity = movement * MoveSpeed * 1.5f;_rigidbody.position = new Vector3(Mathf.Clamp(GetComponent<Rigidbody>().position.x, Boundary.xMin, Boundary.xMax),0.0f,Mathf.Clamp(GetComponent<Rigidbody>().position.z, Boundary.zMin, Boundary.zMax));float tilt = 5f;_rigidbody.rotation = Quaternion.Euler(0.0f, 0.0f, _rigidbody.velocity.x * -tilt);}void OnTriggerEnter(Collider other){var name = other.gameObject.name;if (name.StartsWith("enemy") || name.StartsWith("asteroid")){BattleEventDefine.PlayerDead.SendEventMessage(this.transform.position, this.transform.rotation);//GameObject.Destroy(this.gameObject);}}
}
5. 在菜单栏->HybridCLR ->Generate->All 重新构建一下

6. 选中 YooAssetHotUpdate.dll 文件进行更名 YooAssetHotUpdate.dll.bytes。

7. 替换 Assets\DLL 文件夹内 YooAssetHotUpdate.dll.bytes 文件。

8. 再重新构建一下 YooAsset 资源包。

9. 把构建好的资源包复制一下然后拷贝到 HybridCLR\UnityServer\CDN\PC\v1.0 文件夹内进行资源替换。


10. 双击运行 资源加载本地服务.bat 文件。

11. 运行一下我们看到 玩家操控角色变得更小,移动速度也变的更快了。

12. 就算玩家销毁也不删除本身。至此为止资源以及代码更新都成功实现,大家可以自由的去尝试更多的内容啦。多说一句,如果你想放在UOS 上面加载也是可以的。上面教程写的有,我就过多操作了。大家感兴趣可以自己试一试哈

