Unity MyFramework 用法说明(二十五):使用 AtlasManager 统一管理图集与 Sprite 引用
Unity 的图片最终通常会被打进图集但业务代码仍然需要处理图集加载、Sprite 查找、引用持有和资源释放。MyFramework 使用AtlasManager同时封装SpriteAtlas v2和传统 Multi Sprite 图集并通过AtlasRef管理图集引用避免图片仍在使用时图集被提前卸载。项目地址https://github.com/ZHOURUIH/MyFramework一、AtlasManager 解决什么问题直接使用 Unity 图集时业务层需要考虑图集资源如何加载 如何通过名称查找 Sprite 多个界面共享图集时何时卸载 异步加载完成时界面是否还存在 SpriteAtlas 在真机上如何响应 atlasRequested TexturePacker 图集和 SpriteAtlas 如何使用统一接口AtlasManager将这些操作统一为加载图集 ↓ 获得 AtlasRef ↓ 通过名称获取 Sprite ↓ 界面或对象持有 AtlasRef ↓ 使用结束后释放引用 ↓ 引用数量为 0 时自动卸载业务层不需要区分当前图集来自SpriteAtlas还是一张设置为 Multiple 的纹理。二、同步加载图集图集路径相对于Assets/GameResources并且必须带后缀。例如图集位于Assets/GameResources/UI/Common.spriteatlasv2加载方式为using static FrameBaseHotFix; protected AtlasRef mCommonAtlas; protected void loadAtlas() { mCommonAtlas mAtlasManager.getAtlas( UI/Common.spriteatlasv2); if (mCommonAtlas null || !mCommonAtlas.isValid()) { return; } Sprite buttonSprite mCommonAtlas.getSprite(ButtonNormal); }getAtlas()首先检查图集是否已经加载。已经存在时只创建一份新的AtlasRef不存在时才通过ResourceManager加载图集资源并解析其中的 Sprite。三、AtlasRef 表示一次独立引用AtlasRef并不只是包装AtlasBase它还会为每个持有者生成独立凭证public void setAtlas(AtlasBase atlas) { mAtlas atlas; mToken generateToken(); mAtlas.addReference(mToken); }图集内部保存全部引用凭证protected HashSetlong mReferenceTokenList new();同一个图集被三个界面使用时结构类似Common.spriteatlasv2 ├── AtlasRef主界面 ├── AtlasRef背包界面 └── AtlasRef商店界面关闭背包界面只会释放背包自己的引用不会影响主界面和商店界面。因此不要把一份AtlasRef同时交给多个生命周期不同的对象。每一个独立持有者都应该通过getAtlas()获得自己的引用。四、释放图集引用不再使用图集时调用mAtlasManager.unloadAtlas( ref mCommonAtlas);unloadAtlas()会校验 AtlasRef 是否有效 移除当前引用凭证 回收 AtlasRef 把变量设置为 null不要直接卸载底层纹理或SpriteAtlasResources.UnloadAsset(texture); Object.Destroy(sprite);这些操作会绕过AtlasManager的引用记录可能让其他仍在显示图片的界面失去资源。五、为 UI 动态切换图集需要运行时切换图片的节点应使用myUGUIImage例如一个专门显示物品图标的节点public class UIItemDetail : LayoutScript { protected myUGUIImage mItemIcon; protected AtlasRef mItemAtlas; public override void assignWindow() { newObject( out mItemIcon, Background/ItemIcon); } public override void onGameState() { base.onGameState(); mItemAtlas mAtlasManager.getAtlas( UI/Item.spriteatlasv2); mItemIcon.setAtlas(mItemAtlas, true); mItemIcon.setSpriteName(Item_Sword); } public override void onHide() { mItemIcon.setAtlas(null, true); mAtlasManager.unloadAtlas( ref mItemAtlas); base.onHide(); } }myUGUIImage.setAtlas()只负责切换当前使用的图集并不会接管外部传入图集的释放。因此动态加载的AtlasRef仍然需要由业务对象保存并在生命周期结束时主动卸载。六、为什么需要 ImageAtlasPath运行时只通过一个Sprite无法可靠得知它来自哪个资源路径或哪个图集。所以 MyFramework 为需要切换图片的节点提供了ImageAtlasPath它会在编辑模式下记录当前图片所在图集public string mAtlasPath;myUGUIImage.init()中会读取这个路径并获取初始图集引用Image ↓ ImageAtlasPath 记录图集路径 ↓ myUGUIImage 初始化 ↓ AtlasManager 加载初始图集因此需要使用myUGUIImage动态切换 Sprite 的节点应确保存在 Image 组件 存在 ImageAtlasPath 组件 ImageAtlasPath 中记录的路径正确普通静态图片不需要在代码中切换时可以继续使用myUGUIImageSimple。七、异步安全加载图集图集较大或者界面需要异步打开时可以使用getAtlasAsyncSafe示例protected AtlasRef mItemAtlas; protected void loadAtlasAsync() { mAtlasManager.getAtlasAsyncSafe( this, UI/Item.spriteatlasv2, (atlas) { mItemAtlas atlas; mItemIcon.setAtlas( mItemAtlas, true); mItemIcon.setSpriteName( Item_Sword); }); }第一个参数需要实现IRecyclable。开始加载时框架会记录对象当前的AssignID。完成后再次检查AssignID 没有变化 执行回调 对象已销毁或被对象池重新分配 不执行旧回调这样可以避免界面已经关闭后旧的图集加载结果又设置到被复用的界面对象上。八、相同图集的异步请求会被合并AtlasManager内部维护protected Dictionary string, ListAtlasLoadParam mLoadRequestList new(); protected Dictionary string, ListAtlasLoadParam mLoadingList new();当多个对象同时请求同一个图集时不会重复发起多次资源加载。流程为界面A请求 Item.spriteatlasv2 ↓ 开始加载图集 界面B再次请求同一路径 ↓ 只把回调加入等待列表 图集加载完成 ↓ 创建一个 AtlasBase ↓ 依次为所有请求创建 AtlasRef ↓ 分别执行回调同时加载的不同图集数量最多为protected const int MAX_LOADING_COUNT 20;超过上限的请求会暂时保留等待其他图集完成后再开始。九、统一支持两种图集格式图集加载完成后AtlasManager会根据后缀决定解析方式。SpriteAtlas v2后缀为.spriteatlasv2创建AtlasUGUI atlas new(mainAsset);然后通过spriteAtlas.GetSprites(spriteList);取出图集中的全部 Sprite并以名称缓存。Multi Sprite 图集其他包含多个 Sprite 的纹理会创建AtlasTP atlas new(mainAsset);加载结果中Texture2D 用于保存实际图集纹理 Sprite 逐个加入名称缓存最终两者都继承AtlasBase业务层始终使用atlasRef.getSprite(spriteName);不需要为不同图集格式分别编写代码。十、图集如何自动卸载AtlasManager每隔两秒检查一次已加载图集protected const float CHECK_INTERVAL 2.0f;满足以下条件时自动销毁AtlasRef 引用数量为 0 并且 图集不在常驻列表中核心判断为if (atlas.getReferenceCount() 0 allowUnloadAtlas(atlasPath)) { atlas.destroy(); mAtlasList.remove(atlasPath); }销毁时会清空 Sprite 名称缓存 释放主资源 ResourceRef 从 AtlasManager 中移除图集高频使用、不希望反复卸载的图集可以设置为常驻mAtlasManager.addDontUnloadAtlas( UI/Common.spriteatlasv2);常驻图集仍然需要正确释放AtlasRef只是引用归零后不会被自动卸载。十一、真机上的 SpriteAtlas 加载Unity 在运行时可能通过SpriteAtlasManager.atlasRequested请求某个SpriteAtlas。AtlasManager.init()中会注册SpriteAtlasManager.atlasRequested onAtlasRequested;收到请求后框架通过AtlasPathConfig.txt把图集名称转换为资源路径再使用ResourceManager加载对应的SpriteAtlas。这一步主要用于保证真机上 Prefab 或场景中的 Sprite 能正确绑定到动态加载的图集。AtlasPathConfig.txt应由框架的资源流程生成和维护业务代码不需要手动响应atlasRequested。十二、总结MyFramework 的图集管理流程是加载 SpriteAtlas 或 Multi Sprite ↓ 统一解析为 AtlasBase ↓ 缓存全部 Sprite ↓ 为每个持有者创建 AtlasRef ↓ 通过名称获取 Sprite ↓ 使用结束后释放 AtlasRef ↓ 引用归零后自动卸载图集常用接口包括mAtlasManager.getAtlas(...); mAtlasManager.getAtlasAsyncSafe(...); atlasRef.getSprite(...); mAtlasManager.unloadAtlas(ref atlasRef); mAtlasManager.addDontUnloadAtlas(...);AtlasManager的核心并不只是通过名字查找图片而是把图集加载、格式兼容、异步请求合并、引用计数和自动卸载统一起来。业务层只需要明确使用哪个图集、获取哪张图片以及什么时候结束持有。

