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; }
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); } }
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; }