Unity Addressable分组策略、缓存机制及配置代码咨询
Unity Addressable 问题解答
1. 精灵表分组选择
- 单独分组:适合精灵表独立使用的场景(如不同关卡、模块分别加载)。优势是加载粒度更细,可按需加载/卸载,减少内存占用;更新时只需重新打包对应分组的bundle,不影响其他资源。
- 同一Group:适合精灵表需同时加载的场景(如同一UI界面的多个精灵表)。优势是打包后合并为单个bundle,减少IO请求次数,加载速度更快;管理更简洁。
- 注意:标签和分组是独立逻辑,无论哪种分组方式,都可以通过标签寻址资源,不影响使用。
2. 缓存与更新逻辑实现
要实现「新增内容仅下载一次,更新时同步」,核心是利用Addressable的Catalog版本管理和缓存机制:
关键配置
- 在
Addressable Settings中开启Remote Catalog,设置远程服务器路径(用于存放Catalog和bundle)。 - 将目标Group的
Content Update Restriction设为Can Change Post Release,支持增量更新。 - 每次更新资源时,修改Catalog版本号(可手动在Addressable Settings的
Catalog Version字段修改,或通过脚本自动生成唯一版本标识)。
核心代码
using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using System.Threading.Tasks; public class ContentUpdater : MonoBehaviour { async void Start() { await CheckForUpdates(); } async Task CheckForUpdates() { // 检查Catalog是否有更新 var updateCheckHandle = Addressables.CheckForCatalogUpdates(); await updateCheckHandle.Task; if (updateCheckHandle.Status == AsyncOperationStatus.Succeeded && updateCheckHandle.Result.Count > 0) { // 下载并更新Catalog var catalogUpdateHandle = Addressables.UpdateCatalogs(updateCheckHandle.Result); await catalogUpdateHandle.Task; // 下载更新后的资源(替换为你的精灵表标签) var downloadHandle = Addressables.DownloadDependenciesAsync("sprite_atlas_tag"); await downloadHandle.Task; Debug.Log("内容已更新至最新版本"); } else { Debug.Log("当前内容已是最新"); } } }
- 原理:Addressable会缓存下载的bundle,只要bundle的哈希值不变,就不会重复下载;当服务器更新资源时,新bundle的哈希变化,Catalog会记录该变化,客户端检测后自动下载新资源。
3. 缓存保留规则
Addressable的缓存默认永久保留,直到用户卸载应用,或手动调用Addressables.ClearCache()清除。所谓「150天自动删除」并非Addressable内置逻辑,部分安卓设备的系统可能在存储空间不足时自动清理Persistent Data Path中的旧文件,但这是系统行为,而非框架特性。
若需自定义缓存过期逻辑,可手动检查缓存文件的创建时间并清理:
using System.IO; using System; public class CacheManager { public void ClearExpiredCache(int expireDays = 150) { string cacheDir = Path.Combine(Application.persistentDataPath, "com.unity.addressables"); if (!Directory.Exists(cacheDir)) return; foreach (var file in Directory.GetFiles(cacheDir, "*", SearchOption.AllDirectories)) { FileInfo fileInfo = new FileInfo(file); if ((DateTime.Now - fileInfo.CreationTime).TotalDays > expireDays) { fileInfo.Delete(); } } } }
- 注意:手动清理缓存可能导致已加载资源失效,建议在应用启动时或用户主动触发时执行。
内容的提问来源于stack exchange,提问作者rdx talha
相关产品推荐
相关产品推荐

