예제 #1
0
 public EditBehaviorTreeForm(BehaviorTreeDesigner behaviorTree)
 {
     m_BehaviorTree        = behaviorTree;
     m_BehaviorTreeContent = XmlUtility.ObjectToString(m_BehaviorTree);
     m_EditBehaviorTree    = XmlUtility.StringToObject <BehaviorTreeDesigner>(m_BehaviorTreeContent);
     InitializeComponent();
 }
        public void BindGroup(BehaviorGroupDesigner group)
        {
            if (string.IsNullOrEmpty(group.GroupName) || GroupDic.ContainsKey(group.GroupName))
            {
                return;
            }

            GroupItem groupItem = new GroupItem();

            groupItem.Group           = group;
            groupItem.Group.GroupName = group.GroupName;
            GroupDic.Add(group.GroupName, groupItem);

            TreeNode treeNode = m_TreeView.Nodes.Add(GetGroupTreeNodeName(group));

            treeNode.Tag       = groupItem;
            groupItem.TreeNode = treeNode;

            for (int i = 0; i < group.BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree     = group.BehaviorTrees[i];
                TreeNode             tempTreeNode     = treeNode.Nodes.Add(GetTreeNodeName(behaviorTree));
                BehaviorTreeItem     behaviorTreeItem = new BehaviorTreeItem();
                behaviorTreeItem.BehaviorTree = behaviorTree;
                behaviorTreeItem.GroupItem    = groupItem;
                behaviorTreeItem.TreeNode     = tempTreeNode;
                tempTreeNode.Tag = behaviorTreeItem;
            }
        }
예제 #3
0
        public BehaviorTreeItem AddBehaviorTree(BehaviorTreeDesigner behaviorTree, int index = -1)
        {
            if (!Group.AddBehaviorTree(behaviorTree))
            {
                return(null);
            }

            string name = string.IsNullOrEmpty(behaviorTree.Name) ? behaviorTree.ID : string.Format("{0} ({1})", behaviorTree.ID, behaviorTree.Name);

            TreeNode tempNode;

            if (index != -1)
            {
                tempNode = TreeNode.Nodes.Insert(index, name);
            }
            else
            {
                tempNode = TreeNode.Nodes.Add(name);
            }

            BehaviorTreeItem behaviorTreeItem = new BehaviorTreeItem();

            behaviorTreeItem.GroupItem    = this;
            behaviorTreeItem.BehaviorTree = behaviorTree;
            behaviorTreeItem.TreeNode     = tempNode;

            tempNode.Tag = behaviorTreeItem;

            return(behaviorTreeItem);
        }
        public void RemoveBehaviorTree(BehaviorTreeDesigner behaviorTree)
        {
            if (behaviorTree == null)
            {
                throw new System.Exception("TreeViewManager.RemoveBehaviorTree(), behaviorTree is null.");
            }

            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner temp = m_BehaviorTrees[i];
                if (temp == behaviorTree)
                {
                    m_BehaviorTrees.RemoveAt(i);
                    break;
                }
            }

            BehaviorTreeItem behaviorTreeItem = FindBehaviorTreeItem(behaviorTree);

            if (behaviorTreeItem == null)
            {
                return;
            }

            behaviorTreeItem.TreeNode.Remove();
        }
예제 #5
0
        /// <summary>
        /// 修正数据(和模板保持一致)
        /// </summary>
        public void AjustData()
        {
            for (int i = 0; i < m_Groups.Count; i++)
            {
                BehaviorGroupDesigner group = m_Groups[i];

                if (group == null)
                {
                    continue;
                }

                for (int j = 0; j < group.BehaviorTrees.Count; j++)
                {
                    BehaviorTreeDesigner behaviorTree = group.BehaviorTrees[j];
                    if (behaviorTree != null)
                    {
                        behaviorTree.AjustData();
                    }
                }
            }

            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (behaviorTree != null)
                {
                    behaviorTree.AjustData();
                }
            }
        }
