Exemplo n.º 1
0
        void TriangleSpriteChooser(TileInfo tile, TileSpriteInfo spriteInfo, int subId)
        {
            TileAtlas atlas = target as TileAtlas;

            GUILayout.BeginVertical("HelpBox");

            Sprite sprite = (Sprite)EditorGUILayout.ObjectField("Main sprite size=1", spriteInfo.importedSprite, typeof(Sprite), false);

            if (spriteInfo.importedSprite != sprite)
            {
                spriteInfo.importedSprite = sprite;

                atlas.BumpMinor();
            }

            if (spriteInfo.importedSprites != null)
            {
                for (int i = 0; i < spriteInfo.importedSprites.Length; i++)
                {
                    sprite = (Sprite)EditorGUILayout.ObjectField(
                        "Main sprite size=" + (i + 2),
                        spriteInfo.importedSprites [i],
                        typeof(Sprite),
                        false
                        );

                    if (spriteInfo.importedSprites [i] != sprite)
                    {
                        spriteInfo.importedSprites [i] = sprite;

                        atlas.BumpMinor();
                    }
                }
            }

            if (GUILayout.Button("Add sprite size"))
            {
                tile.AddSpriteSize(subId);

                atlas.BumpMinor();
            }
            if (GUILayout.Button("Remove sprite size"))
            {
                tile.RemoveSpriteSize(subId);

                atlas.BumpMinor();
            }

            GUILayout.EndVertical();
        }
Exemplo n.º 2
0
        Texture GetThumbnail(Sprite sprite)
        {
            Texture2D texture = null;

            if (thumbnailCache == null || cachedAtlas != grid.atlas)
            {
                thumbnailCache = new Dictionary <string, Texture2D> ();
                cachedAtlas    = grid.atlas;
            }

            if (!thumbnailCache.TryGetValue(sprite.name, out texture))
            {
                var rect = sprite.textureRect;
                texture = new Texture2D((int)rect.width, (int)rect.height);
                texture.SetPixels(sprite.texture.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height));
                texture.Apply();

                thumbnailCache[sprite.name] = texture;
            }
            return(texture);
        }
Exemplo n.º 3
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;
        }
Exemplo n.º 4
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);
            }
        }
Exemplo n.º 5
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;
        }
