示例#1
0
        /// <summary>
        /// 更新NodeDefine的内容
        /// </summary>
        /// <param name="nodeDefine"></param>
        public void UpdateNodeDefine(NodeDefine nodeDefine)
        {
            if (nodeDefine == null)
            {
                return;
            }

            if (nodeDefine == this)
            {
                return;
            }

            //改名
            if (m_ClassType != nodeDefine.ClassType)
            {
                MainForm.Instance.BehaviorTreeData.UpdateClassType(m_ClassType, nodeDefine.ClassType);
                ContentUserControl.Instance.ClearAllSelected();
            }

            m_ClassType  = nodeDefine.ClassType;
            m_Label      = nodeDefine.Label;
            m_Category   = nodeDefine.Category;
            m_NodeType   = nodeDefine.NodeType;
            m_Describe   = nodeDefine.Describe;
            m_CheckField = nodeDefine.CheckField;

            m_Fields.Clear();
            m_Fields.AddRange(nodeDefine.Fields);
        }
示例#2
0
        /// <summary>
        /// 添加节点类
        /// </summary>
        /// <param name="nodeDefine"></param>
        public bool AddClass(NodeDefine nodeDefine)
        {
            if (nodeDefine == null)
            {
                return(false);
            }

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine tmp = m_Nodes[i];
                if (tmp.ClassType == nodeDefine.ClassType)
                {
                    MainForm.Instance.ShowMessage(string.Format("已存在{0},请换一个类名", nodeDefine.ClassType), "警告");
                    return(false);
                }
            }

            m_Nodes.Add(nodeDefine);

            m_Nodes.Sort(delegate(NodeDefine a, NodeDefine b)
            {
                return(a.NodeType.CompareTo(b.NodeType));
            });

            return(true);
        }
        private void  除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView1.SelectedNode == null)
            {
                return;
            }

            if (treeView1.SelectedNode.Tag == null)
            {
                return;
            }

            if (!(treeView1.SelectedNode.Tag is NodeItem))
            {
                return;
            }

            NodeItem   nodeItem   = treeView1.SelectedNode.Tag as NodeItem;
            NodeDefine nodeDefine = nodeItem.NodeDefine;

            if (MessageBox.Show(string.Format("是否删除节点{0}?", nodeDefine.ClassType), "提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                m_Nodes.Remove(nodeDefine);
                m_NodeTreeViewManager.RemoveNodeDefine(nodeDefine);
            }
        }
示例#4
0
        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NodeDefine           nodeDefine = new NodeDefine();
            InputValueDialogForm testForm   = new InputValueDialogForm("编辑", nodeDefine);

            testForm.ShowDialog();
        }
        private void 编辑类ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView1.SelectedNode == null)
            {
                return;
            }

            if (treeView1.SelectedNode.Tag == null)
            {
                return;
            }

            if (!(treeView1.SelectedNode.Tag is NodeItem))
            {
                return;
            }

            NodeItem   nodeItem   = treeView1.SelectedNode.Tag as NodeItem;
            NodeDefine nodeDefine = nodeItem.NodeDefine;

            EditNodeDefineForm editClassForm = new EditNodeDefineForm(this, nodeDefine, delegate()
            {
                nodeItem = m_NodeTreeViewManager.BindNodeDefine(nodeDefine);
                treeView1.SelectedNode = nodeItem.TreeNode;
            });

            editClassForm.ShowDialog();
        }
        private void CopyClass()
        {
            if (treeView1.SelectedNode == null)
            {
                return;
            }

            if (treeView1.SelectedNode.Tag == null)
            {
                return;
            }

            if (!(treeView1.SelectedNode.Tag is NodeItem))
            {
                return;
            }

            NodeItem   nodeItem   = treeView1.SelectedNode.Tag as NodeItem;
            NodeDefine nodeDefine = nodeItem.NodeDefine;

            NodeDefineListContent content = new NodeDefineListContent();

            content.DataList.Add(nodeDefine);

            if (content.DataList.Count > 0)
            {
                Clipboard.SetText(XmlUtility.ObjectToString(content));
            }

            MainForm.Instance.ShowInfo("您复制了" + content.DataList.Count.ToString() + "个节点类!!!");
        }
        private void PasteClass()
        {
            try
            {
                NodeDefineListContent content = XmlUtility.StringToObject <NodeDefineListContent>(Clipboard.GetText());

                NodeDefine nodeDefine = null;
                for (int i = 0; i < content.DataList.Count; i++)
                {
                    nodeDefine = content.DataList[i];
                    string classType = nodeDefine.ClassType;
                    do
                    {
                        classType += "_New";
                    }while (m_Nodes.ExistClassType(classType));

                    nodeDefine.ClassType = classType;
                    m_Nodes.AddClass(nodeDefine);
                }

                m_NodeTreeViewManager.BindNodeDefine(nodeDefine);

                MainForm.Instance.ShowInfo("您粘贴了" + content.DataList.Count + "个节点类!!!");
            }
            catch (Exception ex)
            {
                MainForm.Instance.ShowInfo("无法进行粘贴,错误信息:" + ex.Message);
                MainForm.Instance.ShowMessage("无法进行粘贴,错误信息:" + ex.Message, "警告");
            }
        }
