10-03-YooAsset实战-Unity-Addressable-Assets实战
实战-Unity Addressable Assets实战篇章10-实战篇-从零搭建状态已完成阅读时间约 25 分钟一、引言1.1 本章在系列中的定位Addressable Assets简称 AA是 Unity 官方推出的资源管理解决方案目的是取代传统 AssetBundle。它的核心理念是资源位置 资源标签的解耦让开发者只关心我想要什么资源而不必关心资源在哪个包里。作为 Unity 官方的资源管理方案AA 与 YooAsset 在设计上有许多相似之处。本章将系统对比 AA 与 YooAsset帮助你深入理解 YooAsset 的设计取舍。1.2 本章要解决的核心问题Addressable Assets 的核心概念是什么AA 与 YooAsset 在架构上有何异同AA 的最佳实践是什么什么场景下选 AA什么场景下选 YooAsset1.3 阅读前置要求完成 10-01 YooAsset 项目搭建完成 10-02 Unity 原生 AB 实战了解 Unity 编辑器扩展基础二、Addressable Assets 核心概念2.1 安装通过 Package Manager 安装Window → Package Manager → 搜索 Addressables → Install安装后菜单栏会出现Window → Asset Management → Addressables。2.2 核心概念2.2.1 Address地址Address是资源的唯一标识符类似 YooAsset 的Location// YooAsset var op YooAssets.LoadAssetAsyncSprite(Assets/UI/Button.png); // Addressable var op Addressables.LoadAssetAsyncSprite(Button_Normal);AA 的 Address 可以是资源路径自定义标签资源 GUID2.2.2 Group组Group是资源的容器类似 YooAsset 的 GroupAA ├── Group_Default ← 默认组 │ ├── UI_Button_Normal.png │ ├── UI_Icon_Home.png │ └── ... ├── Group_Battle │ ├── Hero_Assassin.prefab │ ├── Skill_Fireball.prefab │ └── ... └── Group_Shared └── Atlas_Common.png2.2.3 Label标签Label是资源的软分组可以在运行时按标签批量加载Addressables.LoadAssetsAsyncSprite(ui_icons, null);2.2.4 Catalog目录AA 的 Catalog 类似 YooAsset 的 Manifest记录所有资源与 Group 的映射。2.3 Addressable 的工作流[Editor 端] 1. 标记资源为 Addressable 2. 配置 Group 3. 构建Build → New Build [Runtime 端] 1. Addressables.InitializeAsync() 2. LoadAssetAsync(address) 3. Release(handle)三、Addressable 实战3.1 标记资源步骤 1开启 AddressableWindow → Asset Management → Addressables → Groups步骤 2标记资源选中资源 → Inspector 中勾选AddressableSprite Icon_Home ├── Asset Name: Home ├── Address: icons/home └── Labels: [ui, icons]3.2 配置 Group// Group 配置示例 public class MyGroupConfig { public string GroupName Default Local Group; public BundleNamingStyle Naming BundleNamingStyle.NoHash; // 或 FileNameHash public bool IncludeInBuild true; public bool UseAssetBundleCache true; public bool UseAssetBundleCrc true; }3.3 加载资源using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class AddressableLoader { /// summary /// 同步获取句柄 /// /summary public AsyncOperationHandleSprite LoadSprite(string address) { return Addressables.LoadAssetAsyncSprite(address); } /// summary /// 异步加载 /// /summary public async TaskSprite LoadSpriteAsync(string address) { var handle Addressables.LoadAssetAsyncSprite(address); await handle.Task; return handle.Result; } /// summary /// 按标签批量加载 /// /summary public async TaskListSprite LoadSpritesByLabel(string label) { var handle Addressables.LoadAssetsAsyncSprite(label, null); await handle.Task; return new ListSprite(handle.Result); } /// summary /// 释放 /// /summary public void ReleaseT(AsyncOperationHandleT handle) { Addressables.Release(handle); } }3.4 加载场景public async Task LoadSceneAsync(string address) { var handle Addressables.LoadSceneAsync(address, LoadSceneMode.Single); await handle.Task; } public void UnloadScene(AsyncOperationHandleSceneInstance handle) { Addressables.UnloadSceneAsync(handle); }四、AA 高级特性4.1 远端分发public class RemoteDistribution { /// summary /// 配置远端 CDN /// /summary public void SetupRemote() { // Profile 配置 var profile AddressableAssetSettingsDefaultObject.Settings.profileSettings.GetProfile(Remote); var remoteLoadPath profile.GetValueByName(RemoteLoadPath); var remoteBuildPath profile.GetValueByName(RemoteBuildPath); } /// summary /// 检查更新 /// /summary public async Task CheckForCatalogUpdates() { var checkHandle Addressables.CheckForCatalogUpdates(false); await checkHandle.Task; if (checkHandle.Result.Count 0) { // 有更新更新 Catalog var updateHandle Addressables.UpdateCatalogs(checkHandle.Result, false); await updateHandle.Task; } Addressables.Release(checkHandle); } }4.2 资源变体VariantsAA 支持按变体打包如中/英/日语言包Group_UI ├── ui_textures_zh ├── ui_textures_en └── ui_textures_japublic async TaskSprite LoadWithVariant(string baseAddress, string variant) { var address ${baseAddress}[{variant}]; return await Addressables.LoadAssetAsyncSprite(address).Task; }4.3 资源预加载public class ResourcePreloader { public async Task PreloadByLabel(string label, int priority 0) { var handle Addressables.LoadAssetsAsyncObject( label, null, Addressables.MergeMode.Union, releaseDependenciesOnFailure: false, priority: priority ); await handle.Task; } }4.4 内存管理public class AAMemoryManager { public void ReleaseAll() { // 释放所有引用 Resources.UnloadUnusedAssets(); } public long EstimateMemory() { // AA 不直接提供内存查询 // 需结合 Profiler return Profiler.GetTotalAllocatedMemoryLong(); } }五、AA vs YooAsset 对比5.1 架构对比维度AddressableYooAsset厂商Unity 官方tuyoogame 团队内核资源管理框架资源管理框架上层抽象ResourceManagerYooAssets异步系统AsyncOperationHandleAsyncOperationBase引用计数自动基于 handle显式基于 Release缓存Resource LocatorIFileSystem加密无内置支持断点续传内置内置跨平台完整完整含小游戏VFS 抽象无完整支持性能高高易用性★★★★★★★★文档丰富中等社区庞大活跃中文支持一般完善5.2 API 对比功能AddressableYooAsset加载资源LoadAssetAsyncT(address)LoadAssetAsyncT(location)按标签加载LoadAssetsAsyncT(label, callback)不直接支持需遍历加载场景LoadSceneAsync(address, mode)LoadSceneAsync(name, mode)释放Release(handle)op.Release()检查更新CheckForCatalogUpdatesRequestCheckVersionAsync更新目录UpdateCatalogsRequestPackageManifestAsync加载进度handle.PercentCompleteop.Progress取消加载Release(handle)op.Cancel()实例化InstantiateAsync(address)自己实现5.3 详细对比5.3.1 异步操作// Addressable var handle Addressables.LoadAssetAsyncSprite(icon); await handle.Task; var sprite handle.Result; // YooAsset var op YooAssets.LoadAssetAsyncSprite(icon); await op.Task; var sprite op.Result;差异AA 的 handle 需要手动 ReleaseYooAsset 的 op 同样需要 Release。两者 API 高度相似。5.3.2 批量加载// Addressable按 Label 加载 var handles Addressables.LoadAssetsAsyncSprite( ui_icons, sprite Debug.Log($Loaded: {sprite.name}) ); // YooAsset按 Tag 或遍历加载 // YooAsset 没有直接的批量加载 API // 需自己遍历资源差异AA 的 Label 系统更强大YooAsset 需要自己遍历。5.3.3 多 Package// Addressable通过不同的 Group 实现 // 一个 Group 一个 Package // 运行时通过 Address 自动路由 // YooAsset内置多 Package var package await YooAssets.LoadPackageAsync(ActivityPackage); var op package.LoadAssetAsyncSprite(activity_icon);差异YooAsset 的多 Package 更显式适合复杂业务场景。5.4 选型建议场景推荐理由全新 Unity 项目AA 或 YooAsset 均可两者都能满足中文项目YooAsset中文文档完善小游戏项目YooAssetYooAsset VFS 专为小游戏设计海外项目AA 或 YooAsset都支持已有 AA 项目继续用 AA迁移成本高已有 YooAsset 项目继续用 YooAsset迁移成本高多 Package 复杂业务YooAsset内置多 Package单机游戏AA简单易用联机游戏两者均可看团队偏好六、AA 性能优化6.1 内存优化// 1. 及时释放 public void OnDestroy() { if (_handle.IsValid()) Addressables.Release(_handle); } // 2. 预加载控制 public async Task PreloadCritical(string label) { var handle Addressables.LoadAssetsAsyncObject(label, null); await handle.Task; _criticalHandles.Add(handle); } // 3. 异步释放 public async Task UnloadCritical() { foreach (var handle in _criticalHandles) { Addressables.Release(handle); } _criticalHandles.Clear(); Resources.UnloadUnusedAssets(); }6.2 加载优化// 1. 并发控制 public async Task BatchLoad(Liststring addresses, int maxConcurrent 10) { var semaphore new SemaphoreSlim(maxConcurrent); var tasks addresses.Select(async address { await semaphore.WaitAsync(); try { return await Addressables.LoadAssetAsyncSprite(address).Task; } finally { semaphore.Release(); } }); return await Task.WhenAll(tasks); }6.3 构建优化// 1. 压缩配置 public class BuildConfig { public void Optimize() { // 在 Group 配置中 BundleMode BundlePackMode.PackTogetherByLabel; IncludeAddressInCatalog false; IncludeGUIDInCatalog false; IncludeLabelsInCatalog true; } }七、AA 踩坑记录7.1 常见问题问题原因解决方案资源找不到Address 拼写错误启用Addressable Asset Settings → Send Diagnostic Event内存泄漏忘记 Release配合 weak reference加载失败构建时未包含检查 Group 的 Include In Build跨域错误CDN 配置错误检查 Profile 中的 RemoteLoadPath场景加载慢资源未预加载用PreloadDependenciesAsyncHash 变化资源被修改启用Use Asset Bundle Cache7.2 调试技巧// 开启诊断事件 [InitializeOnLoadMethod] public static void EnableDiagnostics() { Addressables.ResourceManager.ResourceProviders .OfTypeIResourceProvider() .ToList() .ForEach(p { if (p is ResourceProvider rp) rp.DiagnosticEvent (op, type, ctx) Debug.Log($[AA] {type}: {ctx}); }); }7.3 监控面板public class AAMonitor { public void ShowStatus() { Debug.Log($正在下载: {Addressables.WebRequestOverride}); Debug.Log($已加载 Bundle: {GetBundleCount()}); Debug.Log($总内存: {Profiler.GetTotalAllocatedMemoryLong() / 1024 / 1024} MB); } }八、迁移到 YooAsset8.1 迁移评估评估项内容AA 资源数统计需要迁移的资源API 使用面列出所有 LoadAssetAsync 调用跨域资源是否有 CDN 资源自定义 Provider是否有自定义 ResourceProvider8.2 迁移工具public class AAToYooAssetMigrator { public void MigrateAddressables() { // 1. 读取 AA 配置 var aaSettings AddressableAssetSettingsDefaultObject.Settings; // 2. 创建 YooAsset Group foreach (var group in aaSettings.groups) { var yooGroup new PackRule { Name group.Name, Filter Assets/..., // 根据 Group 配置生成 }; } // 3. 转换 Address foreach (var entry in aaSettings.GetAllAssets()) { // entry.address → YooAsset Location } } }九、总结9.1 本章要点回顾AA 核心Address Group Label CatalogAA 工作流Editor 标记 → Build → Runtime LoadAA 优势Unity 官方、Label 系统、丰富的文档AA 痛点没有原生加密、引用计数相对隐式YooAsset 优势VFS小游戏、中文支持、多 Package9.2 与前后章节的关联前章10-02 介绍了 Unity 原生 AssetBundle本章对比 Addressable介绍 AA 与 YooAsset 的异同后章10-04 将介绍资源组织与依赖管理9.3 实践建议新项目选型根据团队熟悉度、是否需要小游戏、是否多语言决定不轻易切换AA ↔ YooAsset 切换成本高选定后就坚持用混合使用理论上可行但不推荐增加复杂度关注性能两者都需要关注内存、并发、构建时长上一篇Unity 原生 AssetBundle 实战下一篇资源组织与依赖管理实战

