赞
踩
Unity中的图集(Sprite Atlas)是一种用于优化游戏性能和内存的纹理集。Sprite Atlas 可以应用于 2D 和 3D 项目中的 UI、粒子系统、贴图等等。
使用Unity可以很方便地创建Sprite Atlas,只需要创建一个Sprite Atlas GameObject,然后将纹理分配给它。在创建Sprite Atlas时,需要将纹理名称按角色或功能组织好,并设置好导入设置。随着纹理的添加,Unity会自动按照最优布局将它们分配到Sprite Atlas上,以便GPU可以批量处理而不是单独处理它们。而如果纹理不能完全填充Sprite Atlas,则可以将多个Sprite Atlas组合在一起以最大化空间利用。
在Unity 2D的项目中,在Project面板中Assets文件夹处右键Create → 2D → Sprite Atlas,创建一个Sprite Atlas。
在Unity 3D的项目中,需要在设置中开启图集,在Project面板中才能创建Sprite Atlas。
菜单栏Edit → Project Settings → 左侧栏找到Editor → 右侧找到Sprite Packer,其中Mode属性根据需要进行选择(默认是Disabled)。
另外,还需要安装2D Sprite包,菜单栏Window → Package Manager:
包安装完成后,也是同样的方法创建Sprite Atlas:
在Project面板中点击新建的Sprite Atlas,观察其Inspector面板的属性:
Type:Master或Variant。将 Master Sprite Atlas 和 Variant Sprite Atlas 相结合可以极大地简化 2D 游戏资源的管理。
Master:Master Sprite Atlas 包含一组 Sprite,以及所有 Sprite 公用的纹理信息。在创建和编辑 Master Sprite Atlas 时,不需要考虑具体的解析度或平台,只需要将 Sprite 以及 Sprite 的纹理材质添加到其中即可。Master Sprite Atlas 中将 Sprite 打包到同一个纹理中,来增加 Sprite 的渲染效率。
Variant:Variant Sprite Atlas 利用 Master Sprite Atlas,并将其分配给不同的平台或解析度,生成各种不同的纹理变体。Variant Sprite Atlas 由预配置的 Platform-specific Sprite Atlas 生成,这些预配置可能考虑到最终运行的平台和设备。其中,修改Scale可改变Sprite Atlas的分辨率。
Include in Build:是否将 Sprite Atlas 包含在构建中。
Allow Rotation:是否允许旋转 Sprite。
Tight Packing:是否启用精确包装技术。
Alpha Dilation:是否应用 Alpha Dilation 过滤。这对于提高 Sprite 的渲染质量非常有用,例如,在精灵放大时防止出现锯齿状的边缘。
Padding:设置打包 Sprites 时的填充量,用于控制 Sprites 相互之间的距离,避免 Atlas 中 Sprites 之间相互重叠或发生边角过渡, 可以设置为 2、4 或 8 像素。
Read/Write:是否允许 Sprite Atlas 中纹理的读写操作。
Generate Mip Maps:是否生成 Mipmap。
sRGB: 是否启用 sRGB 格式。
Filter Mode:设置 Sprite Atlas 的纹理过滤模式,可以选择Trilinear、Bilinear 或 Point。
Show Platform Settings For:指定各个平台的配置。可以设置各个平台支持的纹理分辨率、最大 Sprite 尺寸等。
Objects for Packing:将 Sprite Atlas 的 Sprites 打包到哪个 Atlas 中。
Pack Preview:点击该按钮即可显示 Unity 将如何布置 Sprite 的预览。
Sprite Atlas 提供了一些接口,可以方便地创建、管理和访问 Sprites,以下是 Sprite Atlas 的常用访问接口示例,参考API接口-SpriteAtlasExtensions:
using UnityEditor; using UnityEditor.U2D; using UnityEngine; using UnityEngine.U2D; public class AtlasAPI : MonoBehaviour { public Texture2D[] textures; // 存储图片的数组 // Start is called before the first frame update void Start() { // 创建 SpriteAtlas SpriteAtlas spriteAtlas = new SpriteAtlas(); // 将图片添加到 SpriteAtlas foreach (Texture2D texture in textures) { // 创建 Sprite 对象 Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); // 添加到 SpriteAtlas 中 spriteAtlas.Add(new Sprite[] { sprite }); } // 将创建的 SpriteAtlas 保存为 .spriteatlas 文件 AssetDatabase.CreateAsset(spriteAtlas, "Assets/NewSpriteAtlas.spriteatlas"); AssetDatabase.Refresh(); // 获取当前平台的名称 spriteAtlas.GetPlatformSettings(GetPlatformName(EditorUserBuildSettings.activeBuildTarget)); // 修改对应平台上的图集设置 spriteAtlas.SetPlatformSettings(new TextureImporterPlatformSettings { maxTextureSize = 2048, textureCompression = TextureImporterCompression.CompressedHQ, format = TextureImporterFormat.Automatic, }); } 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; } }
以下是一些使用 Sprite Atlas 优化游戏的建议:
将相同尺寸和类型的 Sprite 放在同一个 Sprite Atlas 中。
压缩 Sprite 像素格式。
允许旋转 Sprite 会增加 Sprite Atlas 中可以打包的精灵数量。
确保 Sprite Atlas 大小不会超过硬件设备支持的最大纹理大小。
在运行时按需异步加载和卸载 Sprite Atlas。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。