예제 #6
0
        /// <summary>
        /// 粘贴行为树
        /// </summary>
        private void PasteBehaviorTree()
        {
            try
            {
                BehaviorTreeListContent content = XmlUtility.StringToObject <BehaviorTreeListContent>(Clipboard.GetText());

                for (int i = 0; i < content.DataList.Count; i++)
                {
                    BehaviorTreeDesigner behaviorTree = content.DataList[i];
                    string behaviorTreeID             = "New_" + DateTime.Now.Ticks;
                    do
                    {
                        behaviorTreeID = "New_" + DateTime.Now.Ticks;
                    } while (BehaviorTreeData.ExistBehaviorTree(behaviorTreeID));

                    behaviorTree.ID = behaviorTreeID;
                    TreeViewManager.AddBehaviorTree(behaviorTree);
                }

                ShowInfo("您粘贴了" + content.DataList.Count + "个行为树!!!");
            }
            catch (Exception ex)
            {
                ShowInfo("无法进行粘贴,错误信息:" + ex.Message);
                ShowMessage("无法进行粘贴,错误信息:" + ex.Message, "警告");
            }
        }
예제 #7
0
        public void DeleteGroup(Group group)
        {
            foreach (var kv in GroupDic)
            {
                if (kv.Value.Group == group)
                {
                    kv.Value.TreeNode.Remove();
                }
            }

            if (GroupDic.ContainsKey(group.GroupName))
            {
                GroupDic.Remove(group.GroupName);
            }

            m_Groups.Remove(group);

            for (int i = m_BehaviorTrees.Count - 1; i >= 0; i--)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (behaviorTree.GroupName == group.GroupName)
                {
                    m_BehaviorTrees.RemoveAt(i);
                }
            }
        }
        public GroupItem AddGroup(BehaviorGroupDesigner group)
        {
            if (string.IsNullOrEmpty(group.GroupName) || GroupDic.ContainsKey(group.GroupName))
            {
                return(null);
            }

            m_Groups.Add(group);

            GroupItem groupItem = new GroupItem();

            groupItem.Group = group;
            GroupDic.Add(group.GroupName, groupItem);

            TreeNode treeNode = m_TreeView.Nodes.Insert(m_Groups.Count - 1, GetGroupTreeNodeName(group));

            treeNode.Tag       = groupItem;
            groupItem.TreeNode = treeNode;

            m_TreeView.SelectedNode = treeNode;

            for (int i = 0; i < group.BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree     = group.BehaviorTrees[i];
                TreeNode             tempTreeNode     = treeNode.Nodes.Add(behaviorTree.ID);
                BehaviorTreeItem     behaviorTreeItem = new BehaviorTreeItem();
                behaviorTreeItem.BehaviorTree = behaviorTree;
                behaviorTreeItem.GroupItem    = groupItem;
                behaviorTreeItem.TreeNode     = tempTreeNode;
                tempTreeNode.Tag = behaviorTreeItem;
            }

            return(groupItem);
        }
예제 #9
0
        public void Debug(BehaviorTreeDesigner behaviorTree)
        {
            if (behaviorTree == null)
            {
                MainForm.Instance.ShowMessage("行为树为空");
                return;
            }

            m_Nodes.Clear();
            VerifyInfo verifyBehaviorTree = behaviorTree.VerifyBehaviorTree();

            if (verifyBehaviorTree.HasError)
            {
                MainForm.Instance.ShowMessage("确保行为树编辑正确后才能调试\n" + verifyBehaviorTree.Msg);
                return;
            }

            for (int i = 0; i < behaviorTree.Nodes.Count; i++)
            {
                NodeDesigner node = behaviorTree.Nodes[i];
                if (node.StartNode)
                {
                    m_DebugNode = CreateDebugNode(behaviorTree, node);
                    break;
                }
            }

            State = DebugState.Running;
            ContentUserControl.Instance.OnDebugStart();
            MainForm.Instance.ShowInfo("播放成功 时间:" + DateTime.Now);
        }
