Loading

[Unity 杂货铺] SpriteAtlas 和 SBP 打包

1 前言

本文并非 Unity 图集的教程或者分享,只是记录下在使用 Unity SpriteAtlas 和 AssetBundle 构建时产生的疑问和排查过程。

内容凌乱,仅作备忘。

2 背景与提问

之前参与的项目使用的是一套自己编写的图集流程,与 Unity 引擎没有太大关联。

这次在试着自己开发项目的时候,使用了 Unity 的 SpriteAtlas,碰到了一些疑惑和想法

大概的提问流程如下,其实也是个人的思考过程和本文的大纲:

  1. uGUI 的 Image 组件是如何使用图集里的图片的?怎么才知道图片是来自图集的?
  2. 在加载UI预制体(Prefab)时,Unity 是在何处以及如何加载对应的 SpriteAtlas 的?
  3. 在 Unity 编辑器中使用 Sprite Atlas 时,Image 组件最终显示时,使用的是图集的纹理设置还是原始精灵的图片设置?调整压缩比例时应该修改哪个设置?
  4. 为什么 Image 组件不直接引用图集却能自动使用图集版本,如何强制使用原始精灵?
  5. 使用 Scriptable Build Pipeline (SBP) 打包一个 Sprite,验证 SBP 是否会自动将 Sprite 所属的图集打包进来
  6. 为什么 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 参考资料

  1. Unity Sprite Atlas 文档:

Unity - 手册: 精灵图集

  1. Scriptable Build Pipeline 源码:

GitHub - needle-mirror/com.unity.scriptablebuildpipeline: The Scriptable Build Pipeline moves the asset bundle build pipeline to C#. Use the pre-defined build flows, or create your own using the divided up APIs. This system improves build time, fixes incremental build, and provides greater flexibility. 📦 [Mirrored from UPM, not affiliated with Unity Technologies.]

不同版本的 SBP 代码似乎有不小的变动,也许底层细节相同,但建议阅读较新版本的代码。

posted @ 2026-04-04 19:45  野生西瓜  阅读(18)  评论(0)    收藏  举报