示例#8
0
        /// <summary>
        /// 检验节点类ClassType
        /// </summary>
        /// <returns></returns>
        public VerifyInfo VerifyClassType()
        {
            //校验ClassType是否为空
            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine nodeDefine = m_Nodes[i];
                if (string.IsNullOrEmpty(nodeDefine.ClassType))
                {
                    return(new VerifyInfo("存在空的ClassType"));
                }
            }

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

            return(VerifyInfo.DefaultVerifyInfo);
        }
        public bool RemoveNodeDefine(NodeDefine nodeDefine)
        {
            NodeItem nodeItem = FindNodeItem(nodeDefine);

            if (nodeItem != null)
            {
                nodeItem.TreeNode.Remove();
            }

            if (nodeItem.CategoryItem != null)
            {
                TreeNode treeNode = nodeItem.CategoryItem.TreeNode;
                while (treeNode.Tag is CategoryItem)
                {
                    TreeNode parentNode = treeNode.Parent;
                    if (treeNode.Nodes.Count == 0)
                    {
                        treeNode.Remove();
                        treeNode = parentNode;
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(false);
        }
示例#10
0
 /// <summary>
 /// 删除节点类
 /// </summary>
 /// <param name="nodeDefine">节点类对象</param>
 /// <returns></returns>
 public bool Remove(NodeDefine nodeDefine)
 {
     if (nodeDefine == null)
     {
         return(false);
     }
     return(m_Nodes.Remove(nodeDefine));
 }
示例#11
0
 /// <summary>
 /// 移除未定义的枚举字段
 /// </summary>
 public void RemoveUnDefineEnumField()
 {
     for (int i = 0; i < m_Nodes.Count; i++)
     {
         NodeDefine nodeDefine = m_Nodes[i];
         nodeDefine.RemoveUnDefineEnumField();
     }
 }
示例#12
0
 public EditNodeDefineForm(NodeTemplateForm classForm, NodeDefine nodeDefine, Action editCallback)
 {
     m_ClassForm      = classForm;
     m_NodeDefine     = nodeDefine;
     m_Content        = XmlUtility.ObjectToString(m_NodeDefine);
     m_EditNodeDefine = XmlUtility.StringToObject <NodeDefine>(m_Content);
     m_EditCallback   = editCallback;
     InitializeComponent();
 }
        public void BindNodeTemplate()
        {
            for (int i = 0; i < m_NodeTemplate.Nodes.Count; i++)
            {
                NodeDefine nodeDefine = m_NodeTemplate.Nodes[i];
                BindNodeDefine(nodeDefine);
            }

            m_TreeView.ExpandAll();
            m_TreeView.SelectedNode = m_TreeView.Nodes[0];
            m_TreeView.Nodes[0].EnsureVisible();
        }
        private void treeView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (treeView1.SelectedNode == null)
            {
                return;
            }

            for (int i = 0; i < contextMenuStrip1.Items.Count; i++)
            {
                contextMenuStrip1.Items[i].Visible = false;
            }

            if (treeView1.SelectedNode.Tag is NodeTypeItem || treeView1.SelectedNode.Tag is CategoryItem)
            {
                contextMenuStrip1.Items[0].Visible = true;
                contextMenuStrip1.Items[3].Visible = true;
            }
            else if (treeView1.SelectedNode.Tag is NodeItem)
            {
                contextMenuStrip1.Items[1].Visible = true;
                contextMenuStrip1.Items[2].Visible = true;
            }

            if (e.Clicks == 2)
            {
                if (treeView1.SelectedNode == null)
                {
                    return;
                }

                if (treeView1.SelectedNode.Tag == null)
                {
                    return;
                }

                if (!(treeView1.SelectedNode.Tag is NodeItem))
                {
                    return;
                }

                NodeItem   nodeItem   = treeView1.SelectedNode.Tag as NodeItem;
                NodeDefine nodeDefine = nodeItem.NodeDefine;


                EditNodeDefineForm editClassForm = new EditNodeDefineForm(this, nodeDefine, delegate()
                {
                    nodeItem = m_NodeTreeViewManager.BindNodeDefine(nodeDefine);
                    treeView1.SelectedNode = nodeItem.TreeNode;
                });
                editClassForm.ShowDialog();
            }
        }
        public NodeItem FindNodeItem(NodeDefine nodeDefine)
        {
            for (int i = 0; i < m_TreeView.Nodes.Count; i++)
            {
                TreeNode treeNode = m_TreeView.Nodes[i];
                NodeItem nodeItem = FindNodeItem(treeNode, nodeDefine);
                if (nodeItem != null)
                {
                    return(nodeItem);
                }
            }

            return(null);
        }
示例#16
0
        /// <summary>
        /// 移除未定义的节点
        /// </summary>
        public bool RemoveUnDefineNode()
        {
            bool remove = false;

            for (int i = m_Nodes.Count - 1; i >= 0; i--)
            {
                NodeDesigner node       = m_Nodes[i];
                NodeDefine   nodeDefine = MainForm.Instance.NodeTemplate.FindNode(node.ClassType);
                if (nodeDefine == null)
                {
                    RemoveNode(node);
                    remove = true;
                }
            }

            return(remove);
        }
示例#17
0
        //刷新ListView
        private void BindField(NodeDefine nodeDefine)
        {
            if (nodeDefine == null)
            {
                return;
            }

            listViewFields.Items.Clear();
            foreach (NodeField field in nodeDefine.Fields)
            {
                ListViewItem listViewItem = listViewFields.Items.Add(field.FieldName);
                listViewItem.Tag = field;
                listViewItem.SubItems.Add(field.Label);
                listViewItem.SubItems.Add(EditorUtility.GetFieldTypeName(field.FieldType));
                listViewItem.SubItems.Add(field.DefaultValue != null ? field.DefaultValue.ToString() : string.Empty);
                listViewItem.SubItems.Add(field.Describe);
            }
        }
示例#18
0
        /// <summary>
        /// 获取指定类型所有组合节点类
        /// </summary>
        /// <param name="nodeType">节点类型</param>
        /// <returns></returns>
        public List <NodeDefine> GetNodeDefines(NodeType nodeType)
        {
            List <NodeDefine> nodeList = new List <NodeDefine>();

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine nodeDefine = m_Nodes[i];
                if (nodeDefine == null)
                {
                    continue;
                }
                if (nodeDefine.NodeType == nodeType)
                {
                    nodeList.Add(nodeDefine);
                }
            }
            return(nodeList);
        }
示例#19
0
        /// <summary>
        /// 通过ClassType查找节点
        /// </summary>
        /// <param name="classType"></param>
        /// <returns></returns>
        public NodeDefine FindNode(string classType)
        {
            if (string.IsNullOrEmpty(classType))
            {
                return(null);
            }

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine nodeDefine = m_Nodes[i];
                if (nodeDefine != null && nodeDefine.ClassType == classType)
                {
                    return(nodeDefine);
                }
            }

            return(null);
        }
