public void OnInspectorGUI(TileLayer layer, UniTileTemplate selection, TileLayerEditor editor) { if (layer.material == null) { return; } useScrollView = EditorGUILayout.Toggle("Use scrollview", useScrollView); float w = Mathf.Min(Screen.width, layer.material.mainTexture.width); //Mathf.Min(rect.width,layer.material.mainTexture.width); float scale = w / layer.material.mainTexture.width; float h = layer.material.mainTexture.height * scale; Rect rect = GUILayoutUtility.GetLastRect(); float top = rect.yMax; int tilesX = (int)Mathf.Floor((float)layer.material.mainTexture.width / (layer.tileSize.x + layer.borderSize.x * 2f)); int tileX1 = (int)Mathf.Floor((float)selection.selectedTile.id % (float)tilesX); int tileY1 = (int)Mathf.Floor((float)selection.selectedTile.id / (float)tilesX); int tileX2 = (int)Mathf.Floor((float)selection.selectedTileEnd.id % (float)tilesX); int tileY2 = (int)Mathf.Floor((float)selection.selectedTileEnd.id / (float)tilesX); int tileXMin = Mathf.Min(tileX1, tileX2); int tileYMin = Mathf.Min(tileY1, tileY2); int tileXMax = Mathf.Max(tileX1, tileX2); int tileYMax = Mathf.Max(tileY1, tileY2); int tileWidth = tileXMax - tileXMin + 1; int tileHeight = tileYMax - tileYMin + 1; float tempTop = top; if (useScrollView) { scale = 1; w = layer.material.mainTexture.width; h = layer.material.mainTexture.height; float scrollWidth = Screen.width - 25; float scrollHeight = h + 10; scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false, GUILayout.Height(scrollHeight), GUILayout.Width(scrollWidth)); GUILayout.Label("", GUILayout.Width(scrollWidth), GUILayout.Height(scrollHeight)); tempTop = 0; } else { GUILayout.Label("", GUILayout.Width(w), GUILayout.Height(h)); } GUI.DrawTexture(new Rect(0, tempTop, w, h), layer.material.mainTexture); if (selection.selectedTile.id >= 0 && !selection.tilesPicked) { GUIStyle style = new GUIStyle(GUI.skin.customStyles[0]); style.normal.background = SelectionTexture; GUI.Box( new Rect( (tileXMin * (layer.tileSize.x + layer.borderSize.x * 2f) + layer.borderSize.x) * scale, tempTop + (tileYMin * (layer.tileSize.y + layer.borderSize.y * 2f) + layer.borderSize.y) * scale, (tileWidth * (layer.tileSize.x + layer.borderSize.x * 2f) - layer.borderSize.x * 2f) * scale, (tileHeight * (layer.tileSize.y + layer.borderSize.y * 2f) - layer.borderSize.y * 2f) * scale ), "", style ); } if (useScrollView) { EditorGUILayout.EndScrollView(); } if (Event.current != null) { if (Event.current.type == EventType.MouseDown) { if (Event.current.button == 0) { Vector2 pos = Event.current.mousePosition; if (useScrollView) { pos += scrollPos; } this.selecting = true; selection.tilesPicked = false; if (pos.x >= 0 && pos.x <= layer.material.mainTexture.width * scale && pos.y >= top && pos.y <= top + layer.material.mainTexture.height * scale) { editor.selectedTemplate = -1; selection.selectedTile.id = selection.selectedTileEnd.id = (int)Mathf.Floor((pos.x / scale) / (layer.tileSize.x + layer.borderSize.x * 2f)) + (int)(Mathf.Floor((pos.y - top) / (scale * (layer.tileSize.y + layer.borderSize.y * 2f))) * tilesX); if (Event.current.clickCount == 2) { TileEditorWindow window = TileEditorWindow.CreateInstance <TileEditorWindow>(); window.Setup(editor, selection.selectedTilesList); window.ShowUtility(); } } } else { selection.tilesPicked = false; selection.selectedTile.id = -1; selection.selectedTileEnd.id = -1; } } if (Event.current.type == EventType.mouseDrag) { if (selecting) { Vector2 pos = Event.current.mousePosition; if (useScrollView) { pos += scrollPos; } if (pos.x >= 0 && pos.x <= layer.material.mainTexture.width * scale && pos.y >= top && pos.y <= top + layer.material.mainTexture.height * scale) { selection.selectedTileEnd.id = (int)Mathf.Floor((pos.x / scale) / (layer.tileSize.x + layer.borderSize.x * 2f)) + (int)(Mathf.Floor((pos.y - top) / (scale * (layer.tileSize.y + layer.borderSize.y * 2f))) * tilesX); selection.tilesPicked = false; selection.selectedTilesWidth = tileXMax - tileXMin + 1; selection.selectedTilesList = new TileInstance[(tileXMax - tileXMin + 1) * (tileYMax - tileYMin + 1)]; HandleUtility.Repaint(); if (selection.selectedTile.id >= 0) { for (int i = tileXMin; i <= tileXMax; i++) { for (int j = tileYMin; j <= tileYMax; j++) { int x = i - tileXMin; int y = j - tileYMin; selection.selectedTilesList[x + y * selection.selectedTilesWidth] = new TileInstance(i + j * tilesX); } } } else { selection.selectedTilesList[0] = new TileInstance(-1); } UniTileMarker.Instance.Init(selection); } } } if (Event.current.type == EventType.MouseUp) { selection.tilesPicked = false; selection.selectedTilesWidth = tileXMax - tileXMin + 1; selection.selectedTilesList = new TileInstance[(tileXMax - tileXMin + 1) * (tileYMax - tileYMin + 1)]; HandleUtility.Repaint(); if (selection.selectedTile.id >= 0) { for (int i = tileXMin; i <= tileXMax; i++) { for (int j = tileYMin; j <= tileYMax; j++) { int x = i - tileXMin; int y = j - tileYMin; selection.selectedTilesList[x + y * selection.selectedTilesWidth] = new TileInstance(i + j * tilesX); } } } else { selection.selectedTilesList[0] = new TileInstance(-1); } UniTileMarker.Instance.Init(selection); this.selecting = false; } } }
private void OnInspectorGUI_Properties(TileLayer layer) { EditorGUILayout.BeginVertical(); showProperties = EditorGUILayout.Foldout(showProperties, "Layer Properties"); if (layer.material != null && layer.tileset == null) { this.GetTileset(layer); } if (showProperties) { propertiesEditor.OnInspectorGUI(layer); if (layer.material != null) { GUILayout.BeginHorizontal(); int length = 2 + layer.tileset.templates.Length; string[] templates = new string[length]; templates[0] = "Choose a template"; for (int i = 0; i < layer.tileset.templates.Length; i++) { templates[i + 1] = i.ToString() + " - " + layer.tileset.templates[i].name; } templates[length - 1] = "Add current selection as a template"; int newSelectedTemplate = EditorGUILayout.Popup("Template", Mathf.Min(selectedTemplate + 1, length - 2), templates); selectedTemplate = newSelectedTemplate - 1; if (newSelectedTemplate == length - 1) { UniTileTemplate[] newList = new UniTileTemplate[layer.tileset.templates.Length + 1]; for (int i = 0; i < layer.tileset.templates.Length; i++) { newList[i] = layer.tileset.templates[i]; } newList[newList.Length - 1] = new UniTileTemplate(); newList[newList.Length - 1].Init(selection); layer.tileset.templates = newList; } else if (newSelectedTemplate > 0) { //layer.tileset.templates[selection - 1].Use(); SelectTemplate(layer.tileset.templates[newSelectedTemplate - 1]); } if (selectedTemplate >= 0 && selectedTemplate < layer.tileset.templates.Length && layer.tileset.templates[selectedTemplate] != null) { layer.tileset.templates[selectedTemplate].name = EditorGUILayout.TextField(layer.tileset.templates[selectedTemplate].name); if (GUILayout.Button("Delete")) { List <UniTileTemplate> newList = new List <UniTileTemplate>(); foreach (UniTileTemplate t in layer.tileset.templates) { if (t != layer.tileset.templates[selectedTemplate]) { newList.Add(t); } } layer.tileset.templates = newList.ToArray(); } } GUILayout.EndHorizontal(); UniTileMarker.Instance.Init(this.selection); } m_Object.Update(); EditorGUILayout.PropertyField(material); if (layer.material != material.objectReferenceValue) { layer.material = (Material)material.objectReferenceValue; m_Object.ApplyModifiedProperties(); this.GetTileset(layer); } } EditorGUILayout.EndVertical(); if (showProperties) { int x = 5; GUILayout.BeginHorizontal(); if (layer.parent == null) { if (GUILayout.Button(new GUIContent("Rebuild map", "Apply changes to the size properties."), GUILayout.Width(80), GUILayout.Height(30))) { //Undo.RegisterSceneUndo("Resize map"); Vector2 prevLayerSize = layer.layerSize; propertiesEditor.SetPropertiesTo(layer); for (int i = 0; i < layer.transform.childCount; i++) { TileLayer child = layer.transform.GetChild(i).GetComponent <TileLayer>(); if (child != null) { propertiesEditor.SetPropertiesTo(child); } } this.RebuildMap(prevLayerSize); UniTileMarker.Instance.Init(selection); } x += 80; if (GUILayout.Button(new GUIContent("Revert", "Cancel changes to the size properties."), GUILayout.Width(50), GUILayout.Height(30))) { propertiesEditor.SetPropertiesFrom(layer); } x += 50; } if (GUILayout.Button(new GUIContent("Clear layer", "Erase all tile data from the layer."), GUILayout.Width(70), GUILayout.Height(30))) { //Undo.RegisterSceneUndo("Clear layer"); this.ClearMap(); } x += 70; if (GUILayout.Button(new GUIContent("Create objects", "Instantiate tile prefabs and box colliders."), GUILayout.Width(90), GUILayout.Height(30))) { //Undo.RegisterSceneUndo("Clear layer"); TileLayerEditor.InstantiatePrefabs(layer); } x += 90; if (layer.parent == null && layer.material != null && layer.material.mainTexture != null) { if (GUILayout.Button(new GUIContent("Padder", "Add padding to textures."), GUILayout.Width(50), GUILayout.Height(30))) { PadderEditorWindow window = PadderEditorWindow.CreateInstance <PadderEditorWindow>(); window.Setup((Texture2D)layer.material.mainTexture, layer.tileSize, layer.borderSize); window.ShowUtility(); } } x += 50; if (selection.selectedTilesList.Length > 0 && layer.material != null && layer.material.mainTexture != null) { if (GUILayout.Button(new GUIContent("Edit Tiles", "Edit currently selected tiles."), GUILayout.Width(70), GUILayout.Height(30))) { TileEditorWindow window = TileEditorWindow.CreateInstance <TileEditorWindow>(); window.Setup(this, selection.selectedTilesList); window.ShowUtility(); } } GUILayout.EndHorizontal(); } }