相关新闻

Dayz-Cheat-H4ck-A1mbot核心功能解析:10大必学技巧助你生存

Dayz-Cheat-H4ck-A1mbot核心功能解析:10大必学技巧助你生存

Dayz-Cheat-H4ck-A1mbot核心功能解析:10大必学技巧助你生存 【免费下载链接】Dayz-Cheat-H4ck-A1mbot A project that offers cheats developed with C for DayZ. It aims to improve the game experience with features such as Aimbot, ESP, Spoof. 项目地址: h…

2026/10/17 4:10:57 阅读更多 →
UniHacker终极指南:免费解锁Unity全版本开发的完整解决方案

UniHacker终极指南:免费解锁Unity全版本开发的完整解决方案

UniHacker终极指南:免费解锁Unity全版本开发的完整解决方案 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker Unity3D开发者在学习测试阶段常常面临…

2026/10/17 4:11:47 阅读更多 →
1分钟搞定iPhone USB网络共享!Windows用户必备的苹果驱动安装指南 [特殊字符]

1分钟搞定iPhone USB网络共享!Windows用户必备的苹果驱动安装指南 [特殊字符]

1分钟搞定iPhone USB网络共享!Windows用户必备的苹果驱动安装指南 🚀 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: h…

2026/10/17 4:16:00 阅读更多 →

