Unity打包图集
目前用到了两种图集打包的方式:sprite packer and sprite altas
Sprite Packer
流程:
- 打开 Edit -> Project Setting -> Editor
- 选择Always Enabled(Legacy Sprite Packer)模式
- 单独给每个需要打包的图片设置type和mesh
- 只有设置了tag值才会进行打包,相同的tag值打包到同一个图集,不同的Tag值打包为不同的图集
- 下面的mesh type:
- Tight: 是紧密打包方式,也就是尽可能的把图片都打包在图集上,更省空间
- Full Rect:会把所有的小图按照矩形的方式来排列,如果宽高不一样的图片,它们会自动补起
-
打开 Window --> 2D --> Sprite Packer 点击左上角的 pack 就可以啦
注意:放在Resources文件夹中的图片,Unity不会打包到图集中;打包好的图集会放在缓存文件夹Project\Library\AtlasCache里面
Sprite Altas
2017以后的版本,我们项目目前用的也是这种
流程:
- 打开 Edit -> Project Setting -> Editor
- 选择Always Enabled模式
- Project框里右键-> create -> sprite atlas
- 可以将文件夹,纹理或精灵分配给Sprite Atlas。可以将整个文件夹分配给Sprite Atlas资产,该文件夹中的所有纹理(包括子文件夹)都将被打包
- 打包的结果可以实时的在窗口里看到
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:
- https://blog.csdn.net/weixin_36961960/article/details/86707085