void OnDestroy() { tk2dSpriteThumbnailCache.ReleaseSpriteThumbnailCache(); inst = null; }
void OnEnable() { inst = this; }
void OnDestroy() { tk2dSpriteThumbnailCache.ReleaseSpriteThumbnailCache(); inst = null; }
void OnEnable() { inst = this; int MAX_PAD_AMOUNT = 17; extraPadAmountValues = new int[MAX_PAD_AMOUNT]; extraPadAmountLabels = new string[MAX_PAD_AMOUNT]; for (int i = 0; i < MAX_PAD_AMOUNT; ++i) { extraPadAmountValues[i] = i; extraPadAmountLabels[i] = (i==0)?"None":(i.ToString()); } }
public static void SpriteSelector(tk2dSpriteCollectionData spriteCollection, int spriteId, SpriteChangedCallback callback, object callbackData) { tk2dSpriteCollectionData newCollection = spriteCollection; int newSpriteId = spriteId; GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); newCollection = SpriteCollectionList("Collection", spriteCollection); if (newCollection != spriteCollection) { string oldSpriteName = (spriteCollection == null || spriteCollection.inst == null) ? "" : spriteCollection.inst.spriteDefinitions[spriteId].name; int distance = -1; for (int i = 0; i < newCollection.inst.spriteDefinitions.Length; ++i) { if (newCollection.inst.spriteDefinitions[i].Valid) { string newSpriteName = newCollection.inst.spriteDefinitions[i].name; int tmpDistance = (newSpriteName == oldSpriteName) ? 0 : Mathf.Abs((oldSpriteName.ToLower()).CompareTo(newSpriteName.ToLower())); if (distance == -1 || tmpDistance < distance) { distance = tmpDistance; newSpriteId = i; } } } } if (spriteCollection != null && GUILayout.Button("o", EditorStyles.miniButton, GUILayout.Width(18))) { EditorGUIUtility.PingObject(spriteCollection); } GUILayout.EndHorizontal(); if (spriteCollection != null && spriteCollection.Count != 0) { if (spriteId < 0 || spriteId >= spriteCollection.Count || !spriteCollection.inst.spriteDefinitions[spriteId].Valid) { newSpriteId = spriteCollection.FirstValidDefinitionIndex; } GUILayout.BeginHorizontal(); newSpriteId = SpriteList("Sprite", newSpriteId, spriteCollection); if (spriteCollection != null && spriteCollection.dataGuid != TransientGUID && GUILayout.Button("e", EditorStyles.miniButton, GUILayout.Width(18), GUILayout.MaxHeight(14f))) { tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(spriteCollection.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection; if (gen != null) { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup; v.SetGeneratorAndSelectedSprite(gen, spriteId); } } GUILayout.EndHorizontal(); } if (callback != null && (newCollection != spriteCollection || newSpriteId != spriteId)) { callback(newCollection, newSpriteId, callbackData); } GUILayout.EndVertical(); if (spriteCollection != null && GUILayout.Button("...", GUILayout.Height(32), GUILayout.Width(32))) { SpriteSelectorPopup(spriteCollection, spriteId, callback, callbackData); } GUILayout.EndHorizontal(); }
void OnEnable() { inst = this; }
void DrawSettingsPanel() { // Tilemap data tk2dTileMapData newData = (tk2dTileMapData)EditorGUILayout.ObjectField("Tile Map Data", tileMap.data, typeof(tk2dTileMapData), false); if (newData != tileMap.data) { tileMap.data = newData; LoadTileMapData(); } if (tileMap.data == null) { if (tk2dGuiUtility.InfoBoxWithButtons( "TileMap needs an data object to proceed. " + "Please create one or drag an existing data object into the inspector slot.\n", tk2dGuiUtility.WarningLevel.Info, "Create") != -1) { string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Data", "tileMapData", "asset", ""); if (assetPath.Length > 0) { tk2dTileMapData tileMapData = ScriptableObject.CreateInstance<tk2dTileMapData>(); AssetDatabase.CreateAsset(tileMapData, assetPath); tileMap.data = tileMapData; EditorUtility.SetDirty(tileMap); Init(tileMapData); LoadTileMapData(); } } } // Editor data tk2dTileMapEditorData newEditorData = (tk2dTileMapEditorData)EditorGUILayout.ObjectField("Editor Data", editorData, typeof(tk2dTileMapEditorData), false); if (newEditorData != editorData) { string assetPath = AssetDatabase.GetAssetPath(newEditorData); if (assetPath.Length > 0) { tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath); EditorUtility.SetDirty(tileMap); LoadTileMapData(); } } if (editorData == null) { if (tk2dGuiUtility.InfoBoxWithButtons( "TileMap needs an editor data object to proceed. " + "Please create one or drag an existing data object into the inspector slot.\n", tk2dGuiUtility.WarningLevel.Info, "Create") != -1) { string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Editor Data", "tileMapEditorData", "asset", ""); if (assetPath.Length > 0) { tk2dTileMapEditorData tileMapEditorData = ScriptableObject.CreateInstance<tk2dTileMapEditorData>(); AssetDatabase.CreateAsset(tileMapEditorData, assetPath); tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath); EditorUtility.SetDirty(tileMap); LoadTileMapData(); } } } // Sprite collection GUILayout.BeginHorizontal(); Object selectedSpriteCollectionObject = EditorGUILayout.ObjectField("Sprite Collection", tileMap.Editor__SpriteCollection, typeof(Object), false) as Object; if (tileMap.Editor__SpriteCollection != null && GUILayout.Button(">", EditorStyles.miniButton, GUILayout.Width(19))) { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow( typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor" ) as tk2dSpriteCollectionEditorPopup; string assetPath = AssetDatabase.GUIDToAssetPath(tileMap.Editor__SpriteCollection.spriteCollectionGUID); var spriteCollection = AssetDatabase.LoadAssetAtPath(assetPath, typeof(tk2dSpriteCollection)) as tk2dSpriteCollection; v.SetGeneratorAndSelectedSprite(spriteCollection, 0); } GUILayout.EndHorizontal(); if (selectedSpriteCollectionObject != tileMap.Editor__SpriteCollection) { string assetPath = AssetDatabase.GetAssetPath(selectedSpriteCollectionObject); string guid = AssetDatabase.AssetPathToGUID(assetPath); tk2dIndex index = tk2dEditorUtility.GetOrCreateIndex(); foreach (var scIndex in index.GetSpriteCollectionIndex()) { if (scIndex.spriteCollectionGUID == guid || scIndex.spriteCollectionDataGUID == guid) { string realDataPath = AssetDatabase.GUIDToAssetPath(scIndex.spriteCollectionDataGUID); tk2dSpriteCollectionData data = AssetDatabase.LoadAssetAtPath(realDataPath, typeof(tk2dSpriteCollectionData)) as tk2dSpriteCollectionData; if (data.allowMultipleAtlases) { Debug.Log("Atlas spanning not allowed"); } else { tileMap.Editor__SpriteCollection = data; data.InitMaterialIds(); LoadTileMapData(); EditorUtility.SetDirty(tileMap); if (Ready) { Init(tileMap.data); tileMap.BeginEditMode(); } break; } } } } // If not set up, don't bother drawing anything else if (!Ready) return; // this is intentionally read only EditorGUILayout.ObjectField("Render Data", tileMap.renderData, typeof(GameObject), false); GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); if (GUILayout.Button("Make Unique")) { tk2dEditor.TileMap.TileMapUtility.MakeUnique(tileMap); } GUILayout.EndHorizontal(); // tile map size if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Dimensions, "Dimensions")) { EditorGUI.indentLevel++; width = Mathf.Clamp(EditorGUILayout.IntField("Width", width), 1, tk2dEditor.TileMap.TileMapUtility.MaxWidth); height = Mathf.Clamp(EditorGUILayout.IntField("Height", height), 1, tk2dEditor.TileMap.TileMapUtility.MaxHeight); partitionSizeX = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeX", partitionSizeX), 4, 32); partitionSizeY = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeY", partitionSizeY), 4, 32); // Create a default tilemap with given dimensions if (!tileMap.AreSpritesInitialized()) { tk2dRuntime.TileMap.BuilderUtil.InitDataStore(tileMap); tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, tileMap.partitionSizeX, tileMap.partitionSizeY); } if (width != tileMap.width || height != tileMap.height || partitionSizeX != tileMap.partitionSizeX || partitionSizeY != tileMap.partitionSizeY) { if ((width < tileMap.width || height < tileMap.height)) { tk2dGuiUtility.InfoBox("The new size of the tile map is smaller than the current size." + "Some clipping will occur.", tk2dGuiUtility.WarningLevel.Warning); } GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Apply", EditorStyles.miniButton)) { tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, partitionSizeX, partitionSizeY); } GUILayout.EndHorizontal(); } EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Layers, "Layers")) { EditorGUI.indentLevel++; DrawLayersPanel(true); EditorGUI.indentLevel--; } // tilemap info if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Info, "Info")) { EditorGUI.indentLevel++; int numActiveChunks = 0; if (tileMap.Layers != null) { foreach (var layer in tileMap.Layers) numActiveChunks += layer.NumActiveChunks; } EditorGUILayout.LabelField("Active chunks", numActiveChunks.ToString()); int partitionMemSize = partitionSizeX * partitionSizeY * 4; EditorGUILayout.LabelField("Memory", ((numActiveChunks * partitionMemSize) / 1024).ToString() + "kB" ); int numActiveColorChunks = 0; if (tileMap.ColorChannel != null) numActiveColorChunks += tileMap.ColorChannel.NumActiveChunks; EditorGUILayout.LabelField("Active color chunks", numActiveColorChunks.ToString()); int colorMemSize = (partitionSizeX + 1) * (partitionSizeY + 1) * 4; EditorGUILayout.LabelField("Memory", ((numActiveColorChunks * colorMemSize) / 1024).ToString() + "kB" ); EditorGUI.indentLevel--; } // tile properties if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.TileProperties, "Tile Properties")) { EditorGUI.indentLevel++; // sort method tk2dGuiUtility.BeginChangeCheck(); tileMap.data.tileType = (tk2dTileMapData.TileType)EditorGUILayout.EnumPopup("Tile Type", tileMap.data.tileType); tileMap.data.sortMethod = (tk2dTileMapData.SortMethod)EditorGUILayout.EnumPopup("Sort Method", tileMap.data.sortMethod); if (tk2dGuiUtility.EndChangeCheck()) { tileMap.BeginEditMode(); } // reset sizes GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Reset sizes"); GUILayout.FlexibleSpace(); if (GUILayout.Button("Reset", EditorStyles.miniButtonRight)) { Init(tileMap.data); Build(true); } GUILayout.EndHorizontal(); // convert these to pixel units Vector3 texelSize = SpriteCollection.spriteDefinitions[0].texelSize; Vector3 tileOriginPixels = new Vector3(tileMap.data.tileOrigin.x / texelSize.x, tileMap.data.tileOrigin.y / texelSize.y, tileMap.data.tileOrigin.z); Vector3 tileSizePixels = new Vector3(tileMap.data.tileSize.x / texelSize.x, tileMap.data.tileSize.y / texelSize.y, tileMap.data.tileSize.z); Vector3 newTileOriginPixels = EditorGUILayout.Vector3Field("Origin", tileOriginPixels); Vector3 newTileSizePixels = EditorGUILayout.Vector3Field("Size", tileSizePixels); if (newTileOriginPixels != tileOriginPixels || newTileSizePixels != tileSizePixels) { tileMap.data.tileOrigin = new Vector3(newTileOriginPixels.x * texelSize.x, newTileOriginPixels.y * texelSize.y, newTileOriginPixels.z); tileMap.data.tileSize = new Vector3(newTileSizePixels.x * texelSize.x, newTileSizePixels.y * texelSize.y, newTileSizePixels.z); Build(true); } // preview tile origin and size setting Vector2 spritePixelOrigin = Vector2.zero; Vector2 spritePixelSize = Vector2.one; tk2dSpriteDefinition[] spriteDefs = tileMap.SpriteCollectionInst.spriteDefinitions; tk2dSpriteDefinition spriteDef = (tilePropertiesPreviewIdx < spriteDefs.Length) ? spriteDefs[tilePropertiesPreviewIdx] : null; if (!spriteDef.Valid) spriteDef = null; if (spriteDef != null) { spritePixelOrigin = new Vector2(spriteDef.untrimmedBoundsData[0].x / spriteDef.texelSize.x, spriteDef.untrimmedBoundsData[0].y / spriteDef.texelSize.y); spritePixelSize = new Vector2(spriteDef.untrimmedBoundsData[1].x / spriteDef.texelSize.x, spriteDef.untrimmedBoundsData[1].y / spriteDef.texelSize.y); } float zoomFactor = (Screen.width - 32.0f) / (spritePixelSize.x * 2.0f); EditorGUILayout.BeginScrollView(Vector2.zero, GUILayout.Height(spritePixelSize.y * 2.0f * zoomFactor + 32.0f)); Rect innerRect = new Rect(0, 0, spritePixelSize.x * 2.0f * zoomFactor, spritePixelSize.y * 2.0f * zoomFactor); tk2dGrid.Draw(innerRect); if (spriteDef != null) { // Preview tiles tk2dSpriteThumbnailCache.DrawSpriteTexture(new Rect(spritePixelSize.x * 0.5f * zoomFactor, spritePixelSize.y * 0.5f * zoomFactor, spritePixelSize.x * zoomFactor, spritePixelSize.y * zoomFactor), spriteDef); // Preview cursor Vector2 cursorOffset = (spritePixelSize * 0.5f - spritePixelOrigin) * zoomFactor; Vector2 cursorSize = new Vector2(tileSizePixels.x * zoomFactor, tileSizePixels.y * zoomFactor); cursorOffset.x += tileOriginPixels.x * zoomFactor; cursorOffset.y += tileOriginPixels.y * zoomFactor; cursorOffset.x += spritePixelSize.x * 0.5f * zoomFactor; cursorOffset.y += spritePixelSize.y * 0.5f * zoomFactor; float top = spritePixelSize.y * 2.0f * zoomFactor; Vector3[] cursorVerts = new Vector3[] { new Vector3(cursorOffset.x, top - cursorOffset.y, 0), new Vector3(cursorOffset.x + cursorSize.x, top - cursorOffset.y, 0), new Vector3(cursorOffset.x + cursorSize.x, top - (cursorOffset.y + cursorSize.y), 0), new Vector3(cursorOffset.x, top - (cursorOffset.y + cursorSize.y), 0) }; Handles.DrawSolidRectangleWithOutline(cursorVerts, new Color(1.0f, 1.0f, 1.0f, 0.2f), Color.white); } if (GUILayout.Button(new GUIContent("", "Click - preview using different tile"), "label", GUILayout.Width(innerRect.width), GUILayout.Height(innerRect.height))) { int n = spriteDefs.Length; for (int i = 0; i < n; ++i) { if (++tilePropertiesPreviewIdx >= n) tilePropertiesPreviewIdx = 0; if (spriteDefs[tilePropertiesPreviewIdx].Valid) break; } } EditorGUILayout.EndScrollView(); EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.PaletteProperties, "Palette Properties")) { EditorGUI.indentLevel++; int newTilesPerRow = Mathf.Clamp(EditorGUILayout.IntField("Tiles Per Row", editorData.paletteTilesPerRow), 1, SpriteCollection.Count); if (newTilesPerRow != editorData.paletteTilesPerRow) { guiBrushBuilder.Reset(); editorData.paletteTilesPerRow = newTilesPerRow; editorData.CreateDefaultPalette(tileMap.SpriteCollectionInst, editorData.paletteBrush, editorData.paletteTilesPerRow); } GUILayout.BeginHorizontal(); editorData.brushDisplayScale = EditorGUILayout.FloatField("Display Scale", editorData.brushDisplayScale); editorData.brushDisplayScale = Mathf.Clamp(editorData.brushDisplayScale, 1.0f / 16.0f, 4.0f); if (GUILayout.Button("Reset", EditorStyles.miniButtonRight, GUILayout.ExpandWidth(false))) { editorData.brushDisplayScale = 1.0f; Repaint(); } GUILayout.EndHorizontal(); EditorGUILayout.PrefixLabel("Preview"); Rect innerRect = brushRenderer.GetBrushViewRect(editorData.paletteBrush, editorData.paletteTilesPerRow); paletteSettingsScrollPos = EditorGUILayout.BeginScrollView(paletteSettingsScrollPos, GUILayout.MinHeight(innerRect.height * editorData.brushDisplayScale + 32.0f)); innerRect.width *= editorData.brushDisplayScale; innerRect.height *= editorData.brushDisplayScale; tk2dGrid.Draw(innerRect); brushRenderer.DrawBrush(tileMap, editorData.paletteBrush, editorData.brushDisplayScale, true, editorData.paletteTilesPerRow); EditorGUILayout.EndScrollView(); EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Import, "Import")) { EditorGUI.indentLevel++; if (GUILayout.Button("Import TMX")) { if (tk2dEditor.TileMap.Importer.Import(tileMap, tk2dEditor.TileMap.Importer.Format.TMX)) { Build(true); width = tileMap.width; height = tileMap.height; partitionSizeX = tileMap.partitionSizeX; partitionSizeY = tileMap.partitionSizeY; } } EditorGUI.indentLevel--; } }
public static void SpriteSelector(tk2dSpriteCollectionData spriteCollection, int spriteId, SpriteChangedCallback callback, object callbackData) { tk2dSpriteCollectionData newCollection = spriteCollection; int newSpriteId = spriteId; GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); newCollection = SpriteCollectionList("Collection", newCollection); if (newCollection != spriteCollection) { newSpriteId = GetNamedSpriteInNewCollection(spriteCollection, spriteId, newCollection); } if (showOpenEditShortcuts && newCollection != null && GUILayout.Button("o", EditorStyles.miniButton, GUILayout.Width(18))) { EditorGUIUtility.PingObject(newCollection); } GUILayout.EndHorizontal(); if (newCollection != null && newCollection.Count != 0) { if (newSpriteId < 0 || newSpriteId >= newCollection.Count || !newCollection.inst.spriteDefinitions[newSpriteId].Valid) { newSpriteId = newCollection.FirstValidDefinitionIndex; } GUILayout.BeginHorizontal(); newSpriteId = SpriteList("Sprite", newSpriteId, newCollection); if (showOpenEditShortcuts && newCollection != null && newCollection.dataGuid != TransientGUID && GUILayout.Button("e", EditorStyles.miniButton, GUILayout.Width(18), GUILayout.MaxHeight(14f))) { tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(newCollection.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection; if (gen != null) { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup; v.SetGeneratorAndSelectedSprite(gen, newSpriteId); v.Show(); } } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); if (newCollection != null && GUILayout.Button("...", GUILayout.Height(32), GUILayout.Width(32))) { SpriteSelectorPopup(newCollection, newSpriteId, callback, callbackData); } GUILayout.EndHorizontal(); // Handle drag and drop Rect rect = GUILayoutUtility.GetLastRect(); if (rect.Contains(Event.current.mousePosition)) { if (Event.current.type == EventType.DragUpdated) { bool valid = false; if (DragAndDrop.objectReferences.Length == 1 && DragAndDrop.objectReferences[0] is GameObject) { GameObject go = DragAndDrop.objectReferences[0] as GameObject; if (go.GetComponent <tk2dSpriteCollection>() || go.GetComponent <tk2dSpriteCollectionData>()) { valid = true; } Event.current.Use(); } if (valid) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; } else { DragAndDrop.visualMode = DragAndDropVisualMode.None; } Event.current.Use(); } else if (Event.current.type == EventType.DragPerform) { DragAndDrop.visualMode = DragAndDropVisualMode.None; Event.current.Use(); GameObject go = DragAndDrop.objectReferences[0] as GameObject; tk2dSpriteCollection sc = go.GetComponent <tk2dSpriteCollection>(); tk2dSpriteCollectionData scd = go.GetComponent <tk2dSpriteCollectionData>(); if (sc != null && scd == null) { scd = sc.spriteCollection; } if (scd != null) { newCollection = scd; if (newCollection != spriteCollection) { newSpriteId = GetNamedSpriteInNewCollection(spriteCollection, spriteId, newCollection); } } } } // Final callback if (callback != null && (newCollection != spriteCollection || newSpriteId != spriteId)) { callback(newCollection, newSpriteId, callbackData); } }
void DrawSettingsPanel() { // Tilemap data tk2dTileMapData newData = (tk2dTileMapData)EditorGUILayout.ObjectField("Tile Map Data", tileMap.data, typeof(tk2dTileMapData), false); if (newData != tileMap.data) { tileMap.data = newData; LoadTileMapData(); } if (tileMap.data == null) { if (tk2dGuiUtility.InfoBoxWithButtons( "TileMap needs an data object to proceed. " + "Please create one or drag an existing data object into the inspector slot.\n", tk2dGuiUtility.WarningLevel.Info, "Create") != -1) { string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Data", "tileMapData", "asset", ""); if (assetPath.Length > 0) { tk2dTileMapData tileMapData = ScriptableObject.CreateInstance <tk2dTileMapData>(); AssetDatabase.CreateAsset(tileMapData, assetPath); tileMap.data = tileMapData; EditorUtility.SetDirty(tileMap); Init(tileMapData); LoadTileMapData(); } } } // Editor data tk2dTileMapEditorData newEditorData = (tk2dTileMapEditorData)EditorGUILayout.ObjectField("Editor Data", editorData, typeof(tk2dTileMapEditorData), false); if (newEditorData != editorData) { string assetPath = AssetDatabase.GetAssetPath(newEditorData); if (assetPath.Length > 0) { tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath); EditorUtility.SetDirty(tileMap); LoadTileMapData(); } } if (editorData == null) { if (tk2dGuiUtility.InfoBoxWithButtons( "TileMap needs an editor data object to proceed. " + "Please create one or drag an existing data object into the inspector slot.\n", tk2dGuiUtility.WarningLevel.Info, "Create") != -1) { string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Editor Data", "tileMapEditorData", "asset", ""); if (assetPath.Length > 0) { tk2dTileMapEditorData tileMapEditorData = ScriptableObject.CreateInstance <tk2dTileMapEditorData>(); AssetDatabase.CreateAsset(tileMapEditorData, assetPath); tileMap.editorDataGUID = AssetDatabase.AssetPathToGUID(assetPath); EditorUtility.SetDirty(tileMap); LoadTileMapData(); } } } // Sprite collection GUILayout.BeginHorizontal(); Object selectedSpriteCollectionObject = EditorGUILayout.ObjectField("Sprite Collection", tileMap.Editor__SpriteCollection, typeof(Object), false) as Object; if (tileMap.Editor__SpriteCollection != null && GUILayout.Button(">", EditorStyles.miniButton, GUILayout.Width(19))) { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup; string assetPath = AssetDatabase.GUIDToAssetPath(tileMap.Editor__SpriteCollection.spriteCollectionGUID); var spriteCollection = AssetDatabase.LoadAssetAtPath(assetPath, typeof(tk2dSpriteCollection)) as tk2dSpriteCollection; v.SetGeneratorAndSelectedSprite(spriteCollection, 0); } GUILayout.EndHorizontal(); if (selectedSpriteCollectionObject != tileMap.Editor__SpriteCollection) { string assetPath = AssetDatabase.GetAssetPath(selectedSpriteCollectionObject); string guid = AssetDatabase.AssetPathToGUID(assetPath); tk2dIndex index = tk2dEditorUtility.GetOrCreateIndex(); foreach (var scIndex in index.GetSpriteCollectionIndex()) { if (scIndex.spriteCollectionGUID == guid || scIndex.spriteCollectionDataGUID == guid) { string realDataPath = AssetDatabase.GUIDToAssetPath(scIndex.spriteCollectionDataGUID); tk2dSpriteCollectionData data = AssetDatabase.LoadAssetAtPath(realDataPath, typeof(tk2dSpriteCollectionData)) as tk2dSpriteCollectionData; if (data.allowMultipleAtlases) { Debug.Log("Atlas spanning not allowed"); } else { tileMap.Editor__SpriteCollection = data; data.InitMaterialIds(); LoadTileMapData(); EditorUtility.SetDirty(tileMap); if (Ready) { Init(tileMap.data); tileMap.BeginEditMode(); } break; } } } } // If not set up, don't bother drawing anything else if (!Ready) { return; } // this is intentionally read only EditorGUILayout.ObjectField("Render Data", tileMap.renderData, typeof(GameObject), false); GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); if (GUILayout.Button("Make Unique")) { tk2dRuntime.TileMap.BuilderUtil.CleanRenderData(tileMap); tileMap.renderData = null; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); if (!tileMap.serializeRenderData && GUILayout.Button("Make Serializable")) { if (tileMap.serializeRenderData == true) { tk2dRuntime.TileMap.BuilderUtil.CleanRenderData(tileMap); // clear everything (i.e. all serialized meshes will be back in "serializedMeshes") tileMap.serializeRenderData = false; } string assetPath = EditorUtility.SaveFilePanelInProject("Save Tile Map Render Data", "Tilemap Render Data 1", "asset", "Select an asset file to save the render data to.\n" + "It is best to save this in an empty directory, as the tilemap may contain more than one mesh"); if (assetPath.Length > 0) { tileMap.serializeRenderData = true; tileMap.serializedMeshPath = assetPath; if (tileMap.renderData) { List <Mesh> existingMeshes = new List <Mesh>(); MeshFilter[] meshFilters = tileMap.renderData.GetComponentsInChildren <MeshFilter>(); MeshCollider[] meshColliders = tileMap.renderData.GetComponentsInChildren <MeshCollider>(); foreach (var j in meshFilters) { existingMeshes.Add(j.sharedMesh); } foreach (var j in meshColliders) { existingMeshes.Add(j.sharedMesh); } existingMeshes.RemoveAll(a => a == null); foreach (var j in existingMeshes) { j.RecalculateNormals(); // normals are likely to be missing here AssetDatabase.CreateAsset(j, AssetDatabase.GenerateUniqueAssetPath(tileMap.serializedMeshPath)); } } } } if (tileMap.serializeRenderData) { if (GUILayout.Toggle(true, "Serialized", "button") == false) { GameObject.DestroyImmediate(tileMap.renderData); tileMap.renderData = null; tileMap.serializeRenderData = false; Build(true); } } GUILayout.EndHorizontal(); // tile map size if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Dimensions, "Dimensions")) { EditorGUI.indentLevel++; width = Mathf.Clamp(EditorGUILayout.IntField("Width", width), 1, tk2dEditor.TileMap.TileMapUtility.MaxWidth); height = Mathf.Clamp(EditorGUILayout.IntField("Height", height), 1, tk2dEditor.TileMap.TileMapUtility.MaxHeight); partitionSizeX = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeX", partitionSizeX), 4, 32); partitionSizeY = Mathf.Clamp(EditorGUILayout.IntField("PartitionSizeY", partitionSizeY), 4, 32); // Create a default tilemap with given dimensions if (!tileMap.AreSpritesInitialized()) { tk2dRuntime.TileMap.BuilderUtil.InitDataStore(tileMap); tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, tileMap.partitionSizeX, tileMap.partitionSizeY); } if (width != tileMap.width || height != tileMap.height || partitionSizeX != tileMap.partitionSizeX || partitionSizeY != tileMap.partitionSizeY) { if ((width < tileMap.width || height < tileMap.height)) { tk2dGuiUtility.InfoBox("The new size of the tile map is smaller than the current size." + "Some clipping will occur.", tk2dGuiUtility.WarningLevel.Warning); } GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Apply", EditorStyles.miniButton)) { tk2dEditor.TileMap.TileMapUtility.ResizeTileMap(tileMap, width, height, partitionSizeX, partitionSizeY); } GUILayout.EndHorizontal(); } EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Layers, "Layers")) { EditorGUI.indentLevel++; DrawLayersPanel(true); EditorGUI.indentLevel--; } // tilemap info if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Info, "Info")) { EditorGUI.indentLevel++; int numActiveChunks = 0; if (tileMap.Layers != null) { foreach (var layer in tileMap.Layers) { numActiveChunks += layer.NumActiveChunks; } } EditorGUILayout.LabelField("Active chunks", numActiveChunks.ToString()); int partitionMemSize = partitionSizeX * partitionSizeY * 4; EditorGUILayout.LabelField("Memory", ((numActiveChunks * partitionMemSize) / 1024).ToString() + "kB"); int numActiveColorChunks = 0; if (tileMap.ColorChannel != null) { numActiveColorChunks += tileMap.ColorChannel.NumActiveChunks; } EditorGUILayout.LabelField("Active color chunks", numActiveColorChunks.ToString()); int colorMemSize = (partitionSizeX + 1) * (partitionSizeY + 1) * 4; EditorGUILayout.LabelField("Memory", ((numActiveColorChunks * colorMemSize) / 1024).ToString() + "kB"); EditorGUI.indentLevel--; } // tile properties if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.TileProperties, "Tile Properties")) { EditorGUI.indentLevel++; // sort method tk2dGuiUtility.BeginChangeCheck(); tileMap.data.tileType = (tk2dTileMapData.TileType)EditorGUILayout.EnumPopup("Tile Type", tileMap.data.tileType); tileMap.data.sortMethod = (tk2dTileMapData.SortMethod)EditorGUILayout.EnumPopup("Sort Method", tileMap.data.sortMethod); if (tk2dGuiUtility.EndChangeCheck()) { tileMap.BeginEditMode(); } // reset sizes GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Reset sizes"); GUILayout.FlexibleSpace(); if (GUILayout.Button("Reset", EditorStyles.miniButtonRight)) { Init(tileMap.data); Build(true); } GUILayout.EndHorizontal(); // convert these to pixel units Vector3 texelSize = SpriteCollection.spriteDefinitions[0].texelSize; Vector3 tileOriginPixels = new Vector3(tileMap.data.tileOrigin.x / texelSize.x, tileMap.data.tileOrigin.y / texelSize.y, tileMap.data.tileOrigin.z); Vector3 tileSizePixels = new Vector3(tileMap.data.tileSize.x / texelSize.x, tileMap.data.tileSize.y / texelSize.y, tileMap.data.tileSize.z); Vector3 newTileOriginPixels = EditorGUILayout.Vector3Field("Origin", tileOriginPixels); Vector3 newTileSizePixels = EditorGUILayout.Vector3Field("Size", tileSizePixels); if (newTileOriginPixels != tileOriginPixels || newTileSizePixels != tileSizePixels) { tileMap.data.tileOrigin = new Vector3(newTileOriginPixels.x * texelSize.x, newTileOriginPixels.y * texelSize.y, newTileOriginPixels.z); tileMap.data.tileSize = new Vector3(newTileSizePixels.x * texelSize.x, newTileSizePixels.y * texelSize.y, newTileSizePixels.z); Build(true); } EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.PaletteProperties, "Palette Properties")) { EditorGUI.indentLevel++; int newTilesPerRow = Mathf.Clamp(EditorGUILayout.IntField("Tiles Per Row", editorData.paletteTilesPerRow), 1, SpriteCollection.Count); if (newTilesPerRow != editorData.paletteTilesPerRow) { guiBrushBuilder.Reset(); editorData.paletteTilesPerRow = newTilesPerRow; editorData.CreateDefaultPalette(tileMap.SpriteCollectionInst, editorData.paletteBrush, editorData.paletteTilesPerRow); } GUILayout.BeginHorizontal(); editorData.brushDisplayScale = EditorGUILayout.FloatField("Display Scale", editorData.brushDisplayScale); editorData.brushDisplayScale = Mathf.Clamp(editorData.brushDisplayScale, 1.0f / 16.0f, 4.0f); if (GUILayout.Button("Reset", EditorStyles.miniButtonRight, GUILayout.ExpandWidth(false))) { editorData.brushDisplayScale = 1.0f; Repaint(); } GUILayout.EndHorizontal(); EditorGUILayout.PrefixLabel("Preview"); brushRenderer.DrawBrush(tileMap, editorData.paletteBrush, editorData.brushDisplayScale, true, editorData.paletteTilesPerRow); EditorGUI.indentLevel--; } if (Foldout(ref editorData.setupMode, tk2dTileMapEditorData.SetupMode.Import, "Import")) { EditorGUI.indentLevel++; if (GUILayout.Button("Import TMX")) { if (tk2dEditor.TileMap.Importer.Import(tileMap, tk2dEditor.TileMap.Importer.Format.TMX)) { Build(true); width = tileMap.width; height = tileMap.height; partitionSizeX = tileMap.partitionSizeX; partitionSizeY = tileMap.partitionSizeY; } } EditorGUI.indentLevel--; } }
public override void OnInspectorGUI() { tk2dSpriteCollection gen = (tk2dSpriteCollection)target; GUILayout.BeginVertical(); GUILayout.Space(8); if (gen.managedSpriteCollection) { string label = showDefaultInspector?"Hide Default Inspector":"Show Default Inspector"; int buttonPressed = tk2dGuiUtility.InfoBoxWithButtons("This is a managed sprite collection. Please do not modify.", tk2dGuiUtility.WarningLevel.Info, new string[] { label }); if (buttonPressed == 0) { showDefaultInspector = !showDefaultInspector; } if (showDefaultInspector) { GUILayout.Space(16); DrawDefaultInspector(); } } else { string assetPath = AssetDatabase.GetAssetPath(gen).ToLower(); bool inResources = assetPath.IndexOf("/resources/") != -1; if (inResources) { string msg = "Sprite collection is in a resources directory. " + "All source textures will be included in build.\n\n" + "Editor is disabled. Move it out of the resources directory to continue."; tk2dGuiUtility.InfoBox(msg, tk2dGuiUtility.WarningLevel.Error); } else { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Open Editor...", GUILayout.MinWidth(120))) { if (gen.name == defaultSpriteCollectionName) { EditorUtility.DisplayDialog("Invalid Sprite Collection name", "Please rename sprite collection before proceeding", "Ok"); } else { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), true, "SpriteCollection") as tk2dSpriteCollectionEditorPopup; v.SetGenerator(gen); v.Show(); } } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); GUILayout.Space(64); if (viewData && !(gen.managedSpriteCollection && showDefaultInspector)) { DrawDefaultInspector(); return; } }
protected void DrawSpriteEditorGUI(tk2dBaseSprite sprite) { // maybe cache this if its too slow later if (generatorCache.all == null || generatorCache.current != sprite.collection) { generatorCache.all = tk2dEditorUtility.GetOrCreateIndex().GetSpriteCollectionIndex(); if (generatorCache.all != null) { string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(sprite.collection)); for (int i = 0; i < generatorCache.all.Length; ++i) { if (generatorCache.all[i].spriteCollectionDataGUID == guid) { generatorCache.current = sprite.collection; generatorCache.currentGUID = guid; break; } } } } if (generatorCache.all == null) { EditorGUILayout.LabelField("Collection", "Error"); } else { string[] collNames = new string[generatorCache.all.Length]; int selIndex = -1; for (int i = 0; i < generatorCache.all.Length; ++i) { collNames[i] = generatorCache.all[i].name; if (generatorCache.all[i].spriteCollectionDataGUID == generatorCache.currentGUID) { selIndex = i; } } EditorGUILayout.BeginHorizontal(); int newIndex = EditorGUILayout.Popup("Collection", (selIndex != -1) ? selIndex : 0, collNames); if (newIndex != selIndex) { generatorCache.currentGUID = generatorCache.all[newIndex].spriteCollectionDataGUID; GameObject go = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(generatorCache.currentGUID), typeof(GameObject)) as GameObject; tk2dSpriteCollectionData data = go.GetComponent <tk2dSpriteCollectionData>(); if (data != null) { generatorCache.current = data; int newId = (sprite.spriteId >= generatorCache.current.Count)?0:sprite.spriteId; sprite.SwitchCollectionAndSprite(generatorCache.current, newId); sprite.EditMode__CreateCollider(); } } if (GUILayout.Button("Edit...", GUILayout.MaxWidth(40f), GUILayout.MaxHeight(14f))) { tk2dSpriteCollection gen = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(generatorCache.current.spriteCollectionGUID), typeof(tk2dSpriteCollection)) as tk2dSpriteCollection; if (gen != null) { tk2dSpriteCollectionEditorPopup v = EditorWindow.GetWindow(typeof(tk2dSpriteCollectionEditorPopup), false, "Sprite Collection Editor") as tk2dSpriteCollectionEditorPopup; v.SetGeneratorAndSelectedSprite(gen, sprite.spriteId); } } EditorGUILayout.EndHorizontal(); } if (sprite.collection) { // sanity check sprite id if (sprite.spriteId < 0 || sprite.spriteId >= sprite.collection.Count) { sprite.spriteId = 0; sprite.EditMode__CreateCollider(); } int newSpriteId = sprite.spriteId; if (generatorCache.current) { newSpriteId = tk2dEditorUtility.SpriteSelectorPopup("Sprite", sprite.spriteId, generatorCache.current); if (tk2dPreferences.inst.displayTextureThumbs) { if (generatorCache.current.version < 1) { GUILayout.Label("No thumbnail data.\nPlease rebuild Sprite Collection."); } else { var tex = tk2dSpriteThumbnailCache.GetThumbnailTexture(generatorCache.current, sprite.spriteId); if (tex) { float w = tex.width; float h = tex.height; float maxSize = 128.0f; if (w > maxSize) { h = h / w * maxSize; w = maxSize; } Rect r = GUILayoutUtility.GetRect(w, h); GUI.DrawTexture(r, tex, ScaleMode.ScaleToFit); //GUILayout.Box(tex, GUILayout.Width(w), GUILayout.Height(h)); } } } } else { newSpriteId = EditorGUILayout.IntSlider(sprite.spriteId, 0, sprite.collection.Count - 1); } if (newSpriteId != sprite.spriteId) { sprite.spriteId = newSpriteId; sprite.EditMode__CreateCollider(); GUI.changed = true; } sprite.color = EditorGUILayout.ColorField("Color", sprite.color); Vector3 newScale = EditorGUILayout.Vector3Field("Scale", sprite.scale); if (newScale != sprite.scale) { sprite.scale = newScale; sprite.EditMode__CreateCollider(); } EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("HFlip")) { Vector3 s = sprite.scale; s.x *= -1.0f; sprite.scale = s; GUI.changed = true; } if (GUILayout.Button("VFlip")) { Vector3 s = sprite.scale; s.y *= -1.0f; sprite.scale = s; GUI.changed = true; } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(new GUIContent("Reset Scale", "Set scale to 1"))) { Vector3 s = sprite.scale; s.x = Mathf.Sign(s.x); s.y = Mathf.Sign(s.y); s.z = Mathf.Sign(s.z); sprite.scale = s; GUI.changed = true; } if (GUILayout.Button(new GUIContent("Bake Scale", "Transfer scale from transform.scale -> sprite"))) { tk2dScaleUtility.Bake(sprite.transform); GUI.changed = true; } GUIContent pixelPerfectButton = new GUIContent("1:1", "Make Pixel Perfect"); if (GUILayout.Button(pixelPerfectButton)) { if (tk2dPixelPerfectHelper.inst) { tk2dPixelPerfectHelper.inst.Setup(); } sprite.MakePixelPerfect(); GUI.changed = true; } sprite.pixelPerfect = GUILayout.Toggle(sprite.pixelPerfect, new GUIContent("Always", "Always keep pixel perfect"), GUILayout.Width(60.0f)); EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.IntSlider("Need a collection bound", 0, 0, 1); } if (GUI.changed) { EditorUtility.SetDirty(sprite); } }