예제 #1
0
        public virtual void SetNodeStyle(SO_Node node)
        {
            if (node.nodeType == 0)
            {
                node.square = new Rect(40, 40, 150, 80);
            }
            else
            {
                node.parent   = this;
                node.btParent = btParent;
                node.square   = new Rect(this.square.x, this.square.y - -80, 150, 80);
            }

            node.defaultNodeStyle = new GUIStyle();
            node.NodeStyleName    = GetNodeTypeStyle(node, false);
            node.defaultNodeStyle.normal.background = EditorGUIUtility.Load($"builtin skins/darkskin/images/{ GetNodeTypeStyle(node, false)}.png") as Texture2D;
            node.defaultNodeStyle.border            = new RectOffset(12, 12, 12, 12);
            node.defaultNodeStyle.alignment         = TextAnchor.UpperCenter;
            node.defaultNodeStyle.normal.textColor  = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
            node.style = node.defaultNodeStyle;

            node.selectedNodeStyle = new GUIStyle();
            node.selectedNodeStyle.normal.background = EditorGUIUtility.Load($"builtin skins/darkskin/images/{ GetNodeTypeStyle(node, true)}.png") as Texture2D;
            node.selectedNodeStyle.border            = new RectOffset(12, 12, 12, 12);
            node.selectedNodeStyle.alignment         = TextAnchor.UpperCenter;
            node.selectedNodeStyle.normal.textColor  = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);

            //node.Icon = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/AndreLibrary/Editor/DebugNode_Icon.png");
            node.SetNodeIcon();

            node.nameNode = "\n" + node.name; //+ "\n" + node.Type;
        }
        private float SideMenuDeleteNode(Rect square, Vector2 pos, GUIStyle defaultNodeStyle, float offset)
        {
            float   heightOffset = offset + 30;
            Vector2 size         = new Vector2(140, 20);

            pos.x = square.x + (square.width / 2) - 70;
            pos.y = square.y + square.height - (square.height - heightOffset);
            Rect rect = new Rect(pos, size);

            if (GUI.Button(rect, "Delete Node"))
            {
                if (SideMenuAssetToUpdate == BehaviourTree.root)
                {
                    BehaviourTree.RemoveNode(BehaviourTree.root.name);
                }
                else
                {
                    SideMenuAssetToUpdate.parent.RemoveNode(SideMenuAssetToUpdate.name);
                }

                SideMenuAssetToUpdate = null;
                RefreshAsset();
            }
            return(0);
        }
 public void AddNode(SO_Node node)
 {
     node.SetNodeStyle(node);
     root = node;
     AssetDatabase.AddObjectToAsset(node, this);
     AssetDatabase.SaveAssets();
 }
        private void OnGUI()
        {
            if (tex == null)
            {
                tex = AssetDatabase.LoadAssetAtPath <Texture>("Assets/AndreLibrary/Editor/BT/BT_Lighter_Black.jpg");
            }

            GUI.DrawTexture(new Rect(0, 0, maxSize.x, maxSize.y), tex, ScaleMode.StretchToFill);

            DrawGrid(20, 0.2f, Color.gray);
            DrawGrid(100, 0.4f, Color.gray);

            if (window != null)
            {
                _zoomArea = new Rect(0, 0, window.position.width, window.position.height);
            }
            if (BehaviourTree != null)
            {
                if (BehaviourTree.root != null)
                {
                    EditorZoomArea.Begin(_zoom, _zoomArea);
                    BehaviourTree.root.DrawInEditor(Event.current);
                    AssetToUpdate = BehaviourTree.root.ProcessNodeEvents(Event.current);
                    EditorZoomArea.End();
                }
                HelperWindow();
                ProcessEvents(Event.current);
                Repaint();
            }
        }
