Unity打包图集


目前用到了两种图集打包的方式:sprite packer and sprite altas

Sprite Packer

流程:

  1. 打开 Edit -> Project Setting -> Editor
  2. 选择Always Enabled(Legacy Sprite Packer)模式
  3. 单独给每个需要打包的图片设置type和mesh
    • 只有设置了tag值才会进行打包,相同的tag值打包到同一个图集,不同的Tag值打包为不同的图集
    • 下面的mesh type:
      • Tight: 是紧密打包方式,也就是尽可能的把图片都打包在图集上,更省空间
      • Full Rect:会把所有的小图按照矩形的方式来排列,如果宽高不一样的图片,它们会自动补起
    •  
  4. 打开 Window --> 2D --> Sprite Packer 点击左上角的 pack 就可以啦

注意放在Resources文件夹中的图片,Unity不会打包到图集中;打包好的图集会放在缓存文件夹Project\Library\AtlasCache里面

Sprite Altas

2017以后的版本,我们项目目前用的也是这种

流程:

  1. 打开 Edit -> Project Setting -> Editor
  2. 选择Always Enabled模式
  3. Project框里右键-> create -> sprite atlas
  4. 可以将文件夹,纹理或精灵分配给Sprite Atlas。可以将整个文件夹分配给Sprite Atlas资产,该文件夹中的所有纹理(包括子文件夹)都将被打包
  5. 打包的结果可以实时的在窗口里看到
    •  

Atlas还有一个类型是Variant

Variant它会复制原图集的贴图,并根据一个比例系数来调整复制贴图的大小。通常用于为高分辨率和低分辨率的屏幕准备不同的图集,高级设备用高分辨率,低级设备用低分辨率

scale改成0.1后,可以看到上面第一个明显模糊很多

相比sprite packer的优点

  • 实时查看图集的大小
  • 实时查看图集里面元素的排列布局
  • 增加了LateBinding(不勾选include in build)等特性。一旦启用Late Binding,Unity把Prefab和Atlas的依赖关系是会解开,毕竟在以前,依赖的资源必须在Prefab加载或实例化之前准备好才行,但Late Binding是不需要

图集访问

Sprite Atlas作为一种资源开放给用户,可以在脚本中访问,还可以通过名字获取图集中的精灵。这样用户可以更加直接地随时编辑图集,而且不用去单独加载图集中的每个精灵

var atlas = AssetDatabase.LoadAssetAtPath(a.AssetPath);
if (atlas == null)
     continue;
var s = atlas.GetSprite(spriteName);
if (s != null)
{
    GetComponent.sprite = s;
}

注意:

  • UGUI的图集,无论新旧,在构建AssetBundle的时候,同一个图集内的所有图元都要放在同一个AssetBundle中,否则,如果同一个图集的图元被分散到多个AssetBundle中,那么每一个AssetBundle都会包含一份这个图集的Copy,最终的结果就包体冗余、内存膨胀和加载耗时等问题。
  • SpriteAltas文件可勾选Include In Build,但是不要特意打包,会造成冗余和包体膨胀
  • 代码中动态加载Sprite的地方,直接使用散图的资源路径去加载就可以了,比如:var sprite = Assets.LoadAsset(path)

Reference:

  1. https://blog.csdn.net/weixin_36961960/article/details/86707085