Exemplo n.º 6
0
        void TileInfoUI(TileAtlas atlas, TileInfo tile)
        {
            GUILayout.BeginVertical("HelpBox");

            EditorGUI.indentLevel++;

            TileEditorInfo info = GetTileEditorInfo(tile.id);

            EditorGUILayout.BeginHorizontal();

            info.isRevealed = EditorGUILayout.Foldout(info.isRevealed, "ID:" + tile.id + " " + tile.name);

            GUILayout.FlexibleSpace();

            Sprite mainSprite = tile.GetSprite();

            if (mainSprite != null)
            {
                DrawOnGUISprite(mainSprite);
            }

            if (GUILayout.Button("remove", GUILayout.MaxWidth(80)))
            {
                atlas.RemoveTile(tile.id);

                atlas.BumpMajor();
            }
            EditorGUILayout.EndHorizontal();

            if (info.isRevealed)
            {
                string old = EditorGUILayout.TextField("Name", tile.name);
                if (old != tile.name)
                {
                    tile.name = old;

                    atlas.BumpMinor();
                }

                if (tile.tileGO == null)
                {
                    TileShape shape = (TileShape)EditorGUILayout.EnumPopup("Shape", tile.shape);
                    if (shape != tile.shape)
                    {
                        tile.shape = shape;

                        atlas.BumpMinor();
                    }

                    bool isVertical;

                    if (TileShapeHelper.IsTriangle(tile.shape))
                    {
                        isVertical = EditorGUILayout.Toggle("Triangle can stretch vertically", tile.isVertical);
                        isVertical = !EditorGUILayout.Toggle("Triangle can stretch horizontally", !tile.isVertical);
                    }
                    else
                    {
                        isVertical = tile.shape == TileShape.LEFT_ONEWAY || tile.shape == TileShape.RIGHT_ONEWAY;
                    }

                    if (tile.isVertical != isVertical)
                    {
                        tile.isVertical = isVertical;

                        atlas.BumpMinor();
                    }

                    bool isTrigger = EditorGUILayout.Toggle("Is trigger?", tile.isTrigger);
                    if (isTrigger != tile.isTrigger)
                    {
                        tile.isTrigger = isTrigger;

                        atlas.BumpMinor();
                    }
                    int layer = EditorGUILayout.LayerField("Layer", tile.layer);
                    if (layer != tile.layer)
                    {
                        tile.layer = layer;

                        atlas.BumpMinor();
                    }
                    string tag = EditorGUILayout.TagField("Tag", tile.tag);
                    if (tag != tile.tag)
                    {
                        tile.tag = tag;

                        atlas.BumpMinor();
                    }
                }
                else
                {
                    if (tile.shape != TileShape.EMPTY)
                    {
                        tile.shape = TileShape.EMPTY;

                        atlas.BumpMinor();
                    }
                }

                GameObject obj = EditorGUILayout.ObjectField("Tile GO", tile.tileGO, typeof(GameObject), false) as GameObject;
                if (tile.tileGO != obj)
                {
                    tile.tileGO = obj;

                    atlas.BumpMajor();
                }
                if (tile.tileGO != null)
                {
                    bool val = EditorGUILayout.Toggle("Tile GO is detached", tile.isGODetached);
                    if (val != tile.isGODetached)
                    {
                        tile.isGODetached = val;

                        atlas.BumpMinor();
                    }
                }

                bool isTriangle = TileShapeHelper.IsTriangle(tile.shape);

                if (isTriangle)
                {
                    TriangleSpriteChooser(tile, tile.idSpriteInfo, 0);

                    if (tile.subIdSpriteInfo != null)
                    {
                        for (int i = 0; i < tile.subIdSpriteInfo.Length; i++)
                        {
                            TriangleSpriteChooser(tile, tile.subIdSpriteInfo [i], i);
                        }
                    }
                }
                else
                {
                    Sprite sprite = (Sprite)EditorGUILayout.ObjectField("Main sprite", tile.idSpriteInfo.importedSprite, typeof(Sprite), false);
                    if (tile.idSpriteInfo.importedSprite != sprite)
                    {
                        tile.idSpriteInfo.importedSprite = sprite;

                        atlas.BumpMinor();
                    }

                    if (tile.subIdSpriteInfo != null)
                    {
                        for (int i = 0; i < tile.subIdSpriteInfo.Length; i++)
                        {
                            if (tile.subIdSpriteInfo [i] != null)
                            {
                                sprite = (Sprite)EditorGUILayout.ObjectField("Sub id sprite " + i, tile.subIdSpriteInfo [i].importedSprite, typeof(Sprite), false);

                                if (sprite != tile.subIdSpriteInfo[i].importedSprite)
                                {
                                    tile.subIdSpriteInfo [i].importedSprite = sprite;

                                    atlas.BumpMinor();
                                }
                            }
                        }
                    }
                }

                if (GUILayout.Button("Add sub id sprite"))
                {
                    tile.AddSubId();

                    atlas.BumpMinor();
                }
                if (GUILayout.Button("Remove sub id sprite"))
                {
                    tile.RemoveSubId();

                    atlas.BumpMajor();
                }

                EditorGUILayout.BeginHorizontal();

                EditorGUILayout.EndHorizontal();
            }

            EditorGUI.indentLevel--;

            GUILayout.EndVertical();

            if (GUI.changed)
            {
                EditorUtility.SetDirty(target);
            }
        }
Exemplo n.º 7
0
 public void _Inject(TileAtlas atlas)
 {
     _atlas = atlas;
 }