예제 #5
0
        public virtual string GetNodeTypeStyle(SO_Node node, bool On)
        {
            switch (node.nodeType)
            {
            case 0:
                //root
                return(On ? "node1 on" : "node1");

            case 1:
                //composite
                return(On ? "node3 on" : "node3");

            case 2:
                //decorator
                return(On ? "node5 on" : "node5");

            case 3:
                //leaf
                return(On ? "node2 on" : "node2");

            case 4:
                //debug
                return(On ? "node6 on" : "node6");
            }
            return(On ? "node1 on" : "node1");
        }
        private void OnClickAddRoot(Vector2 mousePosition, NODEOPTIONS options)
        {
            SO_Node node = null;

            switch (options)
            {
            case NODEOPTIONS.Selector:
                node          = BehaviourTree.Create <SO_Selector>(name);
                node.Type     = "Selector";
                node.nodeType = (int)NODETYPE.Root;
                break;

            case NODEOPTIONS.Sequence:
                node          = BehaviourTree.Create <SO_Sequence>(name);
                node.Type     = "Sequence";
                node.nodeType = (int)NODETYPE.Root;
                break;

            case NODEOPTIONS.BooleanSelector:
                node          = BehaviourTree.Create <SO_BooleanSelector>(name);
                node.Type     = "BSelector";
                node.nodeType = (int)NODETYPE.Root;
                break;
            }
            node.name     = "Root";
            node.btParent = BehaviourTree;
            BehaviourTree.AddNode(node, mousePosition);
            InContexMenu = false;
        }
예제 #7
0
 public override void AddNode(SO_Node node)
 {
     base.AddNode(node);
     Children.Add(node);
     m_node = node;
     AssetDatabase.AddObjectToAsset(node, this);
     AssetDatabase.SaveAssets();
 }
 public void AddNode(SO_Node node, Vector2 pos)
 {
     node.SetNodeStyle(node);
     node.square.position = pos;
     root = node;
     AssetDatabase.AddObjectToAsset(node, this);
     AssetDatabase.SaveAssets();
 }
 public void RemoveNode(string name)
 {
     if (root == null)
     {
         return;
     }
     root.DestroyNode(root, true);
     root = null;
 }
예제 #10
0
 public override void DestroyNode(Object obj, bool allowDestroyingAssets = false)
 {
     foreach (var node in Children)
     {
         node.DestroyNode(node, true);
     }
     Children.Clear();
     m_node = null;
     DestroyImmediate(obj, true);
 }
예제 #11
0
        public override void RemoveNode(string name)
        {
            if (m_node == null)
            {
                return;
            }

            Children.Remove(m_node);
            m_node.DestroyNode(m_node, true);
            m_node = null;
        }
        public static void OpenEditorWindow(SO_Node Asset, Rect pos)
        {
            SO_RenamePopUpWindow window = ScriptableObject.CreateInstance <SO_RenamePopUpWindow>();
            Texture    icon             = AssetDatabase.LoadAssetAtPath <Texture>("Assets/AndreLibrary/Editor/BT_Icon.png");
            GUIContent titleContent     = new GUIContent("Rename " + Asset.name, icon);

            AssetToUpdate       = Asset;
            window.titleContent = titleContent;
            window.position     = pos;
            tex = AssetDatabase.LoadAssetAtPath <Texture>("Assets/AndreLibrary/Editor/BT_Lighter_Grey_Blue.jpg");
            window.ShowModalUtility();
        }
        public override void OnInspectorGUI()
        {
            myTarget = (SO_BehaviourTree)target;

            DrawDefaultInspector();

            GUILayout.Space(20);

            tab = GUILayout.Toolbar(tab, new string[] { "Add", "Remove" });
            switch (tab)
            {
            case 0:
                op = (NODEOPTIONS)EditorGUILayout.EnumPopup("Node to create:", op);
                if (op != NODEOPTIONS.None)
                {
                    name = EditorGUILayout.TextField("Node Name: ", name);
                    if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && !myTarget.ContainsName(name))
                    {
                        if (GUILayout.Button("Add Node"))
                        {
                            SO_Node node = GetNodeType(op, name);
                            if (node != null)
                            {
                                myTarget.AddNode(node);
                            }
                        }
                    }
                }
                break;

            case 1:
                name = EditorGUILayout.TextField("Node Name: ", name);
                if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && myTarget.ContainsName(name))
                {
                    if (GUILayout.Button("Remove Nodes"))
                    {
                        myTarget.RemoveNode(name);
                        AssetDatabase.Refresh();
                        AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(myTarget), ImportAssetOptions.ForceUpdate);
                    }
                }
                break;

            default:
                break;
            }
        }
        private bool CheckCanAdd(SO_Node _AssetToUpdate)
        {
            if (_AssetToUpdate.nodeType == (int)NODETYPE.Leaf || _AssetToUpdate.nodeType == (int)NODETYPE.Debug)
            {
                return(false);
            }

            if (_AssetToUpdate.nodeType == (int)NODETYPE.Decorator && _AssetToUpdate.Children.Count == 1)
            {
                return(false);
            }

            if (_AssetToUpdate.Type == "BSelector" && _AssetToUpdate.Children.Count == 3)
            {
                return(false);
            }

            return(true);
        }
