学会使用Addressables资源管理系统

张开发
2026/4/15 9:07:53 15 分钟阅读

分享文章

学会使用Addressables资源管理系统
一、它是什么Addressable Asset System简称Addressables是Unity官方在2019版本中正式发布的资源管理系统。简单来说它是Unity对传统AssetBundle的一次全面封装与升级目的是降低资源加载的使用门槛减少后期维护所消耗的精力。从技术原理上看Addressables底层最终生成和管理的仍然是AssetBundles这一点与传统的AssetBundle方案没有本质区别。但它在AssetBundle的基础上构建了更高层级的抽象提供了从资源标识、分组、打包、加载到更新的一体化全套流程。Addressables的核心设计理念是“地址即引用”——开发者只需要通过一个地址Address来请求资源系统自动处理背后的所有细节包括资源在本地还是远程、依赖项是否已加载、是否需要下载等。从系统组成来看Addressables主要包含以下几个核心概念Address地址每个被标记为“Addressable”的资源都有一个唯一的地址标识符可以通过这个地址在任何地方调用该资源。Group分组资源按组进行组织和管理每组可以独立设置打包和加载策略。Catalog资源目录包含所有Addressable资源信息的索引文件catalog.json运行时根据它来定位和加载资源。AsyncOperationHandle异步操作句柄所有Addressables的加载操作都返回这个句柄用于跟踪加载状态和释放资源。Addressables需要Unity 2018.3或更高版本建议使用Unity 2019 LTS及以上版本。二、为什么要用它在Addressables出现之前Unity开发者主要面临三种资源管理方案直接引用、Resources API和AssetBundle。这三种方案各有局限直接引用资源在构建时被打包进主程序导致包体臃肿且无法按需卸载。Resources API同样将所有资源打包进安装包且Resources.Load是同步操作加载大量资源会造成明显卡顿所有Resources中的资源还会在应用启动时被加载到内存中形成“内存峰值”。AssetBundle虽然功能强大但需要手动管理依赖关系、网络请求、内存释放等配置繁琐维护成本高。Addressables正是为了解决这些痛点而生的它的核心优势体现在以下几个方面1. 按需加载与热更新Addressables支持将资源划分为独立组Groups通过异步加载实现按需加载只需加载当前场景需要的资源而非一次性加载全部。这意味着开发者可以将需要更新的资源如场景、预制件、纹理标记为Addressable并打包当有新版本时只需替换特定组的资源文件无需用户重新下载整个应用。实测数据显示在大型RPG项目中使用Addressables可使初始包体减少40%-60%内存峰值降低30%左右。2. 自动依赖管理这是Addressables相较于AssetBundle最显著的改进之一。使用AssetBundle时开发者需要手动保证资源的依赖项提前加载进内存。而Addressables在开发时无需关注资源依赖情况运行时系统会自动检测所有依赖并自动加载保证每次资源加载都能成功。3. 精细化内存管理Addressables采用引用计数机制来管理资源生命周期。当通过Addressables.Release释放资源时系统会检查引用计数确认为0后才真正卸载内存。相比传统的Resources.UnloadUnusedAssets全局扫描方式这种方式更精准高效。4. 统一本地与远程资源Addressables封装了网络请求接口开发者无需关心资源在本地还是CDN上统一调用LoadAssetAsync等异步接口即可。系统在运行时会自动下载远程资源或加载本地资源大幅简化了远程资源加载的实现。5. 灵活的部署与更新资源可以从任何位置加载——本地安装包、远程服务器、CDN等。开发者可以在项目开发的任何阶段更改资源的托管位置而无需重写任何游戏代码。三、怎么用它使用Addressables的整体流程可以分为五个步骤安装、初始化、标记资源、编写加载代码、构建打包。第一步安装Addressables包在Unity编辑器中打开Window Package Manager将包列表设置为显示“Unity Registry”搜索“Addressables”并点击Install安装。第二步初始化配置安装完成后打开Window Asset Management Addressables Groups点击“Create Addressables Settings”按钮。系统会自动创建AddressableAssetsData文件夹用于存放配置文件和资源跟踪数据建议将该文件夹下的文件纳入版本控制系统。安装后会在这个路径下看到这个结构点击Groups会跳转打开下面Addressables Group的界面;这是Addressables Group窗口界面默认有一个Default Local Group(Default);我们可以在当前界面鼠标右键Create New Group/Packed Assets操作创建一个新的组块你创建新的组后可以自定义修改刚才这个Packed Assets的名字具体可以根据资源模块划分取一个更贴近易懂的名字第三步将资源标记为Addressable有以下几种方式可以将资源标记为可寻址资源方式一在资源的Inspector窗口中勾选“Addressable”复选框。我们勾选复选框之后右边显示的是你正在标记的资源的唯一标识它现在显示的是Assets下的路径你也可以自己再修改这个资源默认是被添加到默认Default这个组下我们是可以自己拖拽资源到自己想存放的组下去方式二将资源从Project窗口直接拖拽到Addressables Groups窗口的某个分组中。方式三通过AssetReference字段在Inspector中拖拽赋值如果拖拽的资源尚未被标记为Addressable系统会自动将其标记并添加到默认分组。如果需要将现有的Resources文件夹下的资源迁移到AddressablesUnity会自动将资源移动到Resources_moved文件夹中避免重复打包造成空间浪费。第四步编写加载代码Addressables提供了多种API来加载资源最常用的是异步加载方式csharpusing UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; // 方式一通过Completed事件回调 void Start() { Addressables.LoadAssetAsyncGameObject(character_hero).Completed OnLoadComplete; } void OnLoadComplete(AsyncOperationHandleGameObject handle) { if (handle.Status AsyncOperationStatus.Succeeded) { GameObject hero Instantiate(handle.Result); // 使用完毕后记得释放 Addressables.Release(handle); } } // 方式二协程写法 IEnumerator LoadCharacter() { var handle Addressables.LoadAssetAsyncGameObject(character_hero); yield return handle; if (handle.Status AsyncOperationStatus.Succeeded) { GameObject hero Instantiate(handle.Result); Addressables.Release(handle); } }如果需要使用AssetReference在Inspector中拖拽赋值可以这样写csharppublic class LoadAssetScript : MonoBehaviour { public AssetReference somePrefab; private void Start() { somePrefab.InstantiateAsync().Completed (obj) { if (obj.Status AsyncOperationStatus.Succeeded) { Debug.Log(加载成功); } }; } }第五步构建与打包配置好资源分组后根据需要设置Play Mode Script推荐使用“Use Existing Build”或“Simulate Groups”模式进行测试然后通过Build New Build Default Build Script进行打包。构建完成后会生成以下文件catalog.json资源目录表存放所有Addressable资源的信息setting.json运行时Addressables参数*.bundle实际的资源包文件第六步配置远程资源可选如果需要将资源部署到远程服务器实现热更新需要进行以下配置打开Window Asset Management Addressables Settings启用“Build Remote Catalog”属性在Profile中配置“RemoteLoadPath”设置为远程资源的访问URL在Groups窗口中将需要远程托管的组设置为“Build Load Paths”指向Remote位置运行时Addressables会通过对比本地和远程的hash文件来判断是否有更新若有更新则下载最新的catalog.json并根据索引文件下载对应的资源包。四、需要注意的点有哪些1. 学习曲线较陡峭Addressables的依赖注入和异步编程模型对新手不够友好。建议从简单的小项目开始逐步建立对分组策略、地址命名规范和依赖管理的理解。2. 必须正确管理资源生命周期这是使用Addressables最容易踩的坑。加载资源后会返回一个AsyncOperationHandle使用完毕后必须调用Addressables.Release(handle)来释放资源。如果只是实例化了资源但忘记释放handle或者释放时机不对会导致内存泄漏。更严重的是如果释放了handle但资源实例没有被销毁这些实例会在资源被卸载后丢失材质和模型的引用在游戏中表现为材质丢失、模型缺失等问题。基本原则是每次LoadAssetAsync都应该有对应的Release。3. 分组策略需要精心设计分组策略直接影响加载效率和更新粒度。分组过细会导致大量小文件增加IO开销和网络请求次数分组过粗则会导致资源更新时下载量过大。常见的分组策略包括按使用频率分组常驻资源与场景资源分离、按平台特性分组移动端用压缩纹理、按更新频率分组将频繁更新的资源单独分组。4. 异步编程的注意事项绝大多数Addressables API都是异步的这是为了安全地支持远程内容下载。这意味着在资源加载完成之前不能直接使用资源必须等待Completed回调或协程完成。同时要注意异步时序问题比如在资源加载完成前UI状态的处理。如果项目确实需要同步加载Unity在1.17.4版本后提供了WaitForCompletion方法但需要注意同步加载在加载大量或复杂资源时可能导致性能问题。5. 版本控制与协作冲突当多个开发者同时修改Addressables Groups配置时Git冲突频发。建议将AddressableAssetsData文件夹下的.asset文件纳入版本控制但忽略自动生成的catalog*.json文件。6. 调试与性能分析动态加载带来的调试复杂性不容忽视。资源加载失败可能源于网络延迟、分组配置错误或内存碎片。Unity提供了Addressables分析工具Window Analysis Addressables Analyzer可以帮助分析资源重复打包和加载性能问题。建议结合自定义日志记录每个资源的加载耗时并在Profiler中添加标记来区分Addressables与其他加载操作便于定位性能瓶颈。7. 资源迁移时的注意事项如果要将现有的Resources文件夹下的资源迁移到AddressablesUnity会自动将资源移动到Resources_moved文件夹中。迁移后原来的Resources.Load代码需要全部改为Addressables API。8. 远程资源的缓存与更新策略当使用远程资源时需要合理规划版本更新策略。运行时通过对比本地和远程的hash值判断是否有更新若有更新则下载最新的catalog.json再根据diff结果下载需要更新的资源包。这个过程需要处理好网络异常、下载中断等边界情况。总的来说Addressables是一个功能强大的资源管理系统尤其适合中大型项目和有热更新需求的游戏。但它也需要一定的学习成本和配置投入建议在实际项目中根据自身需求逐步引入而非盲目追求“全盘Addressables化”。掌握Addressables需要时间和耐心但一旦跨过门槛你将获得前所未有的资源管理自由——每一行异步加载的代码都在为你的游戏插上按需更新的翅膀。加油你完全可以做到

更多文章