YooAsset 热更新及相关问题(二)

一、资源分析

本章讲解资源清单比对成功后下载的问题。如有疑问,请跳转至上一章节
说明:所讲内容基于 YooAsset 2.3.9 版本

上一篇讲解了安装、配置、构建、比对资源等问题,并在 InitPackage 函数中初始化包,并进行了比对操作,此时并没有进行真正的资源下载操作,如图:

  • 首包资源比对

  • 后续版本比对 

由此可见,若下载差异化文件,我们还需要继续书写相关代码。

 二、资源下载

1、创建下载函数,注册回调函数。
        /// 下载清单数据
        private IEnumerator DownloadPackage()
        {
            var downloadingMaxNumber = 10; //同时下载的最大文件数
            var failedTryAgain = 3; //下载失败的重试次数
            var package = YooAssets.GetPackage("DefaultPackage"); //"DefaultPackage"包已在 InitYooAssets 函数中创建

            // 创建资源下载器,用于下载当前资源版本所有的资源包文件
            var downloader = package.CreateResourceDownloader(downloadingMaxNumber, failedTryAgain);
            
            //判断是否需要下载
            if (downloader.TotalDownloadCount == 0)
            {
                print("没有资源需要更新,直接进入游戏...");               
                
                yield return EnterGame();
            }

            //统计的下载文件总数量和总大小
            var totalDownloadCount = downloader.TotalDownloadCount;
            var totalDownloadedBytes = downloader.TotalDownloadBytes;
            print($"需要下载的文件总数 = {totalDownloadCount},总大小 = {totalDownloadedBytes / 1024}KB");

            downloader.DownloadFinishCallback += DownloadFinishCallback;
            downloader.DownloadUpdateCallback += DownloadUpdateCallback;
            downloader.DownloadErrorCallback += DownloadErrorCallback;
            downloader.DownloadFileBeginCallback += DownloadFileBeginCallback;

            // 例如:把关卡资源下载器和某个资源下载器进行合并
            // var downloader1 = package.CreateResourceDownloader("关卡资源", downloadingMaxNum, failedTryAgain);
            // var downloader2 = package.CreateBundleDownloader("某个资源", downloadingMaxNum, failedTryAgain);
            // downloader1.Combine(downloader2);

            //开启下载
            // downloader1.BeginDownload(); //合并下载
            downloader.BeginDownload();

            yield return downloader;

            //检测下载结果
            if (downloader.Status == EOperationStatus.Succeed)
            {
                print("下载操作完成");               
            }
            else
            {
                print("下载操作失败。。。");
                //日志记录
            }

            yield return EnterGame();
        }

        /// 当下载器结束(无论成功或失败)
        private void DownloadFinishCallback(DownloaderFinishData data)
        {
            print($"下载结束:包名 = {data.PackageName},是否完成 = {(data.Succeed ? "完成" : "失败")}");
        }

        /// 当下载进度发生变化
        private void DownloadUpdateCallback(DownloadUpdateData data)
        {
            print(
                $"包名 = {data.PackageName},文件总数 = {data.TotalDownloadCount},当前文件下载数量 = {data.CurrentDownloadCount},文件总大小 = {data.TotalDownloadBytes / 1024}KB,已下载大小 = {data.CurrentDownloadBytes / 1024}KB");
        }

        /// 当下载器发生错误
        private void DownloadErrorCallback(DownloadErrorData data)
        {
            print($"下载失败:包名 = {data.PackageName},文件名 = {data.FileName},错误信息 = {data.ErrorInfo}");
        }

        /// 当开始下载某个文件
        private void DownloadFileBeginCallback(DownloadFileData data)
        {
            print($"开始下载:包名 = {data.PackageName},文件名 = {data.FileName},文件大小 = {data.FileSize / 1024} KB");
        }

上述函数演示了如何下载差异化资源数据,根据个人项目需求更改回调逻辑。

将此函数放置于 InitPackage 函数中,如图:

:根据个人项目逻辑选择即可

2、HFS模拟的远程服务器相关数据反馈,如图:

 可以清晰的看到程序访问及下载的内容,首先下载比对版本,然后下载了差异化数据。

至此下载结束,后续根据个人项目需求更改相关逻辑即可。 