예제 #15
0
        public SO_Node ProcessNodeEvents(Event e)
        {
            SO_Node UpdateAsset = null;

            Children.Reverse();
            foreach (var node in Children)
            {
                SO_Node tmp = node.ProcessNodeEvents(e);
                if (tmp != null)
                {
                    UpdateAsset = tmp;
                }
            }
            Children.Reverse();
            if (UpdateAsset == null)
            {
                UpdateAsset = ProcessEvents(e);
            }
            return(UpdateAsset);
        }
예제 #16
0
        public override void MoveNodePositions(string NodeAName, string NodeBName)
        {
            if (!ListContainsByName(NodeAName, m_nodes) || !ListContainsByName(NodeBName, m_nodes))
            {
                return;
            }
            int NodeAIndex = GetInListByName(NodeAName, m_nodes);
            int NodeBIndex = GetInListByName(NodeBName, m_nodes);

            SO_Node NodeA    = m_nodes[NodeAIndex];
            SO_Node NodeB    = m_nodes[NodeBIndex];
            Vector2 posNodeA = NodeA.square.position;
            Vector2 posNodeB = NodeB.square.position;

            m_nodes[NodeAIndex].SetNewPos(posNodeB);
            m_nodes[NodeBIndex].SetNewPos(posNodeA);
            m_nodes[NodeAIndex]  = NodeB;
            m_nodes[NodeBIndex]  = NodeA;
            Children[NodeAIndex] = NodeB;
            Children[NodeBIndex] = NodeA;
        }
예제 #17
0
        public override void AddNode(SO_Node node)
        {
            int i = 1;

            foreach (var obj in m_nodes)
            {
                if (obj == null)
                {
                    break;
                }
                i++;
            }
            if (i > m_nodes.Length)
            {
                return;
            }
            m_nodes[i - 1] = node;
            base.AddNode(node);
            Children.Add(node);
            AssetDatabase.AddObjectToAsset(node, this);
            AssetDatabase.SaveAssets();
        }
