//辅助行为树添加节点(粘贴添加) public static void AddNode(BehaviorTreeDesigner behaviorTree, NodeDesigner node) { node.ID = behaviorTree.GenNodeID(); if (node.StartNode) { node.StartNode = behaviorTree.ExistStartNode() ? false : true; } behaviorTree.AddNode(node); if (node.Transitions.Count > 0) { for (int i = 0; i < node.Transitions.Count; i++) { Transition transition = node.Transitions[i]; transition.FromNode = node; transition.FromNodeID = node.ID; NodeDesigner childNode = transition.ToNode; AddNode(behaviorTree, childNode); transition.ToNodeID = childNode.ID; } node.Sort(); } }
/// <summary> /// 添加行为树 /// </summary> private void AddBehaviorTree() { if (WorkSpaceData == null) { ShowMessage("当前没有工作空间,请新建或者打开工作空间!"); return; } if (BehaviorTreeData == null) { return; } string group = string.Empty; if (treeView1.SelectedNode != null) { if (treeView1.SelectedNode.Tag is GroupItem) { GroupItem groupItem = treeView1.SelectedNode.Tag as GroupItem; group = groupItem.Group.GroupName; } else if (treeView1.SelectedNode.Tag is BehaviorTreeItem) { BehaviorTreeItem behaviorTreeItem = treeView1.SelectedNode.Tag as BehaviorTreeItem; if (behaviorTreeItem.GroupItem != null) { group = behaviorTreeItem.GroupItem.Group.GroupName; } } } BehaviorTreeDesigner behaviorTree = new BehaviorTreeDesigner(); behaviorTree.GroupName = group; string behaviorTreeID = "New_" + DateTime.Now.Ticks; do { behaviorTreeID = "New_" + DateTime.Now.Ticks; } while (BehaviorTreeData.ExistBehaviorTree(behaviorTreeID)); behaviorTree.ID = behaviorTreeID; //创建开始节点 NodeDesigner startNode = null; NodeDefine nodeDefine = NodeTemplate.FindNode("Sequence"); if (nodeDefine != null) { Rect rect = new Rect(EditorUtility.Center.x, EditorUtility.Center.y, EditorUtility.NodeWidth, EditorUtility.NodeHeight); startNode = new NodeDesigner(nodeDefine.Label, nodeDefine.ClassType, rect); startNode.ID = behaviorTree.GenNodeID(); startNode.StartNode = true; startNode.NodeType = nodeDefine.NodeType; //创建字段 for (int i = 0; i < nodeDefine.Fields.Count; i++) { NodeField nodeField = nodeDefine.Fields[i]; FieldDesigner field = EditorUtility.CreateFieldByNodeField(nodeField); if (field == null) { continue; } startNode.Fields.Add(field); } behaviorTree.AddNode(startNode); } //创建空操作节点 NodeDefine noopDefine = NodeTemplate.FindNode("Noop"); if (startNode != null && noopDefine != null) { Rect rect = new Rect(EditorUtility.Center.x + 250, EditorUtility.Center.y, EditorUtility.NodeWidth, EditorUtility.NodeHeight); NodeDesigner noopNode = new NodeDesigner(noopDefine.Label, noopDefine.ClassType, rect); noopNode.ID = behaviorTree.GenNodeID(); noopNode.NodeType = noopDefine.NodeType; noopNode.Describe = noopDefine.Describe; behaviorTree.AddNode(noopNode); startNode.AddChildNode(noopNode); } TreeViewManager.AddBehaviorTree(behaviorTree); }