コード例 #1
0
        void GenerateScript()
        {
            TileAtlas atlas = target as TileAtlas;

            string className = Path.GetFileNameWithoutExtension(scriptProjectPath);

            string copyPath = "Assets/" + scriptProjectPath;

            using (StreamWriter outfile = new StreamWriter(copyPath)) {
                outfile.WriteLine("// AUTOMATICALLY GENERATED. DO NOT EDIT MANUALLY.");
                outfile.WriteLine("");
                outfile.WriteLine("using UnityEngine;");
                outfile.WriteLine("using System;");
                outfile.WriteLine("using System.Collections;");
                outfile.WriteLine("");
                outfile.WriteLine("using Gridlike;");
                outfile.WriteLine("");
                outfile.WriteLine("[Serializable]");
                outfile.WriteLine("public class " + className + " : TileAtlasHelper {");
                outfile.WriteLine("");
                outfile.WriteLine("\tpublic static " + className + " helper;");
                outfile.WriteLine("\tpublic static TileAtlas atlas { get { return helper._atlas; } }");
                outfile.WriteLine("");
                outfile.WriteLine("\tpublic " + className + "() {");
                outfile.WriteLine("\t\thelper = this;");
                outfile.WriteLine("\t}");
                outfile.WriteLine("");

                foreach (TileInfo tile in atlas.GetTileInfos())
                {
                    outfile.WriteLine("\tpublic const int " + tile.name.Replace(" ", "_").ToUpper() + " = " + tile.id + ";");
                }

                outfile.WriteLine("}");
            }
            AssetDatabase.Refresh();

            atlas.helperMajorVersion = atlas.majorVersion;
            atlas.helperMinorVersion = atlas.minorVersion;
        }
コード例 #2
0
        public override void OnInspectorGUI()
        {
            TileAtlas atlas = target as TileAtlas;

            atlas.useRelativePath = EditorGUILayout.Toggle("Paths are relative", atlas.useRelativePath);

            if (GUILayout.Button("bump minor"))
            {
                atlas.BumpMinor();
            }
            if (GUILayout.Button("bump major"))
            {
                atlas.BumpMajor();
            }

            GUI.enabled = false;
            EditorGUILayout.ObjectField("Sprite sheet", atlas.spriteSheet, typeof(Texture2D), false);
            GUI.enabled = true;

            atlas.material = EditorGUILayout.ObjectField("Material", atlas.material, typeof(Material), false) as Material;
            if (atlas.material == null)
            {
                atlas.material = new Material(Shader.Find("Sprites/Default"));
            }
            atlas.material.mainTexture = atlas.spriteSheet;

            // SPRITE SHEET PATH
            atlas.spriteSheetPath = EditorGUILayout.TextField("Sprite sheet path", atlas.spriteSheetPath);
            if (string.IsNullOrEmpty(atlas.spriteSheetPath))
            {
                atlas.spriteSheetPath = "sprite_sheet.png";
            }
            else
            {
                if (!atlas.spriteSheetPath.EndsWith(".png"))
                {
                    atlas.spriteSheetPath += ".png";
                }
            }

            // TILE PIXEL SIZE
            atlas.tilePixelSize = EditorGUILayout.IntField("Tile pixel size", atlas.tilePixelSize);
            atlas.tilePixelSize = Mathf.Clamp(atlas.tilePixelSize, 1, 1024);

            if (atlas.majorVersion != atlas.spriteSheetMajorVersion)
            {
                EditorGUILayout.HelpBox("Sprite sheet is outdated. It requires regeneration", MessageType.Error);
            }
            else if (atlas.minorVersion != atlas.spriteSheetMinorVersion)
            {
                EditorGUILayout.HelpBox("Sprite sheet is outdated. It requires regeneration", MessageType.Warning);
            }
            else
            {
                EditorGUILayout.HelpBox("Sprite sheet is up to date", MessageType.Info);
            }

            if (GUILayout.Button("Generate sprite sheet"))
            {
                GenerateSpriteSheet();
            }

            // HELPER SCRIPT
            atlas.scriptPath = EditorGUILayout.TextField("Script path", atlas.scriptPath);
            if (string.IsNullOrEmpty(atlas.scriptPath))
            {
                atlas.scriptPath = atlas.name + "Script.cs";
            }
            else
            {
                if (!atlas.scriptPath.EndsWith(".cs"))
                {
                    atlas.scriptPath += ".cs";
                }
            }

            if (atlas.majorVersion != atlas.helperMajorVersion)
            {
                EditorGUILayout.HelpBox("Helper is outdated. It requires regeneration", MessageType.Error);
            }
            else if (atlas.minorVersion != atlas.helperMinorVersion)
            {
                EditorGUILayout.HelpBox("Helper is outdated. It requires regeneration", MessageType.Warning);
            }
            else
            {
                EditorGUILayout.HelpBox("Helper is up to date", MessageType.Info);
            }

            if (GUILayout.Button("Generate script"))
            {
                GenerateScript();
            }

            foreach (TileInfo info in atlas.GetTileInfos())
            {
                TileInfoUI(atlas, info);
            }

            if (GUILayout.Button("Create new tile"))
            {
                atlas.AddTile();

                atlas.BumpMinor();
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(target);
            }
        }
