欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程

程序员文章站 2024-03-25 08:43:46
...

SpriteAtlas是Unity新出的一个功能,用来取代旧版的Sprite Packer。

图集打包的意义:

  1. 减少DrawCall
  2. 图集将图片打包为2的幂次方的素材大小,可以提升性能
  3. 减小包体大小

Sprite Packer(旧版本)缺点:

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

Sprite Packer可参照我写的另外一个文章

新版Sprite Atlas如何使用:

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

【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程

2、创建图集

在Project窗口右键,Create->Sprite Atlas或者 Asset -> Create -> Sprite Atlas

【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程

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.html
Objects For Packing 包装好的地图集中要包含的对象。文件夹,纹理或单个图片可以添加到列表中。

4、添加图片到图集

可以将文件夹,纹理或精灵指定给Sprite Atlas。可以将整个文件夹分配给Sprite Atlas资产,该文件夹中的所有纹理(包括子文件夹)都将打包。分配单个纹理时,将包括所有定义的精灵。也可以将单个精灵指定给地图集,并且不会考虑同一Texture中的其他精灵。

【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程

  1. 要将图片打包进图集,请选择Atlas资产,然后通过点击+号添加到列表或将其从“Project”窗口拖放到列表区域来添加它们。您可以将文件夹,纹理,精灵添加到地图集。

  2. 为生成的图集设置所需的设置。更改设置将始终将此地图集标记为已修改,并且将在打包阶段再次打包。

  3. 可以通过按检查器中的“Pack Preview”按钮预览打包的图集。这将触发此地图集的打包。一旦打包完成,纹理将出现在预览部分。

  4. 在进入“播放模式”之前,将重新打包了所有修改了设置的图集(如果选择了“ 始终启用”)。

5、高清/低清资源切换

创建新的Sprite Atlas,然后设置Type为变种(Variant)类型,并设置关联的Master Atlas,修改Scale即可改变分辨率。

【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程

使用代码访问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