Unity Addressables WebGL首次启动后无法获取正确更新资源下载大小
解决WebGL下Unity Addressables更新大小始终显示0的问题
问题根源
WebGL平台上,Addressables会把Catalog和已下载资源缓存到IndexedDB里。首次启动后,要是没主动校验远程Catalog的更新,Addressables会直接用本地缓存的旧Catalog,导致后续调用GetDownloadSizeAsync时,误以为资源已是最新状态,返回0。只有清空IndexedDB清除本地缓存后,才会重新拉取远程Catalog,得到正确的更新大小。
解决方案
核心是先强制更新Catalog,再检测下载大小,确保基于最新的远程资源清单判断。
修改后的代码示例
private IEnumerator PreLoadData() { // 第一步:更新Catalog,确保拿到最新的远程资源清单 AsyncOperationHandle<List<string>> catalogUpdateHandle = Addressables.UpdateCatalogAsync(true); yield return catalogUpdateHandle; if (catalogUpdateHandle.Status == AsyncOperationStatus.Succeeded) { // 第二步:基于最新Catalog获取下载大小 AsyncOperationHandle<long> downloadSizeHandler = Addressables.GetDownloadSizeAsync(PreloadLabel); yield return downloadSizeHandler; OnSizeRecived.Invoke(downloadSizeHandler.Result); if (downloadSizeHandler.Result > 0) { AsyncOperationHandle downloadDependencies = Addressables.DownloadDependenciesAsync(PreloadLabel); while (!downloadDependencies.IsDone) { OnPercentChange.Invoke(downloadDependencies.PercentComplete); yield return null; } // 释放Catalog更新句柄,避免内存泄漏 Addressables.Release(catalogUpdateHandle); } } else { // 处理Catalog更新失败的情况,比如网络异常 Debug.LogError("Catalog更新失败: " + catalogUpdateHandle.OperationException?.Message); } OnDownloadCompleated.Invoke(); }
关键说明
Addressables.UpdateCatalogAsync(true)里的true参数表示强制检查远程Catalog更新,哪怕本地有缓存也会重新校验。- 必须在获取下载大小前完成Catalog更新,不然用的还是旧的资源清单。
- 如果需要主动触发清理缓存(比如用户手动点击更新),可以调用
Addressables.ClearCachedCatalogs()清除缓存的Catalog,之后重新更新Catalog就能获取最新状态。
额外注意事项
- WebGL平台下,Addressables的缓存依赖IndexedDB,别手动操作IndexedDB,尽量用官方API管理缓存,避免出现未知问题。
- 测试更新功能时,要确保远程资源包和Catalog已经正确上传到服务器,且本地构建版本和远程版本不一致。
内容的提问来源于stack exchange,提问作者Nikolai Petrov
相关产品推荐
相关产品推荐