<think> 我们正在讨论的是在Unity中使用HybridCLR(原huatuo)和YooAsset(或类似资源管理)结合实现热更新功能的方案。用户询问如何打包APK以支持热更新。以下是关键步骤: 1. **环境准备**: - 安装 Unity 2021.3+(HybridCLR 推荐版本) - 导入 HybridCLR 插件(通过GitHub或Package Manager) - 导入 YooAsset 或类似资源管理工具 2. **HybridCLR 配置**: - 根据官方文档初始化HybridCLR(运行 `HybridCLR/Installer...` 菜单) - 配置热更新程序集:将需要热更的代码拆分到独立的程序集(如 `Hotfix.dll`) - 在 `HybridCLR Settings` 中设置热更新程序集列表 3. **YooAsset 配置**: - 标记热更资源为 Addressable(模型、场景等) - 构建资源包:选择构建管线(如可寻址资源系统内置的构建) - 设置远程资源路径(如CDN地址),用于动态更新 4. **打包 APK 流程**: ```csharp // 示例:代码中触发资源更新(简化版) IEnumerator Start() { // 初始化YooAsset yield return YooAssets.InitializeAsync(); // 创建默认资源包 var package = YooAssets.CreatePackage("DefaultPackage"); YooAssets.SetDefaultPackage(package); // 更新资源(从远程下载) var operation = package.UpdatePackageVersionAsync(); yield return operation; // ...下载资源包并加载 } ``` 5. **热更新流程设计**: - APK 首次安装包含基础资源 - 启动时检查远程资源版本,下载更新包(通过 YooAsset) - 使用 HybridCLR 加载热更代码(新逻辑或修复) **关键注意事项**: - **代码分割**:主工程代码需与热更代码隔离(避免编译进主DLL) - **资源版本控制**:YooAsset 需通过版本号管理资源包 - **安全机制**:热更下载需校验MD5防止篡改 §§相关问题§§ 1. 如何确保HybridCLR和YooAsset在安卓热更时的兼容性? 2. 打包APK时如何压缩初始包体大小? 3. 热更新过程中断网或失败应如何处理? 4. HybridCLR相对ILRuntime在性能上有何优势? 5. YooAsset如何实现差异更新以减少下载量? </think> ### 如何使用 HybridCLR(原 huatuo)和 YooAsset 打包 APK 实现热更新 #### 核心流程概述 HybridCLR(纯 C# 热更)负责代码更新,YooAsset 负责资源更新,两者协作实现完整热更方案。打包流程如下: --- ### 一、环境配置(Unity 2021.3+) 1. **安装 HybridCLR** ```bash git clone https://github.com/focus-creative-games/hybridclr_unity.git ``` 将 `com.focus-creative-games.hybridclr_unity` 放入项目的 `Packages` 目录 2. **安装 YooAsset** 通过 Package Manager 安装: - `com.tuyoogame.yooasset`(Git URL) --- ### 、关键配置步骤 #### HybridCLR 配置: ```csharp // 初始化 HybridCLR RuntimeApi.LoadMetadataForAOTAssembly( "HotUpdate.dll.bytes", // 热更程序集 HomologousImageMode.SuperSet ); // 加载热更代码 Assembly hotUpdateAssem = Assembly.Load(File.ReadAllBytes("HotUpdate.dll")); Type type = hotUpdateAssem.GetType("GameMain"); type.GetMethod("Start").Invoke(null, null); ``` #### YooAsset 配置: ```csharp // 初始化资源包 ResourcePackage package = YooAssets.CreatePackage("Default"); YooAssets.SetDefaultPackage(package); // 更新远程资源 var operation = package.UpdatePackageVersionAsync(); yield return operation; operation = package.UpdatePackageManifestAsync(packageVersion); yield return operation; ``` --- ### 三、APK 打包流程 1. **代码分割**: - 主工程:核心框架/引擎代码 - 热更工程:`HotUpdate` 程序集(需在 Unity 中设置为 `Hot Update Assembly`) 2. **资源打包**: ```csharp // 构建命令 (YooAsset) BuildParameters buildParameters = new BuildParameters(); buildParameters.BuildTarget = BuildTarget.Android; buildParameters.BuildPipeline = EBuildPipeline.ScriptableBuildPipeline; BuildRunner.Run(buildParameters); ``` 3. **生成 APK**: - 关闭 `Strip Engine Code`(Player Settings) - 勾选 `HybridCLR/Generate/LinkXml` 防止代码裁剪 - 构建 APK 包含:主程序 + 基础资源包 --- ### 四、热更新流程 1. **启动检测**: - 检查 YooAsset 远程资源版本 - 检查 HybridCLR 热更程序集版本 2. **增量更新**: ```csharp // 下载热更代码 DownloaderOperation codeUpdate = package.CreateBundleDownloader(new[] {"HotUpdate.dll"}); // 下载更新资源 DownloaderOperation resUpdate = package.CreateBundleDownloader(new[] {"scene_01"}); ``` 3. **动态加载**: - HybridCLR 加载新程序集 - YooAsset 加载新资源 --- ### ️ 注意事项 1. **版本同步**:代码程序集版本需与资源清单版本绑定 2. **安全机制**: - 热更 DLL 需加密(使用 XOR 或 AES) - 资源包需校验 CRC/MD5 3. **安卓兼容**: - 开启 `INTERNET` 权限 - 配置 `android:usesCleartextTraffic="true"`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值