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(); } }
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; }
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; }
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); }
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); }
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); }
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; }
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(); }
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; }
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; } } }
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); }
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(); }