コード例 #3
0
        void GenerateSpriteSheet()
        {
            TileAtlas atlas = target as TileAtlas;

            EditorUtility.DisplayProgressBar("Gridlike", "Generating tile atlas sprite sheet", 0);

            int tilePixelSize = atlas.tilePixelSize;

            int tileCount     = atlas.TotalSpriteTileCount;
            int tilePerRow    = Mathf.Clamp(Mathf.FloorToInt(Mathf.Sqrt(tileCount * 4)), 2, TileAtlas.MAX_SPRITE_SHEET_SIZE / tilePixelSize);
            int tilePerColumn = tilePerRow;

            Texture2D texture = new Texture2D(tilePerRow * tilePixelSize, tilePerColumn * tilePixelSize);

            Color[] colors = texture.GetPixels();
            for (int i = 0; i < colors.Length; i++)
            {
                colors [i] = Color.clear;
            }
            texture.SetPixels(colors);

            SpriteMetaData[] sprites = new SpriteMetaData[atlas.SpriteCount + 1];

            int tileX = 0;
            int tileY = 0;

            int spriteInd = 0;

            // THE EMPTY SPRITE
            Color[] clearColors = new Color[tilePixelSize * tilePixelSize];
            for (int i = 0; i < clearColors.Length; i++)
            {
                clearColors [i] = Color.clear;
            }
            PackHorizontalSprite(tilePerRow, tilePixelSize, clearColors, -1, 0, 1, ref tileX, ref tileY, ref spriteInd, ref sprites, ref texture);

            // ALL HORIZONTAL SPRITES
            foreach (TileInfo tile in atlas.GetTileInfos())
            {
                if (tile.idSpriteInfo != null)
                {
                    PackHorizontalSpriteInfo(tilePerRow, tilePixelSize, tile.idSpriteInfo, tile.isVertical, tile.id, 0, ref tileX, ref tileY, ref spriteInd, ref sprites, ref texture);
                }

                if (tile.subIdSpriteInfo != null)
                {
                    for (int i = 0; i < tile.subIdSpriteInfo.Length; i++)
                    {
                        if (tile.subIdSpriteInfo [i] != null)
                        {
                            PackHorizontalSpriteInfo(tilePerRow, tilePixelSize, tile.subIdSpriteInfo [i], tile.isVertical, tile.id, i + 1, ref tileX, ref tileY, ref spriteInd, ref sprites, ref texture);
                        }
                    }
                }
            }

            tileX  = 0;
            tileY += 1;

            int minTileY = tileY;

            // ALL VERTICAL SPRITES
            foreach (TileInfo tile in atlas.GetTileInfos())
            {
                if (tile.isVertical)
                {
                    if (tile.idSpriteInfo != null)
                    {
                        PackVerticalSpriteInfo(tilePerRow, minTileY, tilePixelSize, tile.idSpriteInfo, tile.id, 0, ref tileX, ref tileY, ref spriteInd, ref sprites, ref texture);
                    }

                    if (tile.subIdSpriteInfo != null)
                    {
                        for (int i = 0; i < tile.subIdSpriteInfo.Length; i++)
                        {
                            if (tile.subIdSpriteInfo [i] != null)
                            {
                                PackVerticalSpriteInfo(tilePerRow, minTileY, tilePixelSize, tile.subIdSpriteInfo [i], tile.id, i + 1, ref tileX, ref tileY, ref spriteInd, ref sprites, ref texture);
                            }
                        }
                    }
                }
            }

            texture.Apply();

            var bytes = texture.EncodeToPNG();

            var directory = Path.GetDirectoryName(spriteSheetPath);

            Directory.CreateDirectory(directory);
            File.WriteAllBytes(spriteSheetPath, bytes);

            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);

            texture = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/" + spriteSheetProjectPath, typeof(Texture2D));

            atlas.spriteSheet = texture;

            // UPDATE IMPORT SETTINGS
            string          assetPath = AssetDatabase.GetAssetPath(texture);
            TextureImporter importer  = AssetImporter.GetAtPath(assetPath) as TextureImporter;

            importer.textureType = TextureImporterType.Sprite;

            importer.isReadable          = true;
            importer.filterMode          = FilterMode.Point;
            importer.textureType         = TextureImporterType.Sprite;
            importer.spriteImportMode    = SpriteImportMode.Multiple;
            importer.mipmapEnabled       = false;
            importer.isReadable          = true;
            importer.spritePixelsPerUnit = tilePixelSize;
            importer.spritesheet         = sprites;

            AssetDatabase.ImportAsset(assetPath);
            AssetDatabase.Refresh();

            foreach (TileInfo info in atlas.GetTileInfos())
            {
                if (info.idSpriteInfo != null && info.idSpriteInfo.importedSprites != null && info.idSpriteInfo.importedSprites.Length > 0)
                {
                    info.idSpriteInfo.sprites = new Sprite[info.idSpriteInfo.importedSprites.Length];
                }

                if (info.subIdSpriteInfo != null)
                {
                    for (int i = 0; i < info.subIdSpriteInfo.Length; i++)
                    {
                        if (info.subIdSpriteInfo [i].importedSprites != null && info.subIdSpriteInfo [i].importedSprites.Length > 0)
                        {
                            info.subIdSpriteInfo [i].sprites = new Sprite[info.subIdSpriteInfo [i].importedSprites.Length];
                        }
                    }
                }
            }

            foreach (Object obj in AssetDatabase.LoadAllAssetsAtPath(assetPath))
            {
                if (!string.IsNullOrEmpty(obj.name) && obj.name [0] == 's' && obj.name != "sprite_sheet" && obj is Sprite)
                {
                    Sprite sprite = obj as Sprite;

                    string[] values = sprite.name.Split('_');

                    int id       = int.Parse(values [1]);
                    int subId    = int.Parse(values [2]);
                    int tileSize = int.Parse(values [3]);

                    if (id == -1)
                    {
                        atlas.emptySprite = sprite;
                    }
                    else
                    {
                        TileSpriteInfo spriteInfo;

                        if (subId == 0)
                        {
                            spriteInfo = atlas [id].idSpriteInfo;
                        }
                        else
                        {
                            spriteInfo = atlas [id].subIdSpriteInfo [subId - 1];
                        }

                        if (tileSize == 1)
                        {
                            spriteInfo.sprite = sprite;
                        }
                        else
                        {
                            spriteInfo.sprites [tileSize - 2] = sprite;
                        }
                    }
                }
            }

            EditorUtility.ClearProgressBar();

            atlas.spriteSheetMajorVersion = atlas.majorVersion;
            atlas.spriteSheetMinorVersion = atlas.minorVersion;
        }