示例#20
0
        /// <summary>
        /// 校节点类数据
        /// </summary>
        /// <returns></returns>
        public VerifyInfo VerifyNodeTemplate()
        {
            VerifyInfo verifyClassType = VerifyClassType();

            if (verifyClassType.HasError)
            {
                return(verifyClassType);
            }

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine nodeDefine       = m_Nodes[i];
                VerifyInfo verifyNodeDefine = nodeDefine.VerifyNodeDefine();
                if (verifyNodeDefine.HasError)
                {
                    return(verifyNodeDefine);
                }
            }

            return(VerifyInfo.DefaultVerifyInfo);
        }
示例#21
0
        public bool ExistClassType(string classType)
        {
            if (string.IsNullOrEmpty(classType))
            {
                throw new System.Exception("NodeTemplate.ExistClassType() classType类型为空");
            }

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDefine nodeDefine = m_Nodes[i];
                if (nodeDefine == null)
                {
                    continue;
                }
                if (nodeDefine.ClassType == classType)
                {
                    return(true);
                }
            }

            return(false);
        }
        private NodeItem FindNodeItem(TreeNode treeNode, NodeDefine nodeDefine)
        {
            if (treeNode.Tag is NodeItem)
            {
                NodeItem nodeItem = treeNode.Tag as NodeItem;
                if (nodeItem.NodeDefine.ClassType == nodeDefine.ClassType || nodeItem.NodeDefine == nodeDefine)
                {
                    return(nodeItem);
                }
            }

            for (int i = 0; i < treeNode.Nodes.Count; i++)
            {
                TreeNode tempTreeNode = treeNode.Nodes[i];
                NodeItem nodeItem     = FindNodeItem(tempTreeNode, nodeDefine);
                if (nodeItem != null)
                {
                    return(nodeItem);
                }
            }

            return(null);
        }