最新新闻

基于Web的图表设计器diagram-design实战:从数据建模到交互实现

基于Web的图表设计器diagram-design实战:从数据建模到交互实现

做了快两年可视化编辑器相关的项目,陆续接触过不少基于Web的图表设计工具,其中一个最有代表性、也最让我印象深刻的,就是标题里这个“diagram-design”。如果你准备做流程图设计器、架构图编辑器、关系图谱编辑,或者只是在犹豫要不…

2026/10/19 6:19:46 阅读更多 →
大模型记不住会乱说?RAG检索增强生成从原理到落地全解析

大模型记不住会乱说?RAG检索增强生成从原理到落地全解析

做AI应用开发这几年,我遇到最多的提问其实不是"模型怎么调",而是"模型又乱说了""模型怎么不知道这个""模型怎么说不到我系统里的数据"。坦白讲,大模型本身就像个博闻强识但性格固执的老朋友&#xf…

2026/10/19 6:19:46 阅读更多 →
Ryzen 5 3600 + GTX 1660 Super 玩PUBG:经典甜点配置性能榨干指南

Ryzen 5 3600 + GTX 1660 Super 玩PUBG:经典甜点配置性能榨干指南

最近刷到 UP 主 Ana 分享的自己的游戏配置:Ryzen 5 3600 GTX 1660 Super 16GB 内存。很经典的一套组合,弹幕里不少人也在问,这套配置放到现在的绝地求生(PUBG PC)里还能不能流畅玩?画质怎么设置&#xff…

2026/10/19 6:19:46 阅读更多 →
系统提示词泄露防御新思路:基于系统向量的激活空间干预方案

系统提示词泄露防御新思路:基于系统向量的激活空间干预方案

这两年顶会安全方向的投稿里,有一个话题肉眼可见地火了起来:系统提示词泄露。我连续跟了几轮,从攻击侧的文章看到防御侧的文章,绝大多数工作都在讨论同一个痛点——模型内置的那段系统提示词,怎么就这么容易被“钓”出…

2026/10/19 6:19:46 阅读更多 →
Python+Vue构建智慧养老健康数据远程监控可视化系统

Python+Vue构建智慧养老健康数据远程监控可视化系统

1. 项目概述这是一个面向养老场景的健康数据远程监控与可视化分析系统,后端采用Python搭建数据处理与接口服务,前端用Vue实现交互界面,整体定位是“采集—传输—存储—分析—展示”的完整闭环。简单说,就是让老人佩戴的智能设备&a…

2026/10/19 6:19:46 阅读更多 →
YOLOv8n电梯电瓶车检测实战:真实数据+轻量部署+声光报警

YOLOv8n电梯电瓶车检测实战:真实数据+轻量部署+声光报警

简介:本资源是一套基于YOLOv8的电梯场景电瓶车闯入智能识别与报警系统,面向计算机、人工智能、自动化等专业在校学生及初学者,解决公共场所安全监管中对违规载电动车入梯行为的实时检测与预警需求,特别适合作为毕业设计、课程设计…

2026/10/19 6:18:45 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →