Unity Addressables 本地资源组热更新问题分析与解决方案:Prevent Updates 的正确使用
Unity Addressables 本地资源组热更新问题分析与解决方案Prevent Updates 的正确使用问题描述在使用 Addressables 进行资源管理时同时配置了本地资源组和远程资源组。首次打包运行正常。当两个资源组均有改动并对远程资源组执行Update a Previous Build热更新后出现以下错误Unable to open archive file: C:/Program Files (x86)/CZYGAME/CZY_Data/StreamingAssets/aa/StandaloneWindows64/jsprefabs_assets_all_aa1306f9bf9f5e5946e9952c5285a136.bundle Failed to read data for the AssetBundle aa\StandaloneWindows64\jsprefabs_assets_all_aa1306f9bf9f5e5946e9952c5285a136.bundle. RemoteProviderException : Invalid path in AssetBundleProvider: C:/Program Files (x86)/CZYGAME/CZY_Data/StreamingAssets/aa\StandaloneWindows64\jsprefabs_assets_all_aa1306f9bf9f5e5946e9952c5285a136.bundle. UnityEngine.Logger:Log(LogType, Object) UnityEngine.Debug:LogError(Object) UnityEngine.AddressableAssets.AddressablesImpl:LogException(AsyncOperationHandle, Exception) UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase1:Complete(TObject, Boolean, Exception, Boolean) UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation1:ProviderCompleted(T, Boolean, Exception) UnityEngine.ResourceManagement.ResourceProviders.AssetBundleResource:LocalRequestOperationCompleted(AsyncOperation) UnityEngine.AsyncOperation:InvokeCompletionEvent()加载本地资源组时失败报错提示找不到对应的 bundle 文件说明资源 key 与实际的 bundle 不匹配。原因分析热更新机制Update a Previous Build会检测自上次完整构建以来所有资源的变化并为所有变化资源生成新的 AssetBundle即使资源属于本地组。新的 bundle 文件名通常包含内容哈希因此会发生变化。Catalog 更新热更新会生成新的远程 catalog其中记录了变化资源的新 bundle 信息包括本地组的新 bundle 名。旧客户端启动后会加载该远程 catalog当尝试加载本地资源时会根据新 catalog 去查找本地 bundle但本地StreamingAssets中只有旧 bundle导致文件缺失。根本原因本地资源组被错误地允许在增量更新中重新打包导致 bundle 文件名变化而客户端本地文件未更新最终加载失败。解决方案使用Prevent Updates锁定本地资源组Addressables 为每个资源组提供了Prevent Updates选项用于控制该组是否参与增量更新。正确设置该选项可以避免本地资源组在热更新时被重新打包。1. 选项作用Prevent Updates状态增量更新 (Update a Previous Build) 时的行为适用场景勾选(true)该组资源的变化被忽略不会生成新 bundle也不更新 catalog 中的对应条目。客户端继续使用本地原 bundle。本地资源组随包发布、不期望通过热更新修改的资源。未勾选(false)该组资源的变化会被检测重新打包生成新 bundle并更新远程 catalog。远程资源组需要热更新修复或新增的资源。2. 设置位置打开Addressables Groups窗口。选中本地资源组在 Inspector 中找到Advanced Options折叠区域。在Content Update Restriction分类下找到Prevent Updates复选框。将本地资源组的Prevent Updates勾选远程资源组保持不勾选默认。3. 设置后的行为变化本地资源组即使内容发生修改执行Update a Previous Build时也不会重新打包。旧客户端始终使用本地StreamingAssets中的原 bundle因此不会出现加载错误。远程资源组仍可正常热更新新资源会生成新 bundle 并部署到远程服务器客户端下载后生效。4. 重要注意事项首次构建前必须确定状态Prevent Updates的设置必须在首次完整构建New Build前确定并且后续增量更新中不能更改该组的此选项。否则会导致addressables_content_state.bin状态不匹配热更新失败。本地资源修改如何生效如果需要更新已勾选Prevent Updates的本地资源必须进行一次完整构建并重新打包安装包分发如通过应用商店更新。保存addressables_content_state.bin首次完整构建后务必妥善保存生成的addressables_content_state.bin文件后续每次热更新都需要用它来对比资源变化。最佳实践分组策略本地组仅存放启动必需、长期不变的基础资源核心 UI、启动场景、基础图集等勾选Prevent Updates。远程组存放可变、可热更的资源活动内容、配置表、可替换资源等不勾选Prevent Updates。更新流程完整构建发布新版本时执行New Build生成包含最新本地资源的安装包。增量构建日常热更时执行Update a Previous Build仅更新远程组的变化资源。测试验证修改本地组资源后执行热更新旧客户端应继续加载原有本地资源不报错。修改远程组资源后热更新应正常下载新资源并生效。通过以上设置可以彻底解决本地资源组在热更新时因 bundle 文件名变化导致的加载失败问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2432211.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!