示例#23
0
        /// <summary>
        /// 修正数据
        /// </summary>
        public bool AjustData()
        {
            bool ajust = false;

            for (int i = 0; i < m_Nodes.Count; i++)
            {
                NodeDesigner node       = m_Nodes[i];
                NodeDefine   nodeDefine = MainForm.Instance.NodeTemplate.FindNode(node.ClassType);

                //修正节点标签
                if (node.Label != nodeDefine.Label)
                {
                    node.Label = nodeDefine.Label;
                    ajust      = true;
                }

                //移除模板中没有的字段
                for (int ii = node.Fields.Count - 1; ii >= 0; ii--)
                {
                    FieldDesigner field = node.Fields[ii];
                    if (!nodeDefine.ExistFieldName(field.FieldName))
                    {
                        ajust = true;
                        node.Fields.RemoveAt(ii);
                    }
                }

                //修正类型不匹配的(节点字段和模板字段类型不匹配)
                for (int ii = 0; ii < node.Fields.Count; ii++)
                {
                    FieldDesigner field     = node.Fields[ii];
                    NodeField     nodeField = nodeDefine.FindField(field.FieldName);
                    if (field.FieldType != nodeField.FieldType)
                    {
                        //重新给默认值
                        node.Fields[ii] = EditorUtility.CreateFieldByNodeField(nodeField);
                        ajust           = true;
                    }
                }

                //添加不存的字段
                for (int ii = nodeDefine.Fields.Count - 1; ii >= 0; ii--)
                {
                    NodeField     nodeField = nodeDefine.Fields[ii];
                    FieldDesigner field     = node.FindFieldByName(nodeField.FieldName);
                    //不存在的字段要添加
                    if (field == null)
                    {
                        FieldDesigner newField = EditorUtility.CreateFieldByNodeField(nodeField);
                        node.AddField(newField);
                        ajust = true;
                    }
                }

                //排序字段(要和模板中一致)
                for (int ii = 0; ii < nodeDefine.Fields.Count; ii++)
                {
                    NodeField nodeField = nodeDefine.Fields[ii];
                    int       index     = node.GetFieldIndex(nodeField.FieldName);
                    if (index != ii)
                    {
                        //交换
                        FieldDesigner tempField_ii = node.Fields[ii];
                        node.Fields[ii]    = node.Fields[index];
                        node.Fields[index] = tempField_ii;
                        ajust = true;
                    }
                }

                //修正Label
                for (int ii = 0; ii < node.Fields.Count; ii++)
                {
                    FieldDesigner field     = node.Fields[ii];
                    NodeField     nodeField = nodeDefine.Fields[ii];
                    if (field.Label != nodeField.Label)
                    {
                        field.Label = nodeField.Label;
                        ajust       = true;
                    }
                }
            }

            return(ajust);
        }
