// Use this for initialization void Start() { agent = BehaviourTreeUtils.LoadBehaviourTree(xmlBehaviourTree); if (agent == null) { Debug.LogError("Unable to parse XML file " + xmlBehaviourTree.name); } }
/// <summary> /// Print all nodes of deserialized xml file on this editor window. Start from root node and it is a recursive call. /// </summary> /// <param name="node"></param> private void PrintNode(Node node) { string nameAttribute = ""; if (node.parent == null) { nameAttribute = "(Root) "; } if (GUI.Button(new Rect(lastPos, defaultSize), nameAttribute + node.GetType().Name, EditorStyles.toolbarButton)) { GenericMenu toolsMenu = new GenericMenu(); toolsMenu.AddItem(new GUIContent("Delete", "Delete this node and all sub nodes"), false, Delete, node); foreach (var item in BehaviourTreeUtils.GetEnumerableOfType <Node>()) { if (BehaviourTreeUtils.IsCondition(item)) { toolsMenu.AddItem(new GUIContent("Add Child/Conditions/" + item.Name), false, AddChild, new ModifiedItem(item.AssemblyQualifiedName, node)); toolsMenu.AddItem(new GUIContent("Change/Conditions/" + item.Name), false, ChangeNode, new ModifiedItem(item.AssemblyQualifiedName, node)); } else if (!BehaviourTreeUtils.IsCondition(item)) { toolsMenu.AddItem(new GUIContent("Add Child/Behaviours/" + item.Name), false, AddChild, new ModifiedItem(item.AssemblyQualifiedName, node)); toolsMenu.AddItem(new GUIContent("Change/Behaviours/" + item.Name), false, ChangeNode, new ModifiedItem(item.AssemblyQualifiedName, node)); } else { toolsMenu.AddItem(new GUIContent("Add Child/Custom/" + item.Name), false, AddChild, new ModifiedItem(item.AssemblyQualifiedName, node)); toolsMenu.AddItem(new GUIContent("Change/Custom/" + item.Name), false, ChangeNode, new ModifiedItem(item.AssemblyQualifiedName, node)); } } toolsMenu.DropDown(new Rect(lastPos + new Vector2(30, 0), new Vector2(150, 25))); } if (node.GetChildCount() <= 0) { return; } Tab(); foreach (var n in node.Children) { AddLine(); PrintNode(n); } LeaveTab(); }
void OnGUI() { //reset gui variables scrollHeight = 0; scrollWidth = 0; lastPos = new Vector2(5, 5); //start code if (DeserializedNode == null) { if (btFile == null) { newFileCreatedName = GUI.TextField(new Rect(lastPos, defaultSize + new Vector2(30, 0)), newFileCreatedName); Tab(200); if (GUI.Button(new Rect(lastPos, defaultSize + new Vector2(30, 10)), new GUIContent("New Tree"))) { CreateNewXmlFile(); } AddLine(80); Rect pos = new Rect(new Vector2((position.width / 2) - (position.width / 2) / 2, lastPos.y), new Vector2(position.width / 2, position.height * 0.05f)); btFile = EditorGUI.ObjectField(pos, btFile, typeof(UnityEngine.Object), false); } if (btFile == null) { return; } filepath = AssetDatabase.GetAssetPath(btFile); DeserializedNode = BehaviourTreeUtils.LoadBehaviourTree((TextAsset)btFile); if (DeserializedNode != null) { SetParentToNodes(DeserializedNode); } } if (DeserializedNode == null) { GenericMenu toolsMenu = new GenericMenu(); foreach (var item in BehaviourTreeUtils.GetEnumerableOfType <Node>()) { //node.type = item; toolsMenu.AddItem(new GUIContent(item.Name), false, CreateRoot, item); } toolsMenu.DropDown(new Rect(lastPos + new Vector2(30, 0), new Vector2(150, 25))); return; } scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, true, true, GUILayout.Width(this.position.width), GUILayout.Height(this.position.height)); GUILayout.BeginHorizontal(); AddLine(); GUILayout.Label(new GUIContent(btFile.name)); if (ModifiedTreeLastFrame) { SetParentToNodes(DeserializedNode); } PrintNode(DeserializedNode); //printing tree AddLine(); AddLine(); //utilities buttons if (GUI.Button(new Rect(lastPos, defaultSize * 2f), new GUIContent("Change Tree (don't save changes)"))) //change tree button { btFile = null; DeserializedNode = null; } Tab(defaultSize.x * 2); if (GUI.Button(new Rect(lastPos, defaultSize * 2f), new GUIContent("Reset Tree (write on file)"))) //reset tree button { ResetTree(); } Tab(defaultSize.x * 2); if (GUI.Button(new Rect(lastPos, defaultSize * 2f), new GUIContent("Save Tree (write on file)"))) //save tree button { Save(); } GUILayout.Label("", GUILayout.Width(scrollWidth), GUILayout.Height(scrollHeight)); GUILayout.EndHorizontal(); EditorGUILayout.EndScrollView(); }