예제 #10
0
        /// <summary>
        /// 判断行为树是否存在
        /// </summary>
        /// <param name="behaviroTree">行为树</param>
        /// <returns>true:存在</returns>
        public bool ExistBehaviorTree(BehaviorTreeDesigner behaviroTree)
        {
            if (behaviroTree == null)
            {
                throw new Exception("BehaviorTreeData.ExistBehaviorTree() error: behaviroTree = null");
            }

            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner tempBehaviorTree = m_BehaviorTrees[i];
                if (tempBehaviorTree == null)
                {
                    continue;
                }
                if (tempBehaviorTree == behaviroTree)
                {
                    return(true);
                }
                if (tempBehaviorTree.ID == behaviroTree.ID)
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #11
0
        public void RemoveBehaviorTree(string behaviorTreeID)
        {
            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (behaviorTree.ID == behaviorTreeID)
                {
                    m_BehaviorTrees.RemoveAt(i);
                    break;
                }
            }

            BehaviorTreeItem behaviorTreeItem = FindBehaviorTreeItem(behaviorTreeID);

            if (behaviorTreeItem == null)
            {
                return;
            }

            int index = GetIndex(behaviorTreeItem);

            m_TreeView.Nodes.Remove(behaviorTreeItem.TreeNode);

            if (index >= 0 && index < m_TreeView.Nodes.Count)
            {
                m_TreeView.SelectedNode = m_TreeView.Nodes[index];
            }
        }
예제 #12
0
        public static BTData.BehaviorTreeData CreateTreeData(BehaviorTreeDataDesigner treeData)
        {
            BTData.BehaviorTreeData data = new BTData.BehaviorTreeData();

            //全局变量
            for (int i = 0; i < treeData.GlobalVariable.VariableFields.Count; i++)
            {
                VariableFieldDesigner variableField     = treeData.GlobalVariable.VariableFields[i];
                BTData.BaseField      variableFieldData = CreateVariableField(variableField);
                data.GlobalVariable.VariableFields.Add(variableFieldData);
            }

            //Context变量
            for (int i = 0; i < treeData.ContextVariable.VariableFields.Count; i++)
            {
                VariableFieldDesigner variableField     = treeData.ContextVariable.VariableFields[i];
                BTData.BaseField      variableFieldData = CreateVariableField(variableField);
                data.ContextVariable.VariableFields.Add(variableFieldData);
            }

            for (int i = 0; i < treeData.BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = treeData.BehaviorTrees[i];
                if (behaviorTree == null)
                {
                    continue;
                }
                data.BehaviorTrees.Add(CreateBehaviorTreeData(behaviorTree));
            }

            return(data);
        }
예제 #13
0
        //辅助行为树添加节点(粘贴添加)
        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();
            }
        }
예제 #14
0
        public static BTData.BehaviorTreeElement CreateBehaviorTreeData(BehaviorTreeDesigner behaviorTree)
        {
            BTData.BehaviorTreeElement data = new BTData.BehaviorTreeElement();
            data.ID = behaviorTree.ID;

            //行为树变量
            for (int i = 0; i < behaviorTree.BehaviorTreeVariableFields.Count; i++)
            {
                VariableFieldDesigner field = behaviorTree.BehaviorTreeVariableFields[i];
                if (field == null)
                {
                    continue;
                }
                data.BehaviorTreeVariables.Add(CreateVariableField(field));
            }

            for (int i = 0; i < behaviorTree.Fields.Count; i++)
            {
                FieldDesigner field = behaviorTree.Fields[i];
                if (field == null)
                {
                    continue;
                }
                data.Fields.Add(CreateField(field));
            }

            NodeDesigner startNode = behaviorTree.GetStartNode();

            if (startNode != null)
            {
                data.StartNode = CreateNode(behaviorTree, startNode);
            }

            return(data);
        }
예제 #15
0
        /// <summary>
        /// 检验行为树ID
        /// </summary>
        /// <returns></returns>
        public VerifyInfo VerifyBehaviorTreeID()
        {
            //校验ID是否为空
            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (string.IsNullOrEmpty(behaviorTree.ID))
                {
                    return(new VerifyInfo("行为树的ID为空"));
                }
            }

            //检验行为树ID是否相同
            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree_i = m_BehaviorTrees[i];
                if (behaviorTree_i != null)
                {
                    for (int ii = i + 1; ii < m_BehaviorTrees.Count; ii++)
                    {
                        BehaviorTreeDesigner behaviorTree_ii = m_BehaviorTrees[ii];
                        if (behaviorTree_i.ID == behaviorTree_ii.ID)
                        {
                            return(new VerifyInfo(string.Format("行为树存在相同ID:{0}", behaviorTree_i.ID)));
                        }
                    }
                }
            }

            return(VerifyInfo.DefaultVerifyInfo);
        }