示例#24
0
        /// <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);
        }
        public NodeItem BindNodeDefine(NodeDefine nodeDefine)
        {
            NodeTypeItem nodeTypeItem = GetNodeTypeItem(nodeDefine.NodeType);

            if (nodeTypeItem == null)
            {
                return(null);
            }

            NodeItem nodeItem = FindNodeItem(nodeDefine);

            //刷新
            if (nodeItem != null)
            {
                if (nodeItem.OldNodeType == nodeDefine.NodeType && nodeItem.OldCategory == nodeDefine.Category)
                {
                    nodeItem.TreeNode.Text = nodeDefine.ClassType + (string.IsNullOrEmpty(nodeDefine.Label) ? string.Empty : " (" + nodeDefine.Label + ")");
                    return(nodeItem);
                }
                else
                {
                    nodeItem.TreeNode.Remove();
                }

                if (nodeItem.OldCategory != nodeDefine.Category)
                {
                    CheckRemoveCategory(nodeItem.OldNodeType, nodeItem.OldCategory);
                }
            }

            if (nodeItem == null)
            {
                nodeItem = new NodeItem();
            }

            if (string.IsNullOrEmpty(nodeDefine.Category))
            {
                TreeNode treeNode = nodeTypeItem.TreeNode.Nodes.Add(nodeDefine.ClassType + (string.IsNullOrEmpty(nodeDefine.Label) ? string.Empty : " (" + nodeDefine.Label + ")"));
                treeNode.Tag          = nodeItem;
                nodeItem.TreeNode     = treeNode;
                nodeItem.CategoryItem = null;
                nodeItem.NodeTypeItem = nodeTypeItem;
                nodeItem.NodeDefine   = nodeDefine;

                nodeItem.OldCategory = nodeDefine.Category;
                nodeItem.OldNodeType = nodeDefine.NodeType;
            }
            else
            {
                CategoryItem categoryItem = FindCategoryItem(nodeDefine.NodeType, nodeDefine.Category);

                if (categoryItem == null)
                {
                    categoryItem = BindCategory(nodeTypeItem.TreeNode, nodeDefine.Category);
                }

                TreeNode treeNode = categoryItem.TreeNode.Nodes.Add(nodeDefine.ClassType + (string.IsNullOrEmpty(nodeDefine.Label) ? string.Empty : " (" + nodeDefine.Label + ")"));
                treeNode.Tag          = nodeItem;
                nodeItem.TreeNode     = treeNode;
                nodeItem.CategoryItem = categoryItem;
                nodeItem.NodeTypeItem = nodeTypeItem;
                nodeItem.NodeDefine   = nodeDefine;

                nodeItem.OldCategory = nodeDefine.Category;
                nodeItem.OldNodeType = nodeDefine.NodeType;
            }

            return(nodeItem);
        }
