[Unity 杂货铺] SpriteAtlas 和 SBP 打包
1 前言
本文并非 Unity 图集的教程或者分享,只是记录下在使用 Unity SpriteAtlas 和 AssetBundle 构建时产生的疑问和排查过程。
内容凌乱,仅作备忘。
2 背景与提问
之前参与的项目使用的是一套自己编写的图集流程,与 Unity 引擎没有太大关联。
这次在试着自己开发项目的时候,使用了 Unity 的 SpriteAtlas,碰到了一些疑惑和想法
大概的提问流程如下,其实也是个人的思考过程和本文的大纲:
- uGUI 的 Image 组件是如何使用图集里的图片的?怎么才知道图片是来自图集的?
- 在加载UI预制体(Prefab)时,Unity 是在何处以及如何加载对应的 SpriteAtlas 的?
- 在 Unity 编辑器中使用 Sprite Atlas 时,Image 组件最终显示时,使用的是图集的纹理设置还是原始精灵的图片设置?调整压缩比例时应该修改哪个设置?
- 为什么 Image 组件不直接引用图集却能自动使用图集版本,如何强制使用原始精灵?
- 使用 Scriptable Build Pipeline (SBP) 打包一个 Sprite,验证 SBP 是否会自动将 Sprite 所属的图集打包进来
- 为什么 SBP 在只打包一个散图时,最终生成的 AssetBundle 里却包含了整个图集和其他散图的信息?
3 正文
在 Unity 中使用 Sprite Atlas 时,建议先阅读官方手册中的“精灵图集”一节以了解基础概念。网络上的相关文章则多聚焦于“Include in Build”和“late binding”这两块较为重要的内容说明。
3.1 uGUI 中的 Image 组件引用的是散图还是图集?
问题描述:
之前在开发项目,拼 UI 的过程中,从 Assets 中把 [图片A] 拖入到 Image 组件中时,我对在编辑器中看到的是哪一份图片感到困惑。
此时项目中可能是有两份 [图片A] 的,一份是原图散图,另一份在创建的图集 XXX.spriteatlasv2 中。
理论上分别修改散图和图集的压缩设置或者纹理格式,即可确认。实际测试发现好像改哪个都可以,又都不可以。
解决方案与调试说明:
实际上如果启用了 Sprite Atlas V2,在 Edit > Project Settings > Editor > Sprite Atlas > Mode 下拉菜单中,选择 Sprite Atlas V2 - Enabled。在此模式下,无论编辑器还是播放模式,Image 组件实际使用的都是图集中的纹理。这符合运行时最终的表现,便于在开发阶段预览真实效果。
但如果将 Mode 设置为 Enabled For Builds,则只在构建时才会打包精灵图集中。编辑器和播放模式将引用原始未打包的纹理。
另外根据官方说明,使用 V1 版本的 Sprite Atlas,在拼图时引用的也是原始源纹理,可能会对设计和运行时造成混淆(拼图时看着挺高清的,打包出来却变模糊了)。
如果将 Inspector 面板调到 Debug 模式,选中散图的 Sprite,是可以看到其 Sprite Atlas 属性的,即图集和子图之前其实是双向引用的。这也是在编辑和打包时,能从子图获取并加载图集的原因。
因此,建议在项目设置中确认 Sprite Atlas Mode 为 V2 并启用 Enabled 模式,同时在 Debug 模式下检查 Sprite 的归属,以确保所见即所得。
3.2 构建 SpriteAtlas 的 AssetBundle:为什么打包一个散图却带出了整个图集?
项目框架使用的是 SBP,而不是内置管线进行AB包的构建,这里先只讨论 SBP 的情况。
首先是照例向 AI 提问:
我想简单的打包一个 Sprite,看 Unity SBP 是否会自动将对应图集打包进来,理清整个打包流程,给我一段代码进行打包和阅读
可以得到一份调用 ContentPipeline.BuildAssetBundles 的简单代码,只传入一个子图的路径进行打包。
使用 AssetStudio 查看打包后的 bundle,可以看到如果你的图片包含在 SpriteAtlas 中的话,bundle 最终会包含整个图集和所有子图的信息。
SBP 的代码是透明的,可以一层一层点进去,看到它的构建过程,是像流水线一样的执行一个一个 IBuildTask 来完成 Bundle 的构建。而资源的依赖信息收集则在 CalculateAssetDependencyData 中进行。
建议使用较新版本的 SBP,旧版可能存在资源重复等已知问题。
4 参考资料
- Unity Sprite Atlas 文档:
- Scriptable Build Pipeline 源码:
不同版本的 SBP 代码似乎有不小的变动,也许底层细节相同,但建议阅读较新版本的代码。

浙公网安备 33010602011771号