public static string[] Export(AtlasRaw atlas, SpriteRaw[] sprites, string folder) { var exportSprites = new string[sprites.Length]; var atlasSprites = sprites.Select(i => PackAtlasSprite.ParseSprite(atlas.bins[i.bin], i)).ToArray(); PackUtil.LoadAtlasTextures(atlasSprites); for (int i = 0; i < atlasSprites.Length; i++) { var sprite = atlasSprites[i]; var rect = sprite.rect; var texture = PackUtil.CreateBlankTexture((int)rect.width, (int)rect.height, sprite.transparency ? TextureFormat.RGBA32 : TextureFormat.RGB24); texture.SetPixels(sprite.Read()); var bytes = sprite.transparency ? texture.EncodeToPNG() : texture.EncodeToJPG(); var path = Path.Combine(folder, sprite.name) + (sprite.transparency ? ".png" : ".jpg"); var dir = Path.GetDirectoryName(path); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } File.WriteAllBytes(path, bytes); exportSprites[i] = path; if (EditorUtility.DisplayCancelableProgressBar("", "export: " + sprite.name, (float)i / sprites.Length)) { break; } } EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); return(exportSprites); }
protected virtual BinRaw[] PackSprites(PackSetting setting, IPackSprite[] sprites) { var textures = sprites.Select(sprite => new Packer.Area((int)sprite.rect.width, (int)sprite.rect.height)).ToArray(); var spriteRaws = new List <SpriteRaw>(); var packers = new List <Packer>(); var sizeList = PackConst.AtlasSizeList; var maxSize = setting.maxAtlasSize; var padding = setting.padding; var isPOT = forcePowerOf2 || setting.isPOT; var forceSquare = this.forceSquare || setting.forceSquare; var index = 0; while (index < textures.Length) { var texArea = textures[index]; Packer.Rect texRect = null; for (int i = 0; i < packers.Count; i++) { var packer = packers[i]; while (true) { if (packer.Push(texArea, out texRect)) { spriteRaws.Add(new SpriteRaw() { bin = i, rect = new Rect(texRect.x, texRect.y, texRect.width, texRect.height), }); break; } var width = packer.bin.width; var height = packer.bin.height; if (forceSquare) { width *= 2; height *= 2; } else { if (width > height) { height *= 2; } else { width *= 2; } } if (width > maxSize || height > maxSize) { break; } packer.Extend(new Packer.Bin(width, height)); } if (texRect != null) { break; } } if (texRect == null) { packers.Add(new Packer(Packer.Algorithm.AdvancedHorizontalSkyline, new Packer.Bin(sizeList[0], sizeList[0]), padding)); } else { index += 1; } } var bins = new BinRaw[packers.Count]; for (int i = 0; i < packers.Count; i++) { bins[i] = new BinRaw(); bins[i].size = !isPOT && !forceSquare ? Vector2.zero : new Vector2(packers[i].bin.width, packers[i].bin.height); } if (!isPOT && !forceSquare) { for (int i = 0; i < spriteRaws.Count; i++) { var sprite = spriteRaws[i]; var bin = bins[sprite.bin]; bin.size = new Vector2( Mathf.Max(bin.size.x, sprite.rect.xMax), Mathf.Max(bin.size.y, sprite.rect.yMax)); } if (forceMultiplyOf4) { foreach (var bin in bins) { bin.size = new Vector2( Mathf.CeilToInt(bin.size.x / 4) * 4, Mathf.CeilToInt(bin.size.y / 4) * 4); } } } for (int i = 0; i < sprites.Length; i++) { var sprite = sprites[i]; var spriteRaw = spriteRaws[i]; spriteRaw.name = sprite.name.Replace("\\", "/"); spriteRaw.border = sprite.border; spriteRaw.pivot = sprite.pivot; var rect = spriteRaw.rect; var binRaw = bins[spriteRaw.bin]; binRaw.sprites = binRaw.sprites ?? new SpriteRaw[0]; Array.Resize(ref binRaw.sprites, binRaw.sprites.Length + 1); binRaw.sprites[binRaw.sprites.Length - 1] = spriteRaw; var main = binRaw.main; var add = binRaw.addition; var colors = sprite.Read(); if (main == null) { main = PackUtil.CreateBlankTexture((int)binRaw.size.x, (int)binRaw.size.y, !alphaSplit && transparency ? TextureFormat.RGBA32 : TextureFormat.RGB24); main.hideFlags = HideFlags.DontUnloadUnusedAsset; binRaw.main = main; } main.SetPixels( (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, colors); if (alphaSplit && transparency) { if (add == null) { add = PackUtil.CreateBlankTexture((int)binRaw.size.x, (int)binRaw.size.y, TextureFormat.RGB24); add.hideFlags = HideFlags.DontUnloadUnusedAsset; binRaw.addition = add; } for (int c = 0; c < colors.Length; c++) { colors[c] = new Color(colors[c].a, 0, 0); } add.SetPixels( (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, colors); } } return(bins); }