private static void CreateAtlasRaw() { var path = AssetDatabase.GetAssetPath(Selection.activeObject); path = string.IsNullOrEmpty(path) ? "Assets" : path; if (File.Exists(path)) { path = Path.GetDirectoryName(path); } var atlas = CreateInstance <AtlasRaw>(); atlas.bins = new BinRaw[0]; var setting = new PackSetting(); atlas.maxSize = setting.maxAtlasSize; atlas.padding = setting.padding; atlas.isPOT = setting.isPOT; atlas.forceSquare = setting.forceSquare; var assetPath = Path.Combine(path, PackConst.DefaultAtlasAssetName); assetPath = AssetDatabase.GenerateUniqueAssetPath(assetPath); atlas.id = PackUtil.GenerateAtlasId(); AssetDatabase.CreateAsset(atlas, assetPath); Selection.activeObject = AssetDatabase.LoadAssetAtPath <AtlasRaw>(assetPath); }
public AtlasRaw GenerateAtlas() { if (sprites.Length > PackConst.MaxNumberOfSpriteInAtlas) { Debug.LogError(string.Format("Sprites in excess of {0}.", PackConst.MaxNumberOfSpriteInAtlas)); return(null); } for (int i = 0; i < sprites.Length; i++) { var texName = sprites[i].name; var texRect = sprites[i].rect; if (texRect.width > setting.maxAtlasSize || texRect.height > setting.maxAtlasSize) { Debug.LogError(string.Format("Texture size should be lower than {0}: {1}.", setting.maxAtlasSize, texName)); return(null); } } var atlasSprites = sprites.Where(i => i is PackAtlasSprite).Select(i => i as PackAtlasSprite).ToArray(); PackUtil.LoadAtlasTextures(atlasSprites); var groups = sprites.GroupBy(texture => new { texture.quality, texture.transparency }) .OrderBy(group => group.Key.quality) .ThenBy(group => group.Key.transparency); var bins = groups.Select(group => { var groupQuality = group.Key.quality; var groupTransparency = group.Key.transparency; var groupSprites = group.ToArray(); var groupProcessor = PackProcessor.Fetch(groupQuality); groupProcessor.Setup(setting, groupSprites, groupTransparency); var groupBins = groupProcessor.Execute(); foreach (var groupBin in groupBins) { groupBin.quality = (int)groupQuality; } return(groupBins); }).SelectMany(i => i).ToArray(); for (int i = 0; i < bins.Length; i++) { foreach (var sprite in bins[i].sprites) { sprite.bin = i; } } var atlasRaw = AssetDatabase.LoadAssetAtPath <AtlasRaw>(atlasPath); var atlasExist = atlasRaw != null; if (atlasExist) { RemoveAtlasTextures(atlasRaw); } else { atlasRaw = ScriptableObject.CreateInstance <AtlasRaw>(); } atlasRaw.hideFlags = HideFlags.DontUnloadUnusedAsset; atlasRaw.bins = bins; atlasRaw.maxSize = setting.maxAtlasSize; atlasRaw.padding = setting.padding; atlasRaw.isPOT = setting.isPOT; atlasRaw.forceSquare = setting.forceSquare; if (atlasRaw.id == 0) { atlasRaw.id = PackUtil.GenerateAtlasId(); } CreateAtlasTextures(atlasRaw); if (atlasExist) { EditorUtility.SetDirty(atlasRaw); AssetDatabase.SaveAssets(); } else { AssetDatabase.CreateAsset(atlasRaw, atlasPath); } return(atlasRaw); }