相关新闻

DM8在CentOS7搭建两节点实时主备集群

DM8在CentOS7搭建两节点实时主备集群

任务: 1. 在一台服务器上部署两个节点的实时主备集群 2. 完成实时主备集群的配置与部署 3. 进行同步测试 4. 进行主备切换测试 5. 模拟主机故障,验证备机自动接管能力 6. 恢复故障主机,将其重新加入集群 7.进行TPCC测试 一、前期准备…

2026/7/26 23:46:44 阅读更多 →
部署实战;Docker + AI Agent:让AI一键部署Spring Boot到服务器,从打包到上线只要一条指令

部署实战;Docker + AI Agent:让AI一键部署Spring Boot到服务器,从打包到上线只要一条指令

【部署实战】Docker AI Agent:让AI一键部署Spring Boot到服务器,从打包到上线只要一条指令 文章目录设置时区创建应用目录复制jar包创建非root用户运行健康检查JVM参数:限制堆内存、开启GC日志写在前面 写过Spring Boot的都懂——开发一时爽…

2026/7/26 23:45:44 阅读更多 →
MySQL - 理解 InnoDB 的 B+ 树索引

MySQL - 理解 InnoDB 的 B+ 树索引

这篇笔记想把两件事说清楚:索引的结构到底长什么样、什么场景下真的能用上。这两点想通了,“最左前缀”“回表”"覆盖索引"这些概念就不用死记,靠推理就能得出结论。 目录 为什么需要索引索引如何演化成 B 树聚簇索引与二级索引索…