예제 #18
0
        public override void MoveNodePositions(string NodeAName, string NodeBName)
        {
            int NodeAIndex = 0;
            int NodeBIndex = 0;
            int i          = 0;

            foreach (var node in m_nodes)
            {
                if (node.name == NodeAName)
                {
                    NodeAIndex = i;
                }

                if (node.name == NodeBName)
                {
                    NodeBIndex = i;
                }
                i++;
            }

            if (NodeAIndex == 0 && NodeBIndex == 0)
            {
                return;
            }

            SO_Node NodeA    = m_nodes[NodeAIndex];
            SO_Node NodeB    = m_nodes[NodeBIndex];
            Vector2 posNodeA = NodeA.square.position;
            Vector2 posNodeB = NodeB.square.position;

            m_nodes[NodeAIndex].SetNewPos(posNodeB);
            m_nodes[NodeBIndex].SetNewPos(posNodeA);
            m_nodes[NodeAIndex]  = NodeB;
            m_nodes[NodeBIndex]  = NodeA;
            Children[NodeAIndex] = NodeB;
            Children[NodeBIndex] = NodeA;
        }
        private void OnClickAddNode(NODEOPTIONS options, SO_Node _AssetToUpdate)
        {
            SO_Node node = null;

            switch (options)
            {
            case NODEOPTIONS.Selector:
                node          = _AssetToUpdate.Create <SO_Selector>(name);
                node.Type     = "Selector";
                node.nodeType = (int)NODETYPE.Composite;
                break;

            case NODEOPTIONS.Sequence:
                node          = _AssetToUpdate.Create <SO_Sequence>(name);
                node.Type     = "Sequence";
                node.nodeType = (int)NODETYPE.Composite;
                break;

            case NODEOPTIONS.BooleanSelector:
                node          = _AssetToUpdate.Create <SO_BooleanSelector>(name);
                node.Type     = "BSelector";
                node.nodeType = (int)NODETYPE.Composite;
                break;

            case NODEOPTIONS.FailRepeater:
                node = _AssetToUpdate.Create <SO_FailRepeater>(name);
                node.SwapableNodes = false;
                node.Type          = "FRepeater";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.FakeSate:
                node = _AssetToUpdate.Create <SO_FakeSate>(name);
                node.SwapableNodes = false;
                node.Type          = "FakeSate";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.InfiniteRepeater:
                node = _AssetToUpdate.Create <SO_InfiniteRepeater>(name);
                node.SwapableNodes = false;
                node.Type          = "IRepeater";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.Inverter:
                node = _AssetToUpdate.Create <SO_Inverter>(name);
                node.SwapableNodes = false;
                node.Type          = "Inverter";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.Limiter:
                node = _AssetToUpdate.Create <SO_Limiter>(name);
                node.SwapableNodes = false;
                node.Type          = "Limiter";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.Repeater:
                node = _AssetToUpdate.Create <SO_Repeater>(name);
                node.SwapableNodes = false;
                node.Type          = "Repeater";
                node.nodeType      = (int)NODETYPE.Decorator;
                break;

            case NODEOPTIONS.Leaf:
                node = _AssetToUpdate.Create <SO_LeafNode>(name);
                node.SwapableNodes = false;
                node.Type          = "Leaf";
                node.nodeType      = (int)NODETYPE.Leaf;
                break;

            case NODEOPTIONS.Debug:
                node = _AssetToUpdate.Create <SO_TestNode>(name);
                node.SwapableNodes = false;
                node.Type          = "Debug";
                node.nodeType      = (int)NODETYPE.Debug;
                break;
            }
            string tempBaseName = "New Node";
            string tempName     = tempBaseName;
            int    number       = 0;

            while (_AssetToUpdate.ContainsName(tempName))
            {
                tempName = tempBaseName + $" {number}";
                number++;
            }
            node.name = tempName;
            _AssetToUpdate.AddNode(node);
            InContexMenu = false;
        }
