private void AddFiles(AtlasRaw atlas, PackQuality quality, string[] files, bool replaceSpriteByName = true) { var textures = new List <IPackSprite>(PackAtlasSprite.ListSprites(atlas)); Action <IPackSprite> addTexture = (texture) => { if (replaceSpriteByName) { for (int i = textures.Count - 1; i >= 0; i--) { if (textures[i].name.Equals(texture.name)) { textures.RemoveAt(i); } } } textures.Add(texture); }; foreach (var file in files) { if (File.Exists(file)) { var texture = new PackAssetSprite(file); texture.name = Path.GetFileNameWithoutExtension(file); texture.quality = quality; addTexture(texture); } else if (Directory.Exists(file)) { var images = new List <string>(); images.AddRange(Directory.GetFiles(file, "*.png", SearchOption.AllDirectories)); images.AddRange(Directory.GetFiles(file, "*.jpg", SearchOption.AllDirectories)); foreach (var image in images) { var assetPath = image.Replace(file + "\\", "").Replace("\\", "/"); var assetDir = Path.GetDirectoryName(assetPath); var assetName = Path.GetFileNameWithoutExtension(assetPath); var assetLabel = string.IsNullOrEmpty(assetDir) ? assetName : assetDir + "/" + assetName; var texture = new PackAssetSprite(image) { name = assetLabel, quality = quality }; addTexture(texture); } } } AtlasPacker.Repack(atlas, textures.ToArray()); }
private static void MapSprite2Atlas(string targetFolder, PackSetting setting, List <UnityEngine.UI.Sprite> sprites) { var spritePaths = new List <string>(); foreach (var sprite in sprites) { if (sprite != null && sprite.type == UnityEngine.UI.Sprite.Type.Sprite) { var path = AssetDatabase.GetAssetPath(sprite.sprite); if (!string.IsNullOrEmpty(path) && !spritePaths.Contains(path)) { spritePaths.Add(path); } } } var pathSpriteMap = new Dictionary <string, UnityEngine.UI.Sprite>(); var spriteGroups = spritePaths.GroupBy(path => { var importer = AssetImporter.GetAtPath(path) as TextureImporter; return(importer.spritePackingTag); }); foreach (var group in spriteGroups) { var groupPaths = group.ToArray(); var groupNames = Util.MapSpritePath2SpriteNameInAtlas(groupPaths); var groupSprites = new PackAssetSprite[groupPaths.Length]; for (int i = 0; i < groupPaths.Length; i++) { groupSprites[i] = new PackAssetSprite(groupPaths[i]) { name = groupNames[i] }; groupSprites[i].quality = PackUtil.CheckTextureCompressed(groupPaths[i]) ? PackQuality.AlphaSplit : PackQuality.Full; } var groupTag = string.IsNullOrEmpty(group.Key) ? EmptyTagName : group.Key; var groupFolder = Path.Combine(targetFolder, groupTag); if (!Directory.Exists(groupFolder)) { Directory.CreateDirectory(groupFolder); } var atlasRaw = AtlasPacker.Pack(groupFolder, groupSprites, setting); for (int i = 0; i < groupPaths.Length; i++) { pathSpriteMap[groupPaths[i]] = new UnityEngine.UI.Sprite(atlasRaw, groupNames[i]); } } ; for (int i = 0; i < sprites.Count; i++) { var sprite = sprites[i]; if (sprite != null && sprite.type == UnityEngine.UI.Sprite.Type.Sprite) { var path = AssetDatabase.GetAssetPath(sprite.sprite); if (!string.IsNullOrEmpty(path)) { sprites[i] = pathSpriteMap[path]; } } } }