2026/7/26 23:45:44 阅读更多 →

最新新闻

HarmonyOS应用《玄象》开发实战:LuopanPage 罗盘页:@ohos.public.sensor 陀螺仪/方向传感器接入

HarmonyOS应用《玄象》开发实战:LuopanPage 罗盘页:@ohos.public.sensor 陀螺仪/方向传感器接入

阅读时长:约 19 分钟 | 难度:★★★★★ | 篇章:第 7 篇 风水罗盘模块 对应源码:entry/src/main/ets/pages/fengshui/LuopanPage.ets 前言 风水罗盘是玄象项目最具互动性的功能之一。通过 ohos.public.sensor 方向传感器&am…

2026/7/27 0:07:58 阅读更多 →
HarmonyOS应用《玄象》开发实战:星宿详情页的 Tabs 多视图切换(图说/属性/断语)

HarmonyOS应用《玄象》开发实战:星宿详情页的 Tabs 多视图切换(图说/属性/断语)

阅读时长:约 18 分钟 | 难度:★★★★☆ | 篇章:第 4 篇 二十八星宿模块 对应源码:entry/src/main/ets/pages/mansion/MansionDetailPage.ets 前言 玄象项目星宿详情页当前采用"单页滚动"模式展示所有信息。对于信…

2026/7/27 0:07:58 阅读更多 →
[电脑疑难档案] 电脑开机越来越慢?先别急着重装,按这几处排查更稳

[电脑疑难档案] 电脑开机越来越慢?先别急着重装,按这几处排查更稳

电脑开机越来越慢,很多人第一反应是“是不是系统用久了,该重装了”。但从实际排查看,真正需要重装的情况并不多。更多时候,问题出在启动项太多、登录后后台任务集中运行、磁盘占用高、更新和杀毒扫描刚好撞在一起,或者老电脑还在用机械硬盘。直接重装当然可能短时间变快,…

2026/7/27 0:07:58 阅读更多 →
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程 作为技术博主,我经常收到读者的提问:“这些高大上的术语到底是什么意思?它们之间有什么关系?”今天,我们就用最接地气的语言,把这些…

2026/7/27 0:07:58 阅读更多 →
如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南

如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南

如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh…

2026/7/27 0:06:58 阅读更多 →
IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台

IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台

IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台 【免费下载链接】IEA-15-240-RWT 15MW reference wind turbine repository developed in conjunction with IEA Wind 项目地址: https://gitcode.com/gh_mirrors/ie/IEA-15-240-RWT 在风电技术快速发展…

2026/7/27 0:06:58 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