void OnEnable() { //AssetDatabase.Refresh(); //AssetPreview.SetPreviewTextureCacheSize(1000); // what? SceneView.onSceneGUIDelegate -= OnSceneGUI; SceneView.onSceneGUIDelegate += OnSceneGUI; EditorApplication.hierarchyWindowChanged -= OnHierarchyChanged; EditorApplication.hierarchyWindowChanged += OnHierarchyChanged; SrpgMtUtils.ShowUnityGrid(false); SrpgMtUtils.SetupGizmos(true); //SrpgMtUtils.AddLayer("SrpgMap"); //SrpgMapUtility.AddTag(); string[] assetGuids = AssetDatabase.FindAssets("SrpgMtConfigImpl"); //config = ScriptableObject.CreateInstance<SrpgMtConfig>(); config = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(assetGuids[0]), typeof(SrpgMtConfig)) as SrpgMtConfig; SetupCanvas(); SetupBrush(); SetupMap(); _layerAdding = false; _genLayerName = ""; _spriteSelection.Init(); //EditorSceneManager.MarkAllScenesDirty(); // what? }
void OnDestroy() { SceneView.onSceneGUIDelegate -= OnSceneGUI; EditorApplication.hierarchyWindowChanged -= OnHierarchyChanged; SrpgMtUtils.ShowUnityGrid(true); SrpgMtUtils.SetupGizmos(false); if (_canvas != null) { DestroyImmediate(_canvas.gameObject); _canvas = null; } if (_brush != null) { DestroyImmediate(_brush.gameObject); _brush = null; } if (_currMap != null) { _currMap.lastEditedTime = DateTime.Now.Ticks; _currMap = null; } if (_currLayer != null) { _currLayer.lastEditedTime = DateTime.Now.Ticks; _currLayer = null; } }
private void GUI_EditMode() { if (_currMap == null) { return; } EditorGUILayout.BeginHorizontal("box"); { if (GUILayout.Button("Generate map")) { toolMode = ToolMode.Generate; editMenu = EditMenu.None; } } EditorGUILayout.EndHorizontal(); GUI_Title("Edit map: " + _currMap.gameObject.name); EditorGUILayout.BeginVertical("box"); { EditorGUILayout.LabelField("Layers (z-index rank. name)"); GUIStyle buttonStyle = GUI.skin.GetStyle("Button"); buttonStyle.padding = new RectOffset(2, 2, 1, 1); String[] toolbars = { "↑", "↓", "x" }; for (int i = 0; i < _sortedLayer.Count; i++) { SrpgLayer layer = _sortedLayer[i]; if (layer == null) { Debug.LogWarning("layer is null"); continue; } EditorGUILayout.BeginHorizontal(); { Texture2D layerTex = layer.gameObject.activeSelf ? config.layerVisibleIcon : config.layerHiddenIcon; if (GUILayout.Button(layerTex, buttonStyle, GUILayout.Width(20), GUILayout.Height(15))) { layer.gameObject.SetActive(!layer.gameObject.activeSelf); } string layerName = (i + 1) + ". " + layer.gameObject.name; if (EditorGUILayout.ToggleLeft(layerName, layer == _currLayer)) { _currLayer = layer; } int clickedButton = GUILayout.Toolbar(-1, toolbars, GUILayout.Width(60)); if (clickedButton == 0) // up { _currMap.ZIndexUp(i); SetupLayer(); } else if (clickedButton == 1) // down { _currMap.ZIndexDown(i); SetupLayer(); } if (clickedButton == 2) // remove { if (_sortedLayer.Count > 1) { _sortedLayer.RemoveAt(i); Undo.DestroyObjectImmediate(layer.gameObject); } } } EditorGUILayout.EndHorizontal(); } if (!_layerAdding) { if (GUILayout.Button("Add Layer")) { _layerAdding = true; } } else { EditorGUILayout.BeginHorizontal(); { EditorGUILayout.LabelField("Name", GUILayout.Width(40)); _genLayerName = EditorGUILayout.TextField(_genLayerName); EditorGUILayout.LabelField("", GUILayout.Width(10)); // space //_genLayerTouchable = GUILayout.Toggle(_genLayerTouchable, "Touchable", GUILayout.Width(80)); if (GUILayout.Button("Add", GUILayout.Width(50))) { string layerName = _genLayerName; if (layerName.Length == 0) { layerName = "Layer"; } _currLayer = _currMap.CreateLayer(layerName, _genLayerTouchable); Undo.RegisterCreatedObjectUndo(_currLayer.gameObject, _currLayer.name); _layerAdding = false; _genLayerName = ""; } if (GUILayout.Button("Cancel", GUILayout.Width(50))) { _layerAdding = false; } } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); Texture2D prevTex = _tileset.texture; Rect boxRect = EditorGUILayout.BeginVertical("box"); { string tilesetName = (_tileset.texture == null ? "not selected" : _tileset.texture.name); _tileset.texture = (Texture2D)EditorGUILayout.ObjectField("Tileset: " + tilesetName, _tileset.texture, typeof(Texture2D), true, GUILayout.Height(40)); if (_tileset.texture == null && _currMap.lastTileset != null) { _tileset.texture = _currMap.lastTileset; } Sprite firstSprite = null; if (_tileset.texture != null) { string tilesetPath = AssetDatabase.GetAssetPath(_tileset.texture.GetInstanceID()); firstSprite = AssetDatabase.LoadAssetAtPath <Sprite>(tilesetPath); if (firstSprite != null) { _tileset.spriteWidth = firstSprite.rect.width; _tileset.spriteHeight = firstSprite.rect.height; EditorGUILayout.BeginHorizontal(); EditorGUILayout.HelpBox("Texture Size: " + _tileset.texture.width + " X " + _tileset.texture.height, MessageType.Info); EditorGUILayout.HelpBox("Sprite Size: " + _tileset.spriteWidth + " X " + _tileset.spriteHeight, MessageType.Info); EditorGUILayout.EndHorizontal(); _currMap.lastTileset = _tileset.texture; _tilesetBackColor = EditorGUILayout.ColorField("Background Color", _tilesetBackColor); } } } EditorGUILayout.EndVertical(); if (_tileset.texture == null) { return; } // draw background and tileset float sideMargin = 5; float rightMargin = 15; float tilesetOriginX = sideMargin; float tilesetOriginY = boxRect.y + boxRect.height + sideMargin; #if UNITY_EDITOR_OSX float scaledTilesetWidth = (Screen.width / 2) - (sideMargin + rightMargin); #else float scaledTilesetWidth = Screen.width - (sideMargin + rightMargin); #endif float tilesetScale = _tileset.texture.width / scaledTilesetWidth; float scaledTilesetHeight = _tileset.texture.height / tilesetScale; Rect tilesetRect = new Rect(tilesetOriginX, tilesetOriginY, scaledTilesetWidth, scaledTilesetHeight); EditorGUILayout.LabelField("", GUILayout.Height(scaledTilesetHeight), GUILayout.Width(scaledTilesetWidth - 5)); // tileset place holder Texture2D backTex = SrpgMtUtils.MakeAlphaTexture(1, 1, _tilesetBackColor); GUI.DrawTexture(tilesetRect, backTex, ScaleMode.StretchToFill); GUI.DrawTexture(tilesetRect, _tileset.texture); // draw lines int tilesetWidth = (int)(_tileset.texture.width / _tileset.spriteWidth); int tilesetHeight = (int)(_tileset.texture.height / _tileset.spriteHeight); float scaledSpriteWidth = _tileset.spriteWidth / tilesetScale; float scaledSpriteHeight = _tileset.spriteHeight / tilesetScale; //float scaledSpriteWidth = scaledTilesetWidth / tilesetWidth; //float scaledSpriteHeight = scaledTilesetHeight / tilesetHeight; Handles.BeginGUI(); { Handles.color = Color.white; for (int i = 1; i < tilesetWidth; i++) { float x = tilesetOriginX + scaledSpriteWidth * i; Handles.DrawLine(new Vector3(x, tilesetOriginY), new Vector3(x, tilesetOriginY + scaledTilesetHeight)); } for (int i = 1; i < tilesetHeight; i++) { float y = tilesetOriginY + scaledSpriteHeight * i; Handles.DrawLine(new Vector3(tilesetOriginX, y), new Vector3(tilesetOriginX + scaledTilesetWidth, y)); } } Handles.EndGUI(); // fill _sprites if (_tileset.texture != prevTex) { _sprites = new Sprite[tilesetWidth, tilesetHeight]; string tilesetPath = AssetDatabase.GetAssetPath(_tileset.texture.GetInstanceID()); Sprite[] rawSprites = AssetDatabase.LoadAllAssetsAtPath(tilesetPath).OfType <Sprite>().ToArray(); foreach (Sprite sprt in rawSprites) { float spriteCenterX = tilesetOriginX + sprt.rect.center.x / tilesetScale; float spriteCenterY = tilesetOriginY + (_tileset.texture.height - (sprt.rect.center.y)) / tilesetScale; int x = Mathf.FloorToInt((spriteCenterX - tilesetOriginX) / scaledSpriteWidth); int y = Mathf.FloorToInt((spriteCenterY - tilesetOriginY) / scaledSpriteHeight); _sprites[x, y] = sprt; } _spriteSelection.Init(); } // select sprites Event e = Event.current; if (e.button == 0) { if (e.type == EventType.MouseDown || e.type == EventType.MouseDrag) { Vector2 mousePos = e.mousePosition; foreach (Sprite sprt in _sprites) { if (sprt == null) { continue; } float spriteX = tilesetOriginX + sprt.rect.x / tilesetScale; float spriteY = tilesetOriginY + (_tileset.texture.height - (sprt.rect.y + sprt.rect.height)) / tilesetScale; if (mousePos.x > spriteX && mousePos.x < spriteX + scaledSpriteWidth && mousePos.y > spriteY && mousePos.y < spriteY + scaledSpriteHeight) { int selX = Mathf.FloorToInt((mousePos.x - tilesetOriginX) / scaledSpriteWidth); int selY = Mathf.FloorToInt((mousePos.y - tilesetOriginY) / scaledSpriteHeight); if (e.type == EventType.MouseDown) { _spriteSelection.dragSttX = _spriteSelection.dragEndX = selX; _spriteSelection.dragSttY = _spriteSelection.dragEndY = selY; _spriteSelection.changed = true; } else if (e.type == EventType.MouseDrag) { _spriteSelection.dragEndX = selX; _spriteSelection.dragEndY = selY; _spriteSelection.changed = true; } _spriteSelection.xMin = Mathf.Min(_spriteSelection.dragSttX, _spriteSelection.dragEndX); _spriteSelection.yMin = Mathf.Min(_spriteSelection.dragSttY, _spriteSelection.dragEndY); _spriteSelection.xMax = Mathf.Max(_spriteSelection.dragSttX, _spriteSelection.dragEndX); _spriteSelection.yMax = Mathf.Max(_spriteSelection.dragSttY, _spriteSelection.dragEndY); e.Use(); break; } } } else if (e.type == EventType.MouseUp) { if (_spriteSelection.changed) { _spriteSelection.changed = false; _brush.ResetSprites(_spriteSelection.xMin, _spriteSelection.yMin, _spriteSelection.xMax, _spriteSelection.yMax, _sprites); e.Use(); } } } // draw selection if (_spriteSelection.dragSttY >= 0 && _spriteSelection.dragSttX >= 0 && _spriteSelection.dragEndY >= 0 && _spriteSelection.dragEndX >= 0) { for (int y = _spriteSelection.yMin; y <= _spriteSelection.yMax; y++) { for (int x = _spriteSelection.xMin; x <= _spriteSelection.xMax; x++) { float scaledRectX = tilesetOriginX + scaledSpriteWidth * x; float scaledRectY = tilesetOriginY + scaledSpriteHeight * y; Rect selectionRect = new Rect(scaledRectX, scaledRectY, scaledSpriteWidth, scaledSpriteHeight); Texture2D selectionTex = SrpgMtUtils.MakeAlphaTexture(1, 1, new Color(0, 0.5f, 0.5f, 0.5f)); GUI.DrawTexture(selectionRect, selectionTex, ScaleMode.StretchToFill); } } } }