예제 #16
0
        public static BTData.NodeData CreateNode(BehaviorTreeDesigner behaviorTree, NodeDesigner nodeData)
        {
            BTData.NodeData data = new BTData.NodeData();
            data.ID        = nodeData.ID;
            data.ClassType = nodeData.ClassType;
            data.Label     = nodeData.Label;
            data.X         = (int)nodeData.Rect.x;
            data.Y         = (int)nodeData.Rect.y;

            for (int i = 0; i < nodeData.Fields.Count; i++)
            {
                FieldDesigner field = nodeData.Fields[i];
                if (field == null)
                {
                    continue;
                }
                data.Fields.Add(CreateField(field));
            }

            if (nodeData.Transitions.Count > 0)
            {
                data.Childs = new List <BTData.NodeData>(nodeData.Transitions.Count);
                for (int i = 0; i < nodeData.Transitions.Count; i++)
                {
                    Transition      transition    = nodeData.Transitions[i];
                    NodeDesigner    childNode     = behaviorTree.FindByID(transition.ToNodeID);
                    BTData.NodeData childNodeData = CreateNode(behaviorTree, childNode);
                    data.Childs.Add(childNodeData);
                }
            }

            return(data);
        }
예제 #17
0
        public BehaviorTreeItem BindBehaviorTreeItem(BehaviorTreeDesigner behaviorTree)
        {
            BehaviorTreeItem behaviorTreeItem = new BehaviorTreeItem();

            behaviorTreeItem.BehaviorTree = behaviorTree;

            if (string.IsNullOrEmpty(behaviorTree.GroupName))
            {
                TreeNode treeNode = m_TreeView.Nodes.Add(behaviorTree.ID);
                treeNode.Tag = behaviorTreeItem;
                behaviorTreeItem.GroupItem = null;
                behaviorTreeItem.TreeNode  = treeNode;
            }
            else
            {
                GroupItem groupItem = FindGroup(behaviorTree.GroupName);
                //添加分组
                if (groupItem == null)
                {
                    groupItem = AddGroup(behaviorTree.GroupName);
                }
                TreeNode treeNode = groupItem.TreeNode.Nodes.Add(behaviorTree.ID);
                treeNode.Tag = behaviorTreeItem;
                behaviorTreeItem.GroupItem = groupItem;
                behaviorTreeItem.TreeNode  = treeNode;
            }

            return(behaviorTreeItem);
        }
예제 #18
0
        public void BindBehaviorTrees()
        {
            m_TreeView.Nodes.Clear();
            GroupDic.Clear();

            for (int i = 0; i < m_Groups.Count; i++)
            {
                Group group = m_Groups[i];
                BindGroup(group);
            }

            //分组优先
            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (!string.IsNullOrEmpty(behaviorTree.GroupName))
                {
                    BindBehaviorTreeItem(behaviorTree);
                }
            }

            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
                if (string.IsNullOrEmpty(behaviorTree.GroupName))
                {
                    BindBehaviorTreeItem(behaviorTree);
                }
            }
        }
예제 #19
0
        public BehaviorTreeItem AddBehaviorTree(BehaviorTreeDesigner behaviorTree)
        {
            m_BehaviorTrees.Add(behaviorTree);
            BehaviorTreeItem behaviorTreeItem = BindBehaviorTreeItem(behaviorTree);

            m_TreeView.SelectedNode = behaviorTreeItem.TreeNode;
            return(behaviorTreeItem);
        }
예제 #20
0
 /// <summary>
 /// 设置选中的行为树
 /// </summary>
 /// <param name="behaviorTree"></param>
 public void SetSelectedBehaviorTree(BehaviorTreeDesigner behaviorTree)
 {
     SelectedBehaviorTree = behaviorTree;
     if (m_ContentUserControl != null)
     {
         m_ContentUserControl.SetSelectedBehaviorTree(SelectedBehaviorTree);
     }
 }
예제 #21
0
        //刷新行为树
        private void UpdateBehaviorTree(BehaviorTreeDesigner behaviorTree)
        {
            if (behaviorTree == null)
            {
                return;
            }

            TreeViewManager.UpdateBehaviorTreeItem(behaviorTree);
        }
