Unity Addressables 运行时加载附加 Catalog 使用详解
当项目需要在不重新发布应用的前提下,增量地引入新资源或从其他项目拉取内容时,运行时加载“附加 Catalog”是最干净、最稳的方式。
加载附加 Catalog
加载附加 Catalog: 使用
Addressables.LoadContentCatalogAsync(path, autoReleaseHandle)从本地文件或远程托管地址加载新的 Catalog;加载完成后,Catalog 中的键可直接用于Addressables.LoadAssetAsync等 API。操作句柄释放: 若想让远程 Catalog 被重新下载,之前对同一路径的
LoadContentCatalogAsync必须释放;设置autoReleaseHandle = true可自动避免操作缓存导致的“拿到旧结果”问题。不可卸载: 已加载的 Catalog 不能“卸载”,但可以“更新”。更新前需释放对应加载操作句柄。
1 | public IEnumerator Start() |
只检查远程 Catalog 是否有更新
只检查远程 Catalog 是否有更新,而不立即下载或更新,可以使用
Addressables.CheckForCatalogUpdates()。这个方法会返回一个AsyncOperationHandle<List<string>>,其中包含需要更新的 Catalog 名称列表。你可以在完成回调里判断是否有更新,然后再决定是否调用Addressables.UpdateCatalogs()。
只检查,不更新: 使用
CheckForCatalogUpdates()就能只获取更新信息,而不会阻塞或下载新 Catalog。哈希文件机制: 如果远程目录下有
.hash文件,Addressables 会根据哈希判断是否有新版本。更新时机: 如果只想提示用户有更新,可以在 UI 上显示提示;真正调用
UpdateCatalogs()时再下载。
1 | IEnumerator CheckRemoteCatalogs() |
更新远程 Catalog
更新远程 Catalog(而不是本地 Catalog),关键在于使用
Addressables.UpdateCatalogs()并确保你传入的远程 Catalog 名称列表。
- 只更新远程 Catalog:
CheckForCatalogUpdates()会返回所有需要更新的 Catalog 名称(包括远程和本地)。
如果你只想更新远程 Catalog,可以在结果列表里筛选出远程 Catalog 的名字(通常是加载时指定的 URL 或远程路径)。
- 阻塞特性:
UpdateCatalogs会阻塞其他 Addressables 请求,直到更新完成。
1 | IEnumerator UpdateRemoteCatalogs(List<string> catalogsToUpdate) |
参考文档
https://docs.unity3d.com/Packages/com.unity.addressables@1.22/manual/LoadContentCatalogAsync.html