【Unity】Addressables插件-热更新

本文介绍Unity中使用Addressables系统进行热更新的方法,包括配置步骤及核心代码实现。讲述了如何通过对比远程与本地资源来实现资源的高效更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提配置

(1)勾选AddressableAssetSettings设置的Disable Catalog Update On Startup选项
在这里插入图片描述
(2)相应的热更戏资源分组配置(注:此文采用的是动态资源更新)
Can Change Post Release:No-Static(全量更新资源,直接替换旧资源)
Cannot Change Post Release:Static(增量更新,不更新旧包资源,直接生成新的资源包)
在这里插入图片描述

代码实现

(1)如果本地已经确定好了具体需要热更的资源,可以将需要更新资源的标签记录到本地,每次游戏启动时,做热更新检查,本地系统会对比远程与本地资源的Catalog,不同则更新
(2)有服务器下发热更新资源的名称或标签,同上
(3)暴力热更,获取全部Adressable资源的标签,逐一检车是否需要更新,当然这种方式是不建议的

/// <summary>
    /// 暴力获取所有Key
    /// </summary>
    public void HotUpdate()
    {
        IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators;
        List<object> keys = new List<object>();
        foreach (var item in locators)
        {
            foreach (var key in item.Keys)
            {
                keys.Add(key);
                Debug.Log("Key:"+key);
            }
        }
        Debug.Log("Keys:" + keys.Count);
        if (keys.Count > 0)
            StartCoroutine(CheckForContentUpdate(keys));
    }

热更新核心代码

/// <summary>
    /// 检查更新
    /// </summary>
    /// <param name="keys">确保Keys内标签都需要热更,否则,所有的Key资源都会被下载,并且删除旧资源时,真实更新key的旧资源不会被删除</param>
    /// <returns></returns>
    public IEnumerator CheckForContentUpdate(List<object> keys)
    {
        for (int index = 0; index < keys.Count; index++)
        {
            AsyncOperationHandle<long> DownloadSize = Addressables.GetDownloadSizeAsync(keys[index]);
            yield return DownloadSize;
            if (DownloadSize.Result <= 0)
            {
                Debug.Log("没有更新的资源标签:" + keys[index]);
                keys.Remove(keys[index]);
            }
            else
            {
                m_TotalSize += DownloadSize.Result / Mathf.Pow(1024, 2);
            }
        }
        if (keys.Count <= 0)
            yield return null;
        m_DownLoadKeyList = keys;
        m_DownloadDependencies = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, false);
        yield return m_DownloadDependencies;
    }
    private void Update()
    {
        if (m_DownloadDependencies.IsValid())
        {
            if (m_DownloadDependencies.PercentComplete < 1)
            {
                m_CurAssetSize = m_DownloadDependencies.PercentComplete * m_TotalSize;
                Debug.Log(m_CurAssetSize + "/" + m_TotalSize);
            }
            else if (m_DownloadDependencies.Status == AsyncOperationStatus.Succeeded)
            {
                m_CurAssetSize = m_DownloadDependencies.PercentComplete * m_TotalSize;
                Debug.Log(m_CurAssetSize + "/" + m_TotalSize);
                if (m_DownLoadKeyList.Count > 0)
                {
                    //删除旧资源包,前提Bundle name选择FileName,aa管理AB包名是带Hash的,每个版本的包名都不一致,导致Cache无法区分
                    Addressables.ClearDependencyCacheAsync(m_DownLoadKeyList);
                }
                Addressables.Release(m_DownloadDependencies);
            }
        }
    }