예제 #22
0
        public void UpdateBehaviorTreeItem(BehaviorTreeDesigner behaviorTree)
        {
            BehaviorTreeItem behaviorTreeItem = FindBehaviorTreeItem(behaviorTree);

            if (behaviorTreeItem != null)
            {
                behaviorTreeItem.TreeNode.Text = behaviorTree.ID;
            }
        }
예제 #23
0
        /// <summary>
        /// 添加行为树
        /// </summary>
        /// <param name="behaviorTree">behaviorTree</param>
        /// <returns>true:添加成功</returns>
        public bool AddBehaviorTree(BehaviorTreeDesigner behaviorTree)
        {
            if (ExistBehaviorTree(behaviorTree))
            {
                return(false);
            }

            m_BehaviorTrees.Add(behaviorTree);

            return(true);
        }
예제 #24
0
 /// <summary>
 /// 移除未定义的节点
 /// </summary>
 public void RemoveUnDefineNode()
 {
     for (int i = 0; i < m_BehaviorTrees.Count; i++)
     {
         BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
         if (behaviorTree != null)
         {
             behaviorTree.RemoveUnDefineNode();
         }
     }
 }
예제 #25
0
 /// <summary>
 /// 修正数据(和模板保持一致)
 /// </summary>
 public void AjustData()
 {
     for (int i = 0; i < m_BehaviorTrees.Count; i++)
     {
         BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
         if (behaviorTree != null)
         {
             behaviorTree.AjustData();
         }
     }
 }
예제 #26
0
 /// <summary>
 /// 修改节点名字
 /// </summary>
 /// <param name="old">旧的classType</param>
 /// <param name="newType">新的classType</param>
 public void UpdateClassType(string old, string newType)
 {
     for (int i = 0; i < m_BehaviorTrees.Count; i++)
     {
         BehaviorTreeDesigner behaviorTree = m_BehaviorTrees[i];
         if (behaviorTree != null)
         {
             behaviorTree.UpdateClassType(old, newType);
         }
     }
 }
예제 #27
0
        /// <summary>
        /// 添加行为树Item
        /// </summary>
        /// <param name="behaviorTree">行为树</param>
        /// <returns>true:添加成功</returns>
        public bool AddBehaviorTreeItem(BehaviorTreeDesigner behaviorTree)
        {
            if (behaviorTree == null)
            {
                return(false);
            }
            TreeNode treeNode = treeView1.Nodes.Add(behaviorTree.ID);

            treeNode.Tag           = behaviorTree;
            treeView1.SelectedNode = treeNode;
            return(true);
        }
예제 #28
0
        //放到最后
        public void AddLast(BehaviorTreeDesigner behaviorTree)
        {
            for (int i = 0; i < m_BehaviorTrees.Count; i++)
            {
                BehaviorTreeDesigner temp = m_BehaviorTrees[i];
                if (temp.ID == behaviorTree.ID)
                {
                    m_BehaviorTrees.RemoveAt(i);
                    break;
                }
            }

            m_BehaviorTrees.Add(behaviorTree);
        }
        public BehaviorTreeItem BindBehaviorTreeItem(BehaviorTreeDesigner behaviorTree)
        {
            BehaviorTreeItem behaviorTreeItem = new BehaviorTreeItem();

            behaviorTreeItem.BehaviorTree = behaviorTree;

            TreeNode treeNode = m_TreeView.Nodes.Add(GetTreeNodeName(behaviorTree));

            treeNode.Tag = behaviorTreeItem;
            behaviorTreeItem.GroupItem = null;
            behaviorTreeItem.TreeNode  = treeNode;

            return(behaviorTreeItem);
        }
예제 #30
0
        /// <summary>
        /// 更新BehaviorTree内容,但Nodes不能改
        /// </summary>
        /// <param name="behaviorTree"></param>
        public void UpdateBehaviorTree(BehaviorTreeDesigner behaviorTree)
        {
            if (behaviorTree == this)
            {
                return;
            }

            m_TreeID   = behaviorTree.ID;
            m_Describe = behaviorTree.Describe;

            m_Fields.Clear();
            m_Fields.AddRange(behaviorTree.Fields.ToArray());

            m_BehaviorTreeVariables.Clear();
            m_BehaviorTreeVariables.AddRange(behaviorTree.BehaviorTreeVariableFields.ToArray());
        }