Processo de criação do atlas Unity SpriteAtlas, problemas encontrados e soluções
1. Crie um atlas
Use SpriteAtlas no Unity para criar atlas correspondentes para os recursos de textura do jogo necessários.
/// <summary>
/// 根据贴图资源路径创建对应的图集资源
/// </summary>
/// <param name="atlasName">贴图资源路径</param>
private static void CreateSpriteAtlas(string atlasName)
{
SpriteAtlas atlas = new SpriteAtlas();
var atlasPath = "Assets/Resources/Atlas/" + atlasName + ".spriteatlas";
SpriteAtlasPackingSettings packingSetting = new SpriteAtlasPackingSettings()
{
enableRotation = false,
enableTightPacking = false,
padding = 4,
};
atlas.SetPackingSettings(packingSetting);
var pathArr = Directory.GetFiles("Assets/ResourcesLib/Atlas/" + atlasName + "/");
var spriteList = new List<Sprite>();
for (int i = 0; i < pathArr.Length; i++)
{
//不需要.meta文件打进图集之中
if (Path.GetExtension(pathArr[i]) == ".meta")
continue;
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(pathArr[i]);
if (sprite != null)
{
spriteList.Add(sprite);
}
}
atlas.Add(spriteList.ToArray());
//创建对应的资源
AssetDatabase.CreateAsset(atlas, atlasPath);
}
2. Problemas encontrados
Os recursos de textura não estão incluídos no pacote. Se você abrir o atlas no modo de texto, descobrirá que a matriz de m_PackedSprites e a matriz de m_PackedSpriteNamesToIndex no texto estão vazias, sem valores nelas. Essas duas variáveis sem valores são usados. Não há recurso de textura correspondente.
3.Solução
Usei a própria interface do Unity, SpriteAtlasUtility.PackAtlases(spriteAtlases.ToArray(), activeBuildTarget,true) para chamar novamente a interface no atlas gerado e exportar os parâmetros variáveis correspondentes, e o atlas foi usado com sucesso.
/// <summary>
/// 给图集资源创建m_PackedSprites和m_PackedSpriteNamesToIndex数据
/// </summary>
/// <param name="arr">图集路径</param>
public static void CreateSpriteAltasPackedSprites(object[] arr)
{
SpriteAtlas[] spriteAtlas = new SpriteAtlas[arr.Length];
for (int i = 0; i < arr.Length; i++)
{
spriteAtlas[i]= arr[i] as SpriteAtlas;
}
//自动生成图集的接口
#if UNITY_WEBGL
SpriteAtlasUtility.PackAtlases(spriteAtlas,BuildTarget.WebGL);
#else
SpriteAtlasUtility.PackAtlases(spriteAtlas,BuildTarget.StandaloneWindows);
#endif
}
A descrição acima é a solução para o problema que encontrei ao imprimir um atlas com SpriteAtlas.Gostaria de agradecer ao autor da solução (antiwb3) por me ajudar a resolver o problema
https://zhuanlan.zhihu.com/p/357822794