<think>好的,用户现在想了解UnityAddressables插件的作用。之前他们询问过一段关于条件编译和动态加载程序集的代码,现在转向了资源管理相关的插件。这可能意味着他们正在开发一个需要高效管理资源的项目,可能涉及热更新或者动态加载内容。 首先,我需要回忆Addressables的核心功能。Addressables主要解决资源加载和管理的问题,相比传统的Resources文件夹,它更灵活,支持按需加载和释放,适合大型项目。用户之前处理过热更新,可能他们也在考虑如何优化资源加载,减少初始包体大小,或者支持动态下载内容。 用户可能是开发者,可能已经遇到Resources文件夹的限制,比如内存管理不灵活、无法远程更新资源等。他们需要了解Addressables如何帮助他们解决这些问题,以及具体的优势在哪里。 需要注意用户可能的深层需求:比如他们是否在开发跨平台游戏,是否需要支持热更新,或者是否在优化加载时间。Addressables支持异步加载和依赖管理,这对于提升性能很重要。此外,支持远程资源分发可能对他们有用,特别是如果他们的项目需要频繁更新内容而无需重新发布应用包。 还应该提到Addressables的工作流程,比如如何标记资源为Addressable,如何通过地址加载,以及如何管理资源组。同时,注意事项如初始设置复杂度、版本兼容性、内存管理策略也需要涵盖,帮助用户全面评估是否适合他们的项目。 最后,总结Addressables的适用场景,比如大型项目、需要动态下载资源、多平台支持等,让用户明确是否值得引入该插件。可能还需要对比其他资源管理方案,突出Addressables的优势,帮助用户做决策。</think>--- ### **Unity Addressables 插件的作用** **Addressables** 是 Unity 官方提供的**资源管理系统**,核心目标是解决复杂项目的资源加载、依赖管理、内存优化和动态更新问题。它通过“地址化”抽象资源,提供了一套标准化的工作流,尤其适用于需要动态加载内容(如热更新、DLC、多语言资源)或优化包体大小的项目。 --- ### **核心功能详解** #### **1. 资源按需加载与释放** - **传统痛点**: Unity 的 `Resources` 文件夹会强制将所有资源打包到安装包中,无法灵活控制加载时机,容易导致内存浪费。 - **Addressables 方案**: - 资源可标记为“本地”(随安装包分发)或“远程”(动态下载)。 - 通过**异步加载**(`LoadAssetAsync`)避免主线程卡顿。 - 支持手动释放资源(`Release`),精准控制内存占用。 **示例代码**: ```csharp // 通过地址加载资源 var handle = Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/Enemy.prefab"); handle.Completed += (op) => { Instantiate(op.Result); }; ``` --- #### **2. 依赖自动管理** - **传统痛点**: 手动管理资源依赖(如材质、纹理)容易出错,可能导致资源缺失或冗余加载。 - **Addressables 方案**: - 自动追踪资源依赖链,确保所有关联资源正确加载。 - 避免重复加载相同资源(如多个预制体共享的材质)。 --- #### **3. 资源分组与更新** - **关键功能**: - **分组(Group)**:按逻辑或使用场景划分资源(如“场景1”、“UI通用”)。 - **标签(Label)**:跨分组标记资源,实现灵活加载(如加载所有“高清”标签的资源)。 - **远程更新**:若资源组设置为可更新,可替换服务器上的新资源,客户端自动下载差异内容。 **适用场景**: - 修复已发布游戏中的美术/数值问题。 - 发布节日活动内容,无需重新提交应用商店审核。 --- #### **4. 多平台与远程分发** - **自动化处理**: - 根据目标平台(Android/iOS/PC)自动转换资源格式(如纹理压缩格式)。 - 生成资源目录(Catalog)文件,记录资源哈希值和依赖关系。 - **远程服务器支持**: - 将资源组上传至 CDN 或自定义服务器,减少初始包体大小。 - 支持增量更新(仅下载修改过的资源)。 --- ### **对比传统方案(Resources/AssetBundle)** | **方案** | **Resources 文件夹** | **原生 AssetBundle** | **Addressables** | |-------------------|-----------------------------|------------------------------|-------------------------------| | **资源打包** | 全量打包,无法剔除 | 手动管理依赖和打包流程 | 自动依赖分析,可视化分组 | | **内存管理** | 加载后常驻内存 | 需手动卸载 | 引用计数自动释放 | | **热更新** | 不支持 | 需自行实现版本对比和下载逻辑 | 内置版本管理和差异更新 | | **工作流复杂度** | 简单,但功能有限 | 高(易出错) | 中等(需学习但官方工具完善) | --- ### **典型应用场景** 1. **大型开放世界游戏** - 动态加载不同区域的地形、NPC 和任务资源。 2. **多语言/本地化** - 按语言包远程加载音频、文本和图片。 3. **移动端优化** - 将高清资源设为远程加载,根据设备性能下载。 4. **实时活动更新** - 节假日活动资源通过 CDN 分发,玩家无需更新客户端。 --- ### **注意事项** 1. **学习曲线** - 需理解 `Key`(地址、标签、AssetReference)、`OperationHandle` 等核心概念。 2. **初始化耗时** - 首次加载资源前需初始化资源目录(`Addressables.InitializeAsync`)。 3. **版本兼容性** - 资源组更新后,需确保新旧版本资源兼容(如序列化数据格式)。 4. **调试工具** - 使用 `Addressables Analyzer` 分析资源引用和内存泄漏。 --- ### **基础工作流** 1. **标记资源** - 在 Inspector 窗口勾选 `Addressable`,设置唯一地址(如 `"enemy_boss"`)。 2. **配置分组** - 在 Groups 面板创建分组,设置加载策略(本地/远程)。 3. **构建资源** - 点击 `Build > New Build > Default Build Script` 生成资源包。 4. **运行时加载** - 通过地址、标签或 `AssetReference` 字段动态加载。 --- ### **总结** AddressablesUnity 资源管理的“终极解决方案”,**适合中大型项目**。它通过标准化流程解决了 AssetBundle 的繁琐操作,同时提供了资源热更、内存安全和跨平台支持。若项目涉及动态内容或需要优化包体大小,Addressables 几乎是不二之选。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值