示例#26
0
        public void ResetNodes()
        {
            m_Nodes.Clear();
            #region 组合节点
            //并行节点
            NodeDefine parallelNode = new NodeDefine();
            parallelNode.ClassType = "Parallel";
            parallelNode.Label     = "并行节点";
            parallelNode.NodeType  = NodeType.Composite;
            parallelNode.Describe  = "Parallel节点在一般意义上是并行的执行其子节点,即“一边做A,一边做B”";
            //成功条件
            NodeField parallelNodeSuccessType = new NodeField()
            {
                FieldName = "SuccessType", FieldType = FieldType.EnumField, Describe = "成功条件"
            };
            EnumDefaultValue parallelNodeSuccessEnumDefaultValue = parallelNodeSuccessType.DefaultValue as EnumDefaultValue;
            parallelNodeSuccessEnumDefaultValue.EnumType     = "SUCCESS_POLICY";
            parallelNodeSuccessEnumDefaultValue.DefaultValue = "SUCCEED_ON_ALL";
            parallelNodeSuccessType.Label = "成功条件";
            parallelNode.AddField(parallelNodeSuccessType);
            //失败条件
            NodeField parallelNodeFailType = new NodeField()
            {
                FieldName = "FailType", FieldType = FieldType.EnumField, Describe = "失败条件"
            };
            EnumDefaultValue parallelNodeFailTypeEnumDefaultValue = parallelNodeFailType.DefaultValue as EnumDefaultValue;
            parallelNodeFailTypeEnumDefaultValue.EnumType     = "FAILURE_POLICY";
            parallelNodeFailTypeEnumDefaultValue.DefaultValue = "FAIL_ON_ONE";
            parallelNodeFailType.Label = "失败条件";
            parallelNode.AddField(parallelNodeFailType);
            AddClass(parallelNode);

            //顺序节点
            NodeDefine sequenceNode = new NodeDefine();
            sequenceNode.ClassType = "Sequence";
            sequenceNode.Label     = "顺序节点";
            sequenceNode.NodeType  = NodeType.Composite;
            sequenceNode.Describe  = "Sequence节点以给定的顺序依次执行其子节点,直到所有子节点成功返回,该节点也返回成功。只要其中某个子节点失败,那么该节点也失败。";
            AddClass(sequenceNode);

            //选择节点
            NodeDefine Selector = new NodeDefine();
            Selector.ClassType = "Selector";
            Selector.Label     = "选择节点";
            Selector.Category  = "";
            Selector.NodeType  = NodeType.Composite;
            Selector.Describe  = "选择节点";
            AddClass(Selector);

            //ifelse
            NodeDefine IfElse = new NodeDefine();
            IfElse.ClassType = "IfElse";
            IfElse.Label     = "IfElse";
            IfElse.NodeType  = NodeType.Composite;
            IfElse.Describe  = "";
            AddClass(IfElse);

            //随机节点
            NodeDefine Random = new NodeDefine();
            Random.ClassType = "Random";
            Random.Label     = "随机节点";
            Random.Category  = "随机";
            Random.NodeType  = NodeType.Composite;
            Random.Describe  = "随机节点";
            AddClass(Random);

            //随机选择节点
            NodeDefine RandomSelector = new NodeDefine();
            RandomSelector.ClassType = "RandomSelector";
            RandomSelector.Label     = "随机选择";
            RandomSelector.Category  = "随机";
            RandomSelector.NodeType  = NodeType.Composite;
            RandomSelector.Describe  = "随机选择节点";
            AddClass(RandomSelector);

            //随机序列节点
            NodeDefine RandomSequence = new NodeDefine();
            RandomSequence.ClassType = "RandomSequence";
            RandomSequence.Label     = "随机序列";
            RandomSequence.Category  = "随机";
            RandomSequence.NodeType  = NodeType.Composite;
            RandomSequence.Describe  = "随机序列节点";
            AddClass(RandomSequence);

            //概率选择节点
            NodeDefine SelectorProbability = new NodeDefine();
            SelectorProbability.ClassType = "SelectorProbability";
            SelectorProbability.Label     = "概率选择节点";
            SelectorProbability.Category  = "";
            SelectorProbability.NodeType  = NodeType.Composite;
            SelectorProbability.Describe  = "概率选择节点";
            SelectorProbability.AddField(new NodeField()
            {
                FieldName = "Priority", Label = "优先级", FieldType = FieldType.RepeatIntField, Describe = "", Show = true
            });
            AddClass(SelectorProbability);

            #endregion

            #region 装饰节点

            //成功节点
            NodeDefine Success = new NodeDefine();
            Success.ClassType = "Success";
            Success.Label     = "成功节点";
            Success.NodeType  = NodeType.Decorator;
            Success.Describe  = "成功节点";
            AddClass(Success);

            //失败节点
            NodeDefine Failure = new NodeDefine();
            Failure.ClassType = "Failure";
            Failure.Label     = "失败节点";
            Failure.NodeType  = NodeType.Decorator;
            Failure.Describe  = "失败节点";
            AddClass(Failure);

            //帧数节点用于在指定的帧数内,持续调用其子节点
            NodeDefine Frames = new NodeDefine();
            Frames.ClassType  = "Frames";
            Frames.Label      = "帧数节点";
            Frames.NodeType   = NodeType.Decorator;
            Frames.CheckField = true;
            NodeField FramesField = new NodeField()
            {
                FieldName = "Frames", Label = "持续帧数", FieldType = FieldType.IntField, Describe = "持续帧数", Show = true
            };
            (FramesField.DefaultValue as IntDefaultValue).DefaultValue = 1;
            Frames.AddField(FramesField);
            Frames.Describe = "帧数节点用于在指定的帧数内,持续调用其子节点";
            AddClass(Frames);

            //循环节点 -1无限循环
            NodeDefine Loop = new NodeDefine();
            Loop.ClassType = "Loop";
            Loop.Label     = "循环节点";
            Loop.NodeType  = NodeType.Decorator;
            Loop.Describe  = "循环节点 -1无限循环";
            Loop.AddField(new NodeField()
            {
                FieldName = "LoopTimes", Label = "循环次数", FieldType = FieldType.IntField, Describe = "循环次数", Show = true
            });
            AddClass(Loop);

            //取反节点
            NodeDefine Not = new NodeDefine();
            Not.ClassType = "Not";
            Not.Label     = "取反节点";
            Not.NodeType  = NodeType.Decorator;
            Not.Describe  = "取反节点";
            AddClass(Not);

            //指定时间内运行
            NodeDefine Time = new NodeDefine();
            Time.ClassType = "Time";
            Time.Label     = "时间";
            Time.NodeType  = NodeType.Decorator;
            Time.Describe  = "指定时间内运行";
            NodeField TimeField = new NodeField()
            {
                FieldName = "Duration", Label = "持续时间(毫秒)", FieldType = FieldType.IntField, Describe = "持续时间(毫秒)", Show = true
            };
            (TimeField.DefaultValue as IntDefaultValue).DefaultValue = 1000;
            Time.AddField(TimeField);
            AddClass(Time);

            //阻塞,直到子节点返回true
            NodeDefine SuccessUntil = new NodeDefine();
            SuccessUntil.ClassType = "SuccessUntil";
            SuccessUntil.Label     = "直到子节点返回True";
            SuccessUntil.NodeType  = NodeType.Decorator;
            SuccessUntil.Describe  = "直到子节点返回true";
            AddClass(SuccessUntil);

            #endregion

            #region 条件节点

            //比较节点
            NodeDefine Compare = new NodeDefine();
            Compare.ClassType = "Compare";
            Compare.Label     = "比较节点";
            Compare.NodeType  = NodeType.Condition;
            Compare.Describe  = "Compare节点对左右参数进行比较";
            //左边参数类型
            NodeField Compare_LeftType = new NodeField()
            {
                FieldName = "LeftType", FieldType = FieldType.EnumField, Describe = ""
            };
            (Compare_LeftType.DefaultValue as EnumDefaultValue).EnumType = "ParameterType";
            Compare_LeftType.Label = "左参数类型";
            Compare.AddField(Compare_LeftType);
            //左边参数变量名
            Compare.AddField(new NodeField()
            {
                FieldName = "LeftParameter", Label = "左参数名", FieldType = FieldType.StringField, Describe = "左边参数变量名", Show = true
            });
            //左边常数值
            Compare.AddField(new NodeField()
            {
                FieldName = "LeftConstValue", Label = "左边常数值", FieldType = FieldType.IntField, Describe = "左边常数值,左边参数类型为Const生效"
            });

            //比较符号
            NodeField Compare_Type = new NodeField()
            {
                FieldName = "CompareType", FieldType = FieldType.EnumField, Describe = "比较符号<、>、<=、>=、==、!=", Show = true
            };
            (Compare_Type.DefaultValue as EnumDefaultValue).EnumType = "CompareType";
            Compare_Type.Label = "比较操作符";
            Compare.AddField(Compare_Type);

            //右边边参数类型
            NodeField Compare_RightType = new NodeField()
            {
                FieldName = "RightType", FieldType = FieldType.EnumField, Describe = ""
            };
            (Compare_RightType.DefaultValue as EnumDefaultValue).EnumType = "ParameterType";
            Compare_RightType.Label = "右参数类型";
            Compare.AddField(Compare_RightType);
            //右边参数变量名
            Compare.AddField(new NodeField()
            {
                FieldName = "RightParameter", Label = "右参数名", FieldType = FieldType.StringField, Describe = "右边参数变量名", Show = true
            });
            AddClass(Compare);
            //左边常数值
            Compare.AddField(new NodeField()
            {
                FieldName = "RightConstValue", Label = "右边常数值", FieldType = FieldType.IntField, Describe = "右边常数值,右边参数类型为Const生效"
            });

            #endregion

            #region 动作节点

            //设置变量节点
            NodeDefine SetVariable = new NodeDefine();
            SetVariable.CheckField = false;
            SetVariable.ClassType  = "SetVariable";
            SetVariable.Label      = "设置变量节点";
            SetVariable.NodeType   = NodeType.Action;
            SetVariable.Describe   = "设置变量节点";
            NodeField setVariableNodeField = new NodeField()
            {
                FieldName = "ParameterType", FieldType = FieldType.EnumField, Describe = ""
            };
            (setVariableNodeField.DefaultValue as EnumDefaultValue).EnumType = "ParameterType";
            SetVariable.AddField(setVariableNodeField);
            SetVariable.AddField(new NodeField()
            {
                FieldName = "ParameterName", Label = "变量名", FieldType = FieldType.StringField, Describe = "参数变量名", Show = true
            });
            SetVariable.AddField(new NodeField()
            {
                FieldName = "ParameterValue", Label = "变量值", FieldType = FieldType.IntField, Describe = "参数值", Show = true
            });
            AddClass(SetVariable);

            //等待节点
            NodeDefine Wait = new NodeDefine();
            Wait.ClassType = "Wait";
            Wait.Label     = "等待节点";
            Wait.NodeType  = NodeType.Action;
            Wait.Describe  = "等待节点";
            NodeField WaintField = new NodeField()
            {
                FieldName = "Millisecond", Label = "等待时间(毫秒)", FieldType = FieldType.IntField, Describe = "等待时间(毫秒)", Show = true
            };
            IntDefaultValue WaintFieldDefaultField = WaintField.DefaultValue as IntDefaultValue;
            WaintFieldDefaultField.DefaultValue = 1000;
            Wait.AddField(WaintField);
            AddClass(Wait);

            //空操作节点
            NodeDefine Noop = new NodeDefine();
            Noop.ClassType = "Noop";
            Noop.Label     = "空操作节点";
            Noop.NodeType  = NodeType.Action;
            Noop.Describe  = "空操作节点";
            AddClass(Noop);

            //输出Log节点
            NodeDefine Log = new NodeDefine();
            Log.ClassType = "Log";
            Log.Label     = "输出节点";
            Log.NodeType  = NodeType.Action;
            Log.Describe  = "输出log节点";
            Log.AddField(new NodeField()
            {
                FieldName = "Content", Label = "输出内容", FieldType = FieldType.StringField, Describe = "输出的内容", Show = true
            });
            AddClass(Log);

            #endregion
        }
 public void AddNodeDefine(NodeDefine nodeDefine)
 {
     m_NodeTreeViewManager.BindNodeDefine(nodeDefine);
     MainForm.Instance.ShowInfo("成功添加:" + nodeDefine.ClassType + ",时间:" + DateTime.Now);
 }