Baste 发表于 2022-11-15 15:15

2022/9/1 unity 图集(SpriteAtlas)

SpriteAtlas是Unity新出的一个功能,用来取代旧版的Sprite Packer。
图集打包的意义:


[*]减少DrawCall
[*]图集将图片打包为2的幂次方的素材大小,可以提升性能
[*]减小包体大小
SPRITE PACKER(旧版本)缺点:

旧版Sprite Packer在性能和易用性上对比Sprite Atlas存在诸多不足,比如无法分别对不同图集修改不同质量、无法获取图集里的图片等等。
新版SPRITE ATLAS如何使用:

1、Edit-Project Setting-Editor/SpritePacker打开设置(设置为Enabled For Builds或者Always Enabled,第二三项是SpritePacker使用的)


2、创建图集
在Project窗口右键,Create->Sprite Atlas或者 Asset -> Create -> Sprite Atlas



3、属性面板介绍
属性功能Type将图集的类型设置为“主图集”或“变体图集”。Include in build始终在构建中包括Atlas资产。Allow Rotation允许旋转精灵进行包装Tight Packing非矩形包装Read/Write Enabled如果要从脚本读取纹理数据,请将其设置为true。将其设置为false可以防止脚本读取纹理数据。Generate Mip Maps选择此选项可启用Mip-Map生成。Mip贴图是Texture的较小版本,当Texture在屏幕上很小时会使用。Filter Mode选择如何过滤纹理Platform-specific overrides panel使用特定于平台的替代面板设置默认选项(使用默认),然后使用面板顶部的按钮针对特定平台替代它们。https://docs.unity3d.com/Manual/class-TextureImporterOverride.htmlObjects For Packing包装好的地图集中要包含的对象。文件夹,纹理或单个图片可以添加到列表中。4、添加图片到图集
可以将文件夹,纹理或精灵指定给Sprite Atlas。可以将整个文件夹分配给Sprite Atlas资产,该文件夹中的所有纹理(包括子文件夹)都将打包。分配单个纹理时,将包括所有定义的精灵。也可以将单个精灵指定给地图集,并且不会考虑同一Texture中的其他精灵。




[*]要将图片打包进图集,请选择Atlas资产,然后通过点击+号添加到列表或将其从“Project”窗口拖放到列表区域来添加它们。您可以将文件夹,纹理,精灵添加到地图集。
[*]为生成的图集设置所需的设置。更改设置将始终将此地图集标记为已修改,并且将在打包阶段再次打包。
[*]可以通过按检查器中的“Pack Preview”按钮预览打包的图集。这将触发此地图集的打包。一旦打包完成,纹理将出现在预览部分。
[*]在进入“播放模式”之前,将重新打包了所有修改了设置的图集(如果选择了“ 始终启用”)。


5、高清/低清资源切换
创建新的Sprite Atlas,然后设置Type为变种(Variant)类型,并设置关联的Master Atlas,修改Scale即可改变分辨率。


使用代码访问SPRITE ATLAS接口

1、创建Sprite Atlas
    var spriteAtlas=new SpriteAtlas();
    AssetDatabase.CreateAsset(spriteAtlas, "Assets/sample.spriteatlas");
2、添加图片到Sprite Atlas图集
   var spriteAtlas=new SpriteAtlas();
   var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
   List<Object> packables = new List<Object>(spriteAtlas.GetPackables());
   if (!packables.Contains(sprite))
   {
        spriteAtlas.Add(new Object[] {sprite});
   }
3、改变默认Sprite Atlas图集设置(Max Texture Size、Format、Compression)
   var spriteAtlas=new SpriteAtlas();
    var atlasSetting = spriteAtlas.GetPlatformSettings("DefaultTexturePlatform");
    atlasSetting.maxTextureSize = 4096;
    atlasSetting.textureCompression = TextureImporterCompression.CompressedHQ;
    atlasSetting.format = TextureImporterFormat.RGBA32;
    spriteAtlas.SetPlatformSettings(atlasSetting);
4、改变不同平台图集设置
spriteAtlas.GetPlatformSettings支持的参数名有 "Standalone", "Web", "iPhone", "Android", "WebGL",      "Windows Store Apps", "PS4", "PSM", "XboxOne", "Nintendo 3DS" and "tvOS"
void Test()
{
var spriteAtlas=new SpriteAtlas();
var atlasSetting =                              spriteAtlas.GetPlatformSettings(GetPlatformName(EditorUserBuildSettings.activeBuildTarget));
        atlasSetting.maxTextureSize = 4096;
        atlasSetting.textureCompression = TextureImporterCompression.CompressedHQ;
        atlasSetting.format = TextureImporterFormat.RGBA32;
        spriteAtlas.SetPlatformSettings(atlasSetting);
}
string GetPlatformName(BuildTarget target)
{
string platformName = "";
switch (target)
        {
case BuildTarget.Android:
                        platformName = "Android";
break;
case BuildTarget.iOS:
                        platformName = "iPhone";
break;
case BuildTarget.PS4:
                        platformName = "PS4";
break;
case BuildTarget.XboxOne:
                        platformName = "XboxOne";
break;
case BuildTarget.NoTarget:
                        platformName = "DefaultTexturePlatform";
break;
default:
                        platformName = "Standalone";
break;
        }
return platformName;
}
5、更多API可参考官网API
重点
Include in Build
按字面理解,是打包时图集是否被包含到资源中。
在编辑器状态下,如果勾选了“Include in Build”,相当于系统直接使用图集文件,进测试发现:

不选中InClude in Build
在root\Library\AtlasCache\xx\不会生成在大图集缓存aa,每次加载的AssetBundle包里含有图集资源时,会触发SpriteAtlasManager.atlasRequested,此时需要手动处理触发回调函数里收到资源名后自行加载图集目录资源(打包后的资源目录)

选中InClude in Build
在root\Library\AtlasCache\xx\会生成在大图集缓存,每次加载的AssetBundle包里含有图集资源时,会先从原始图集资源目录里获取资源,之后如下判断:

如果存在且获取正确则生成大图集缓存资源aa在root\Library\AtlasCache\xx\目录下;

如果原始图集资源目录获取不到正确资源,则会触发SpriteAtlasManager.atlasRequested,此时需要手动处理触发回调函数里收到资源名后自行加载图集目录资源(打包后的资源目录),且不会生成大图集缓存资源。

当在编辑器状态下,图集中的元素被改变时,在运行时图集会自动重新打包,打包完成加载到缓存中,我们在编辑窗口和运行窗口看到的图片元素都是最新的。

如果编辑器状态下不勾选,则需要代码动态加载SpriteAtlasManager.atlasRequested,一般来说我们动态加载的文件是AB包,当我们图片原文件修改时,图集的AB包还未更新,则出现编辑窗口是新的图片,运行窗口还加载老的AB包,显示的是老图。
建议在开发环境下勾选图集中的“Include in Build”,在打包时,不勾选。
注意AB包,在切换勾选后,需要重新生成。
页: [1]
查看完整版本: 2022/9/1 unity 图集(SpriteAtlas)