Herramienta de generación automática Unity SpriteAtlas (atlas)
¿Qué es un atlas?
Un atlas es un recurso que combina múltiples texturas en una textura combinada. Se puede llamar a esta textura única para emitir una única llamada de dibujo en lugar de emitir múltiples llamadas de dibujo, lo que permite un acceso único a la textura comprimida con una pequeña sobrecarga de rendimiento.
¿Por qué hacer un atlas?
- Reduzca DrawCall, solo se necesita un DrawCall para un atlas
- El atlas combina una o más imágenes en una potencia de 2 para reducir el tamaño del recurso.
- Obviamente, es más apropiado entregar todas las operaciones de dibujo mostradas a la GPU, que se especializa en el procesamiento de imágenes, que a la CPU, para que la CPU inactiva pueda concentrarse en procesar las operaciones lógicas del juego.
Cosas a tener en cuenta al hacer un atlas
- No coloque los recursos de imágenes que deben incluirse en el atlas en la carpeta Recursos, porque los recursos de esta carpeta no se incluirán en el atlas y esto también duplicará el tamaño de los recursos.
Generar automáticamente el código fuente de la herramienta Atlas
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.U2D;
namespace S
{
public class AutoAtlas
{
static SpriteAtlasPackingSettings packSetting = new SpriteAtlasPackingSettings()
{
blockOffset = 1,
padding = 2,
enableRotation = false,
enableTightPacking = false
};
private static SpriteAtlasTextureSettings textureSetting = new SpriteAtlasTextureSettings()
{
sRGB = true,
filterMode = FilterMode.Bilinear,
};
private static TextureImporterPlatformSettings importerSetting = new TextureImporterPlatformSettings()
{
maxTextureSize = 2048,
compressionQuality = 50,
};
[MenuItem("Assets/创建图集", false, 19)]
static void CreateAtlas()
{
var select = Selection.activeObject;
var path = AssetDatabase.GetAssetPath(select);
CreateAtlasOfAssetDir(path);
}
public static void CreateAtlasOfAssetDir(string dirAssetPath)
{
if (string.IsNullOrEmpty(dirAssetPath) || Path.HasExtension(dirAssetPath))
{
Debug.LogError("当前选中对象不是文件夹,请选择对应文件夹重新创建图集");
return;
}
SpriteAtlas atlas = new SpriteAtlas();
atlas.SetPackingSettings(packSetting);
atlas.SetTextureSettings(textureSetting);
atlas.SetPlatformSettings(importerSetting);
var atlasPath = $"{dirAssetPath}/New Atlas.spriteatlas";
TryAddSprites(atlas, dirAssetPath);
AssetDatabase.CreateAsset(atlas, atlasPath);
AssetDatabase.SaveAssets();
Selection.activeObject = AssetDatabase.LoadAssetAtPath<Object>(atlasPath);
}
static void TryAddSprites(SpriteAtlas atlas, string dirPath)
{
string[] files = Directory.GetFiles(dirPath);
if (files == null || files.Length == 0) return;
Sprite sprite;
List<Sprite> spriteList = new List<Sprite>();
foreach (var file in files)
{
if (file.EndsWith(".meta")) continue;
sprite = AssetDatabase.LoadAssetAtPath<Sprite>(file);
if (sprite == null) continue;
spriteList.Add(sprite);
}
if (spriteList.Count > 0) atlas.Add(spriteList.ToArray());
}
}
}
Instrucciones
- Seleccione la carpeta
- Clic derecho->Crear álbum
- La creación es exitosa y todas las imágenes de sprites en la carpeta seleccionada se ingresan en el álbum recién creado.