// ------------------------------------------------------------------ // Desc: // NOTE: only used in Editor // ------------------------------------------------------------------ public void ForceSetParent(exLayer _parent) { // check if it is parent layer or child exLayer parentLayer = _parent; exLayer lastLayer = this; while (parentLayer != null) { if (parentLayer == this) { Debug.LogWarning("can't add self or child as parent"); return; } lastLayer = parentLayer; parentLayer = lastLayer.parent; } // if (parent_) { parent_.children_.Remove(this); } // if (_parent) { _parent.children_.Add(this); } // update layer mng parentLayer = (parent_ == null ? _parent : parent_); lastLayer = this; while (parentLayer != null) { lastLayer = parentLayer; parentLayer = lastLayer.parent; } exLayerMng layerMng = lastLayer as exLayerMng; if (layerMng) { layerMng.AddDirtyLayer(layerMng); } // parent_ = _parent; }
// ------------------------------------------------------------------ // Desc: manually add the layer to layerMng's dirty layer list, useful when rotate the sprite by transform.rotation // ------------------------------------------------------------------ public void Dirty() { exLayer lastLayer = this; exLayer parentLayer = parent_; while (parentLayer != null) { lastLayer = parentLayer; parentLayer = lastLayer.parent; } exLayerMng layerMng = lastLayer as exLayerMng; if (layerMng) { layerMng.AddDirtyLayer(this); } }
// ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ void OnGUI() { EditorGUI.indentLevel = 0; // ======================================================== // check if selection valid // ======================================================== // if (curEditGO == null) { GUILayout.Space(10); GUILayout.Label("Please select a GameObject for editing"); return; } // if (curEditGO.GetComponent <Camera>()) { curLayer = curEditGO.GetComponent <exLayerMng>(); if (curLayer == null) { if (GUILayout.Button("Add Layer Manager", GUILayout.Width(200))) { curLayer = curEditGO.AddComponent <exLayerMng> (); } } } else { // curLayer = curEditGO.GetComponent <exLayer>(); if (curLayer == null) { GUILayout.Space(10); GUILayout.Label("There is no edit layer in this GameObject"); return; } } // if (curLayer == null) { GUILayout.Label("Invalid GameObject"); return; } // ======================================================== // toolbar // ======================================================== GUILayout.BeginHorizontal(EditorStyles.toolbar); // ======================================================== // update button // ======================================================== GUILayout.FlexibleSpace(); exLayerMng layerMng = curLayer as exLayerMng; GUI.enabled = (layerMng != null); if (GUILayout.Button("Update", EditorStyles.toolbarButton)) { layerMng.AddDirtyLayer(layerMng); EditorUtility.SetDirty(layerMng); } GUI.enabled = true; GUILayout.Space(5); // ======================================================== // lock button // ======================================================== lockSelection = GUILayout.Toggle(lockSelection, "Lock", EditorStyles.toolbarButton); GUILayout.EndHorizontal(); // ======================================================== // scroll view // ======================================================== float toolbarHeight = EditorStyles.toolbar.CalcHeight(new GUIContent(""), 0); scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(position.width), GUILayout.Height(position.height - toolbarHeight)); GUILayout.Space(10); // ======================================================== // draw the tree // ======================================================== // float space = 5.0f; Rect lastRect = GUILayoutUtility.GetLastRect(); LayerTreeField(space, lastRect.yMax, curLayer); GUILayout.Space(5); // ======================================================== // Clear All Layer Button // ======================================================== Color oldBGColor = GUI.backgroundColor; Color oldCTColor = GUI.contentColor; GUI.backgroundColor = Color.red; GUI.contentColor = Color.yellow; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Remove All Layers", GUILayout.Width(120))) { bool doRemove = EditorUtility.DisplayDialog("Warning!", "This operation will remove all exLayer Component in the editor, do you want to continue operation", "Yes", "No"); if (doRemove) { RecursivelyDestroyLayer(curLayer); } } GUILayout.EndHorizontal(); GUI.backgroundColor = oldBGColor; GUI.contentColor = oldCTColor; // ======================================================== // process mouse event Event e = Event.current; // ======================================================== if (e.type == EventType.MouseDown && e.button == 0 && e.clickCount == 1) { selectedLayers.Clear(); e.Use(); Repaint(); } else if (e.type == EventType.MouseUp) { inDragState = false; e.Use(); Repaint(); } // do add GameObject to layerMng else if (e.type == EventType.DragUpdated) { // Show a copy icon on the drag foreach (Object o in DragAndDrop.objectReferences) { if (o is GameObject) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; break; } } } else if (e.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); try { EditorUtility.DisplayProgressBar("Add new layer items", "Add new layer itmes...", 0.5f); // Object oldSelActiveObject = null; List <Object> oldSelObjects = new List <Object>(); foreach (Object o in Selection.objects) { oldSelObjects.Add(o); } oldSelActiveObject = Selection.activeObject; // List <exLayer> addedLayers = new List <exLayer>(); List <exLayer> newLayers = new List <exLayer>(); foreach (Object o in DragAndDrop.objectReferences) { // never add self, it cause dead loop if (o == curEditGO) { continue; } // Selection.activeObject = o; Object[] objects = Selection.GetFiltered(typeof(GameObject), SelectionMode.Deep); foreach (Object obj in objects) { if (obj) { GameObject go = obj as GameObject; exLayer layer = go.GetComponent <exLayer>(); if (layer == null) { layer = go.AddComponent <exLayer>(); newLayers.Add(layer); } if (addedLayers.IndexOf(layer) == -1) { addedLayers.Add(layer); } } } } // sync new layer's parent foreach (exLayer layer in newLayers) { Transform parent = layer.transform.parent; while (parent != null) { exLayer parentLayer = parent.GetComponent <exLayer>(); if (parentLayer) { layer.parent = parentLayer; break; } parent = parent.parent; } } // List <exLayer> parentOfNewLayers = new List <exLayer>(); foreach (exLayer li in addedLayers) { if (addedLayers.IndexOf(li.parent) == -1) { parentOfNewLayers.Add(li); } } foreach (exLayer li in parentOfNewLayers) { if (li.parent != null) { EditorUtility.SetDirty(li.parent); } li.ForceSetParent(curLayer); EditorUtility.SetDirty(li); } EditorUtility.SetDirty(curLayer); // Selection.objects = oldSelObjects.ToArray(); Selection.activeObject = oldSelActiveObject; EditorUtility.ClearProgressBar(); } catch (System.Exception) { EditorUtility.ClearProgressBar(); throw; } Repaint(); } EditorGUILayout.EndScrollView(); }