You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:15:22