예제 #1
0
        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);
        }
예제 #2
0
        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);
        }