Пример #1
0
    // ------------------------------------------------------------------
    // 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;
    }
Пример #2
0
    // ------------------------------------------------------------------
    // 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);
        }
    }
Пример #3
0
    // ------------------------------------------------------------------
    // 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();
    }