예제 #20
0
        public override void OnInspectorGUI()
        {
            myTarget  = (SO_Node)target;
            assetName = EditorGUILayout.TextField("New asset name: ", assetName);
            if (!string.IsNullOrEmpty(assetName) && !string.IsNullOrWhiteSpace(assetName) &&
                assetName != myTarget.name)
            {
                if (GUILayout.Button("Change Name"))
                {
                    myTarget.ChangeName(assetName);
                }
            }

            GUILayout.Space(20);

            //serializedObject.Update();
            // EditorList.Show(serializedObject.FindProperty("m_nodes"), EditorListOption.ElementLabels | EditorListOption.Buttons);
            //serializedObject.ApplyModifiedProperties();

            DrawDefaultInspector();

            GUILayout.Space(20);

            if (myTarget.SwapableNodes)
            {
                tab = GUILayout.Toolbar(tab, new string[] { "Add", "Swap", "Remove" });
                switch (tab)
                {
                case 0:
                    op = (NODEOPTIONS)EditorGUILayout.EnumPopup("Node to create:", op);
                    if (op != NODEOPTIONS.None)
                    {
                        name = EditorGUILayout.TextField("Node Name: ", name);
                        if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && !myTarget.ContainsName(name))
                        {
                            if (GUILayout.Button("Add Node"))
                            {
                                SO_Node node = GetNodeType(op, name);
                                if (node != null)
                                {
                                    myTarget.AddNode(node);
                                }
                            }
                        }
                    }
                    break;

                case 1:
                    if (!myTarget.NodeAdd)
                    {
                        return;
                    }
                    nodeAName = EditorGUILayout.TextField("Node A Name: ", nodeAName);
                    nodeBName = EditorGUILayout.TextField("Node B Name: ", nodeBName);
                    if ((!string.IsNullOrEmpty(nodeAName) && !string.IsNullOrWhiteSpace(nodeAName) && myTarget.ContainsName(nodeAName)) &&
                        (!string.IsNullOrEmpty(nodeBName) && !string.IsNullOrWhiteSpace(nodeBName) && myTarget.ContainsName(nodeBName)))
                    {
                        if (GUILayout.Button("Swap Nodes"))
                        {
                            myTarget.MoveNodePositions(nodeAName, nodeBName);
                        }
                    }
                    break;

                case 2:
                    name = EditorGUILayout.TextField("Node Name: ", name);
                    if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && myTarget.ContainsName(name))
                    {
                        if (GUILayout.Button("Remove Nodes"))
                        {
                            myTarget.RemoveNode(name);
                            //AssetDatabase.Refresh();
                            // AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(myTarget), ImportAssetOptions.ForceUpdate);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
            else
            {
                if (!myTarget.NodeAdd)
                {
                    return;
                }

                tab = GUILayout.Toolbar(tab, new string[] { "Add", "Remove" });
                switch (tab)
                {
                case 0:
                    op = (NODEOPTIONS)EditorGUILayout.EnumPopup("Node to create:", op);
                    if (op != NODEOPTIONS.None)
                    {
                        name = EditorGUILayout.TextField("Node Name: ", name);
                        if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && !myTarget.ContainsName(name))
                        {
                            if (GUILayout.Button("Add Node"))
                            {
                                SO_Node node = GetNodeType(op, name);
                                if (node != null)
                                {
                                    myTarget.AddNode(node);
                                }
                            }
                        }
                    }
                    break;

                case 1:
                    name = EditorGUILayout.TextField("Node Name: ", name);
                    if (!string.IsNullOrEmpty(name) && !string.IsNullOrWhiteSpace(name) && myTarget.ContainsName(name))
                    {
                        if (GUILayout.Button("Remove Nodes"))
                        {
                            myTarget.RemoveNode(name);
                            AssetDatabase.Refresh();
                            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(myTarget), ImportAssetOptions.ForceUpdate);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }
예제 #21
0
 public virtual void AddNode(SO_Node node)
 {
     SetNodeStyle(node);
 }
        public SO_Node GetNodeType(NODEOPTIONS options, string name)
        {
            SO_Node node = null;

            switch (options)
            {
            case NODEOPTIONS.Selector:
                node      = myTarget.Create <SO_Selector>(name);
                node.Type = "Selector";
                break;

            case NODEOPTIONS.Sequence:
                node      = myTarget.Create <SO_Sequence>(name);
                node.Type = "Sequence";
                break;

            case NODEOPTIONS.BooleanSelector:
                node      = myTarget.Create <SO_BooleanSelector>(name);
                node.Type = "BSelector";
                break;

            case NODEOPTIONS.FailRepeater:
                node = myTarget.Create <SO_FailRepeater>(name);
                node.SwapableNodes = false;
                node.Type          = "FRepeater";
                break;

            case NODEOPTIONS.FakeSate:
                node = myTarget.Create <SO_FakeSate>(name);
                node.SwapableNodes = false;
                node.Type          = "FakeSate";
                break;

            case NODEOPTIONS.InfiniteRepeater:
                node = myTarget.Create <SO_InfiniteRepeater>(name);
                node.SwapableNodes = false;
                node.Type          = "IRepeater";
                break;

            case NODEOPTIONS.Inverter:
                node = myTarget.Create <SO_Inverter>(name);
                node.SwapableNodes = false;
                node.Type          = "Inverter";
                break;

            case NODEOPTIONS.Limiter:
                node = myTarget.Create <SO_Limiter>(name);
                node.SwapableNodes = false;
                node.Type          = "Limiter";
                break;

            case NODEOPTIONS.Repeater:
                node = myTarget.Create <SO_Repeater>(name);
                node.SwapableNodes = false;
                node.Type          = "Repeater";
                break;

            case NODEOPTIONS.Leaf:
                node = myTarget.Create <SO_LeafNode>(name);
                node.SwapableNodes = false;
                node.Type          = "Leaf";
                break;

            case NODEOPTIONS.Debug:
                node = myTarget.Create <SO_TestNode>(name);
                node.SwapableNodes = false;
                node.Type          = "Debug";
                break;

            default:
                break;
            }
            node.btParent = myTarget;
            node.nodeType = (int)NODETYPE.Root;
            return(node);
        }
예제 #23
0
 public override void AddNode(SO_Node node)
 {
 }
        private void HelperWindow()
        {
            if (window == null)
            {
                return;
            }

            if (AssetToUpdate != null)
            {
                SideMenuAssetToUpdate = AssetToUpdate;
            }
            if (SideMenuAssetToUpdate == null && BehaviourTree.root != null)
            {
                SideMenuAssetToUpdate = BehaviourTree.root;
            }

            GUIStyle defaultNodeStyle = new GUIStyle();

            defaultNodeStyle.normal.background = sidemenuTex;
            defaultNodeStyle.border            = new RectOffset(0, 0, 0, 0);
            defaultNodeStyle.alignment         = TextAnchor.UpperCenter;
            defaultNodeStyle.normal.textColor  = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
            float windowWidth = window.position.width * 0.2f;

            if (windowWidth < 200)
            {
                windowWidth = 200;
            }
            sideMenuSquare = new Rect(window.position.width - (windowWidth), 0, windowWidth, window.position.height);
            Vector2 pos          = sideMenuSquare.position;
            float   heightOffset = 20;

            GUI.Box(sideMenuSquare, "", defaultNodeStyle);
            defaultNodeStyle.normal.background = null;

            Vector2 size = new Vector2(windowWidth, sideMenuSquare.height + 10);

            pos.x = window.position.width - (windowWidth);
            pos.y = sideMenuSquare.y + sideMenuSquare.height - (sideMenuSquare.height - heightOffset + 20);
            Rect rect = new Rect(pos, size);

            NumberOfChildren = SideMenuAssetToUpdate.Children.Count - 1;
            float scrollheight = (8 * 60) + 150;

            if (scrollheight <= (8 * 60))
            {
                scrollheight = (NumberOfChildren * 60) + 265;
            }
            Vector2 viewSize = new Vector2(windowWidth, scrollheight);
            Rect    viewRect = new Rect(pos, viewSize);

            scrollPos = GUI.BeginScrollView(rect, scrollPos, viewRect, false, true);

            if (BehaviourTree.root == null)
            {
                GUI.Label(sideMenuSquare, "\nNo Nodes In Tree", defaultNodeStyle);
                SideMenuAddRoot(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                GUI.EndScrollView();
                return;
            }
            GUI.Label(sideMenuSquare, "\n" + SideMenuAssetToUpdate.name, defaultNodeStyle);
            if (SideMenuAssetToUpdate.nodeType == (int)NODETYPE.Leaf || SideMenuAssetToUpdate.nodeType == (int)NODETYPE.Debug)
            {
                heightOffset = heightOffset + 20;
                size         = new Vector2(140, 20);
                pos.x        = sideMenuSquare.x + (sideMenuSquare.width / 2) - 70;
                pos.y        = sideMenuSquare.y + sideMenuSquare.height - (sideMenuSquare.height - heightOffset);
                rect         = new Rect(pos, size);
                tab          = GUI.Toolbar(rect, tab, new string[] { "Current", "        " });
                tab          = 0;
                if (tab == 0)
                {
                    heightOffset = SideMenuChangeName(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                    SideMenuDeleteNode(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                }
            }
            else
            {
                heightOffset = heightOffset + 20;
                size         = new Vector2(140, 20);
                pos.x        = sideMenuSquare.x + (sideMenuSquare.width / 2) - 70;
                pos.y        = sideMenuSquare.y + sideMenuSquare.height - (sideMenuSquare.height - heightOffset);
                rect         = new Rect(pos, size);
                tab          = GUI.Toolbar(rect, tab, new string[] { "Current", "Children" });
                if (tab == 0)
                {
                    heightOffset = SideMenuChangeName(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                    SideMenuDeleteNode(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                }
                if (tab == 1)
                {
                    heightOffset = ShowChildren(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                    heightOffset = SideMenuAddNode(sideMenuSquare, pos, defaultNodeStyle, heightOffset);
                }
            }
            GUI.EndScrollView();
        }