unity-SpriteAtlas图集
unity-SpriteAtlas图集
前篇
- Sprite Atlas - https://docs.unity3d.com/cn/2018.4/Manual/class-SpriteAtlas.html
- 自动创建SpriteAtlas并设置图集资源 - https://www.jianshu.com/p/bdd223184738
- SpriteAtlas与AssetBundle最佳食用方案 - https://cloud.tencent.com/developer/article/1765934
创建 图集
创建.
手动创建. 右键 -> create -> sprite atlas, 然后拖入需要打图集的 文件/文件夹
代码创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public static SpriteAtlas CreateAtlas(string output, TextureImporterFormat tif) {
SpriteAtlas atlas = new SpriteAtlas();
// 设置参数 可根据项目具体情况进行设置
SpriteAtlasPackingSettings packSetting = new SpriteAtlasPackingSettings() {
blockOffset = 1,
enableRotation = false,
enableTightPacking = false,
padding = 2,
};
atlas.SetPackingSettings(packSetting);
SpriteAtlasTextureSettings textureSetting = new SpriteAtlasTextureSettings() {
readable = false,
generateMipMaps = false,
sRGB = true,
filterMode = FilterMode.Bilinear,
};
atlas.SetTextureSettings(textureSetting);
AssetDatabase.CreateAsset(atlas, output);
return atlas;
}
大概就是这样设置
- 网上很说不要勾选 Include In Build, 说勾选了会有冗余的一份散图打进去, 实际上这个Bug早已经在 Unity2018.4.6 中修复了, 所以我们在使用中放心大胆地勾选 Include In Build 就好了
打成 AssetBundle
将 xxx.spriteatlas 图集文件打成 ab 后, 引擎需要根据 每个人自定义加载 方式加载 ab 后, 回调回引擎, 不然会出现图片是 空白 的情况
需要添加 SpriteAtlasManager.atlasRequested
, 不添加的会会报错: spriteatlasmanager.atlasrequested wasn't listened to while xxx requested
添加 atlasRequested
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27using UnityEngine;
using UnityEngine.U2D;
public class AtlasLoader : MonoBehaviour {
public string dir = "Assets/Res/SpriteAtlas";
void OnEnable() {
SpriteAtlasManager.atlasRequested += ReqAtlas;
}
void OnDisable() {
SpriteAtlasManager.atlasRequested -= ReqAtlas;
}
void ReqAtlas(string tag, System.Action<SpriteAtlas> callback) {
LogUtil.D("--- ReqAtlas, tag: {0}", tag); // tag 就是图集文件名
SpriteAtlas sa = null;
string path = string.Format("{0}/{1}.spriteatlas", dir, tag);
sa = UnityEditor.AssetDatabase.LoadAssetAtPath<SpriteAtlas>(path);
sa = (SpriteAtlas) ResourceMgr.Instance.LoadAsset(path, typeof(SpriteAtlas));
callback(sa);
}
}
打包方式
- 旧方式把 某个 图片 文件夹打成一个 ab 的还是要的, 原有的资源加载方式都不变.
- 只是新增了将 xxx.spriteatlas 打成 ab. 然后运行时回调 atlasRequested 加载这个 ab 回传给 引擎 即可.
资源对比
新打包方式
图集 ab
cards.assetbundle.manifest 里面记录了引用的 图片文件夹 ab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20...
Assets:
- Assets/Res/SpriteAtlas/cards.spriteatlas
Dependencies:
- E:/its/tdmj_itc/patch/temp_patch_root/tdmj/common/resource/assets/res/ui/atlas/cards.assetbundle
2. 图片文件夹 ab
![](https://pic05.wilker.cn/20220110201306-089.webp)
- *cards.assetbundle.manifest* 里面记录了引用的 图片资源
```json
...
Assets:
- Assets/Res/UI/Atlas/cards/11.png
- Assets/Res/UI/Atlas/cards/15.png
Dependencies: []
AssetStudio 分析 cards
unity profiler 中内存快照
多出来几个 xxx.spriteatlas 所在 ab
旧打包方式
图片文件夹 ab
cards.assetbundle.manifest 里面记录了引用的 图片资源
1
2
3
4
5
6...
Assets:
- Assets/Res/UI/Atlas/cards/11.png
- Assets/Res/UI/Atlas/cards/15.png
Dependencies: []AssetStudio 分析 cards
结论
AssetStudio 可以看出, 新的方式的 图集是打到 xxx.spriteatlas 所在的 ab 中.
unity profiler 中内存快照看到多出了
使用新的 SpriteAtlas 图集方式可以随时预览某个图集