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() + "个节点类!!!");
        }
Пример #2
0
 public GlobalVariableForm(VariableDesigner globalVariable)
 {
     m_GlobalVariable     = globalVariable;
     m_OldContent         = XmlUtility.ObjectToString(globalVariable);
     m_EditGlobalVariable = XmlUtility.StringToObject <VariableDesigner>(m_OldContent);
     InitializeComponent();
 }
        private void editGroupBTN_Click(object sender, EventArgs e)
        {
            string groupName = textBox1.Text.Trim();

            if (string.IsNullOrEmpty(groupName))
            {
                MainForm.Instance.ShowMessage("组名不能为空");
                return;
            }

            if (MainForm.Instance.TreeViewManager.ExistGroup(groupName))
            {
                MainForm.Instance.ShowMessage(string.Format("{0},已存在", groupName));
                return;
            }

            string oldName = m_Group.GroupName;

            m_EditGroup.GroupName = groupName;

            string content = XmlUtility.ObjectToString(m_EditGroup);

            if (m_OldContent != content)
            {
                m_Group.GroupName = m_EditGroup.GroupName;
                MainForm.Instance.Exec(OperationType.UpdateGroup, oldName, m_Group);
                MainForm.Instance.ShowInfo(string.Format("分组{0}改为{1} 时间:{2}", oldName, m_Group.GroupName, DateTime.Now));
            }

            this.Close();
        }
Пример #4
0
        //加载工作区
        public void LoadWorkSpace()
        {
            //读取行为树类信息
            NodeClasses = XmlUtility.Read <NodeClasses>(GetNodeClassPath());
            if (NodeClasses == null)
            {
                NodeClasses = new NodeClasses();
                NodeClasses.ResetEnums();
                NodeClasses.ResetNodes();
                XmlUtility.Save(MainForm.Instance.GetNodeClassPath(), MainForm.Instance.NodeClasses);
            }

            NodeClassesStringContent = XmlUtility.ObjectToString(NodeClasses);

            this.Text = Settings.Default.EditorTitle;
            if (string.IsNullOrEmpty(Settings.Default.WorkDirectory) || string.IsNullOrEmpty(Settings.Default.WorkSpaceName))
            {
                return;
            }

            WorkSpaceData = XmlUtility.Read <WorkSpaceData>(GetWorkSpacePath());

            if (WorkSpaceData == null)
            {
                return;
            }

            if (WorkSpaceData != null)
            {
                this.Text = string.Format("{0}[{1}]", Settings.Default.EditorTitle, WorkSpaceData.WorkSpaceName);
            }

            //读取行为树数据
            LoadBehaviorTreeData();
        }
Пример #5
0
 public EditBehaviorTreeForm(BehaviorTreeDesigner behaviorTree)
 {
     m_BehaviorTree        = behaviorTree;
     m_BehaviorTreeContent = XmlUtility.ObjectToString(m_BehaviorTree);
     m_EditBehaviorTree    = XmlUtility.StringToObject <BehaviorTreeDesigner>(m_BehaviorTreeContent);
     InitializeComponent();
 }
Пример #6
0
        private void enterBTN_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("枚举类型为空,请填写枚举类型");
                return;
            }

            if (m_EditCustomEnum.Enums.Count == 0)
            {
                MainForm.Instance.ShowMessage("枚举项为0,请添加至少一个枚举项");
                return;
            }

            m_EditCustomEnum.EnumType = textBox1.Text.Trim();
            m_EditCustomEnum.Describe = textBox2.Text.Trim();

            VerifyInfo verifyEnum = m_EditCustomEnum.VerifyEnum();

            if (verifyEnum.HasError)
            {
                MainForm.Instance.ShowMessage(verifyEnum.Msg);
                return;
            }

            string newContent = XmlUtility.ObjectToString(m_EditCustomEnum);

            if (m_OldContent != newContent)
            {
                m_CustomEnum.UpdateEnum(m_EditCustomEnum);
                m_EnumForm.UpdateEnum(m_CustomEnum);
            }

            this.Close();
        }
Пример #7
0
        private void CopyBehaviorTreeVar()
        {
            if (listView2.SelectedItems.Count > 0)
            {
                VariableFieldListContent content = new VariableFieldListContent();
                foreach (ListViewItem lvItem in listView2.SelectedItems)
                {
                    if (lvItem.Tag is VariableFieldDesigner)
                    {
                        content.DataList.Add((VariableFieldDesigner)lvItem.Tag);
                    }
                }

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

                MainForm.Instance.ShowInfo("您复制了" + content.DataList.Count.ToString() + "个变量!!!");
            }
            else
            {
                MainForm.Instance.ShowInfo("您必须选择至少一个进行复制!!!");
                MainForm.Instance.ShowMessage("您必须选择至少一个进行复制!!!", "警告");
            }
        }
Пример #8
0
        private void Copy()
        {
            if (listView1.SelectedItems.Count > 0)
            {
                EnumItemListContent content = new EnumItemListContent();
                foreach (ListViewItem lvItem in listView1.SelectedItems)
                {
                    if (lvItem.Tag is EnumItem)
                    {
                        content.DataList.Add((EnumItem)lvItem.Tag);
                    }
                }

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

                MainForm.Instance.ShowInfo("您复制了" + content.DataList.Count.ToString() + "个枚举选项!!!");
            }
            else
            {
                MainForm.Instance.ShowInfo("您必须选择至少一个进行复制!!!");
                MainForm.Instance.ShowMessage("您必须选择至少一个进行复制!!!", "警告");
            }
        }
 public EditAgentForm(AgentDesigner agent)
 {
     m_Agent        = agent;
     m_AgentContent = XmlUtility.ObjectToString(m_Agent);
     m_EditAgent    = XmlUtility.StringToObject <AgentDesigner>(m_AgentContent);
     InitializeComponent();
 }
Пример #10
0
 public ContextVariableForm(VariableDesigner contextVariable)
 {
     m_ContextVariable     = contextVariable;
     m_OldContent          = XmlUtility.ObjectToString(contextVariable);
     m_EditContextVariable = XmlUtility.StringToObject <VariableDesigner>(m_OldContent);
     InitializeComponent();
 }
Пример #11
0
        /// <summary>
        /// 复制Agent
        /// </summary>
        private void CopyAgent()
        {
            if (treeView1.SelectedNode != null)
            {
                if (!(treeView1.SelectedNode.Tag is AgentItem))
                {
                    ShowMessage("只能复制Agent");
                    return;
                }

                AgentListContent content = new AgentListContent();
                content.DataList.Add((treeView1.SelectedNode.Tag as AgentItem).Agent);

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

                MainForm.Instance.ShowInfo("您复制了" + content.DataList.Count.ToString() + "个枚举!!!");
            }
            else
            {
                MainForm.Instance.ShowInfo("您必须选择一个进行复制!!!");
                MainForm.Instance.ShowMessage("您必须选择一个进行复制!!!", "警告");
            }
        }
Пример #12
0
        private string m_OldContent;//用于检测对象有没有被改变了

        public EditEnumForm(EnumForm enumForm, CustomEnum customEnum)
        {
            m_EnumForm       = enumForm;
            m_CustomEnum     = customEnum;
            m_OldContent     = XmlUtility.ObjectToString(m_CustomEnum);
            m_EditCustomEnum = XmlUtility.StringToObject <CustomEnum>(m_OldContent);
            InitializeComponent();
        }
Пример #13
0
        public EditGroupForm(BehaviorGroupDesigner group)
        {
            m_Group      = group;
            m_OldContent = XmlUtility.ObjectToString(m_Group);
            m_EditGroup  = XmlUtility.StringToObject <BehaviorGroupDesigner>(m_OldContent);

            InitializeComponent();
        }
        public EditGroupForm(Group group)
        {
            m_Group      = group;
            m_OldContent = XmlUtility.ObjectToString(m_Group);
            m_EditGroup  = XmlUtility.StringToObject <Group>(m_OldContent);

            InitializeComponent();
        }
 public EditClassForm(ClassForm classForm, NodeClass nodeClass, Action editCallback)
 {
     m_ClassForm     = classForm;
     m_NodeClass     = nodeClass;
     m_Content       = XmlUtility.ObjectToString(m_NodeClass);
     m_EditNodeClass = XmlUtility.StringToObject <NodeClass>(m_Content);
     m_EditCallback  = editCallback;
     InitializeComponent();
 }
Пример #16
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();
 }
Пример #17
0
        private void ContextVariableForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            string newContent = XmlUtility.ObjectToString(m_EditContextVariable);

            if (newContent != m_OldContent)
            {
                m_ContextVariable.VariableFields = m_EditContextVariable.VariableFields;
            }
        }
        private void enterBTN_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("BehaviorTreeID不能为空");
                MainForm.Instance.ShowInfo("BehaviorTreeID不能为空");
                return;
            }

            string behaviorTreeId = textBox1.Text.Trim();
            string behaviorName   = textBox3.Text.Trim();

            if (m_BehaviorTree.ID != behaviorTreeId)
            {
                if (MainForm.Instance.BehaviorTreeData.ExistBehaviorTree(behaviorTreeId))
                {
                    MainForm.Instance.ShowMessage(string.Format("已存在BehaviorTreeID:{0}", behaviorTreeId));
                    MainForm.Instance.ShowInfo(string.Format("已存在BehaviorTreeID:{0}", behaviorTreeId));
                    return;
                }
            }

            m_EditBehaviorTree.ID       = behaviorTreeId;
            m_EditBehaviorTree.Describe = textBox2.Text.Trim();
            m_EditBehaviorTree.Name     = textBox3.Text.Trim();

            //检验行为树是否合法
            VerifyInfo verifyBehaviorTree = m_EditBehaviorTree.VerifyBehaviorTree();

            if (verifyBehaviorTree.HasError)
            {
                MainForm.Instance.ShowMessage(verifyBehaviorTree.Msg);
                return;
            }

            string editContent = XmlUtility.ObjectToString(m_EditBehaviorTree);

            if (editContent != m_BehaviorTreeContent)
            {
                m_BehaviorTree.UpdateBehaviorTree(m_EditBehaviorTree);
                MainForm.Instance.ShowInfo(string.Format("更新行为树:{0}成功 时间:{1}", m_EditBehaviorTree.ID, DateTime.Now));
            }

            MainForm.Instance.Exec(OperationType.UpdateBehaviorTree, m_BehaviorTree);
            this.Close();
        }
        private void enterBTN_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("AgentID不能为空");
                MainForm.Instance.ShowInfo("AgentID不能为空");
                return;
            }

            string agentId = textBox1.Text.Trim();

            if (m_Agent.AgentID != agentId)
            {
                if (MainForm.Instance.TreeData.ExistAgent(agentId))
                {
                    MainForm.Instance.ShowMessage(string.Format("已存在AgentID:{0}", agentId));
                    MainForm.Instance.ShowInfo(string.Format("已存在AgentID:{0}", agentId));
                    return;
                }
            }

            m_EditAgent.AgentID  = agentId;
            m_EditAgent.Describe = textBox2.Text.Trim();

            //检验Agent的是否合法
            VerifyInfo verifyAgent = m_EditAgent.VerifyAgent();

            if (verifyAgent.HasError)
            {
                MainForm.Instance.ShowMessage(verifyAgent.Msg);
                return;
            }

            string editContent = XmlUtility.ObjectToString(m_EditAgent);

            if (editContent != m_AgentContent)
            {
                m_Agent.UpdateAgent(m_EditAgent);
                MainForm.Instance.ShowInfo(string.Format("更新Agent:{0}成功 时间:{1}", m_EditAgent.AgentID, DateTime.Now));
            }

            MainForm.Instance.Exec(OperationType.UpdateAgent, m_Agent);
            this.Close();
        }
Пример #20
0
        private void enterBTN_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(classTypeTB.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("请填写类名", "提示");
                return;
            }

            if (categoryTB.Text.Trim().Contains(" "))
            {
                MainForm.Instance.ShowMessage("类别不能有空格", "提示");
                return;
            }

            m_EditNodeDefine.ClassType  = classTypeTB.Text.Trim();
            m_EditNodeDefine.NodeType   = (NodeType)(nodeTypeCBB.SelectedIndex + 1);
            m_EditNodeDefine.Label      = labelTB.Text.Trim();
            m_EditNodeDefine.Describe   = describeTB.Text.Trim();
            m_EditNodeDefine.Category   = categoryTB.Text.Trim();
            m_EditNodeDefine.CheckField = CBB_CheckField.Checked;
            m_NodeDefine.NodeIcon       = nodeIconCBB.Text;

            //校验节点类是否合法
            VerifyInfo verifyNodeDefine = m_EditNodeDefine.VerifyNodeDefine();

            if (verifyNodeDefine.HasError)
            {
                MainForm.Instance.ShowMessage(verifyNodeDefine.Msg);
                return;
            }

            string content = XmlUtility.ObjectToString(m_EditNodeDefine);

            if (m_Content != content)
            {
                m_NodeDefine.UpdateNodeDefine(m_EditNodeDefine);
                MainForm.Instance.ShowInfo("修改成功 时间:" + DateTime.Now);
            }

            this.Close();

            m_EditCallback?.Invoke();
        }
Пример #21
0
        //打开工作区
        public void OpenWorkSpace()
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = string.Format("工作区配置|*{0}", Settings.Default.WorkSpaceSetupSuffix);
            openFileDialog.Title  = "打开工作区";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string workSpaceFile = openFileDialog.FileName.Trim();
                if (File.Exists(workSpaceFile))
                {
                    DirectoryInfo dirInfo       = new DirectoryInfo(workSpaceFile);
                    string        workDirectory = dirInfo.Parent.FullName;
                    WorkSpaceData = XmlUtility.Read <WorkSpaceData>(workSpaceFile);
                    if (WorkSpaceData != null)
                    {
                        Settings.Default.WorkDirectory = workDirectory;
                        Settings.Default.WorkSpaceName = WorkSpaceData.WorkSpaceName;
                        Settings.Default.Save();
                        Text = string.Format("{0}[{1}]", Settings.Default.EditorTitle, WorkSpaceData.WorkSpaceName);
                        ShowInfo("打开工作区,时间:" + DateTime.Now);

                        //读取行为树类信息
                        NodeClasses = XmlUtility.Read <NodeClasses>(GetNodeClassPath());
                        if (NodeClasses == null)
                        {
                            NodeClasses = new NodeClasses();
                            NodeClasses.ResetNodes();
                            XmlUtility.Save(GetNodeClassPath(), NodeClasses);
                        }

                        NodeClassesStringContent = XmlUtility.ObjectToString(NodeClasses);

                        //读取行为树数据
                        LoadBehaviorTreeData();

                        CreateTreeViewManager();
                    }
                }
            }
        }
Пример #22
0
        public void LoadBehaviorTreeData()
        {
            //读取行为树数据
            BehaviorTreeData = XmlUtility.Read <BehaviorTreeDataDesigner>(GetBehaviorTreeDataPath());
            if (BehaviorTreeData == null)
            {
                BehaviorTreeData = new BehaviorTreeDataDesigner();
                XmlUtility.Save(GetBehaviorTreeDataPath(), BehaviorTreeData);
            }

            BehaviorTreeDataStringContent = XmlUtility.ObjectToString(BehaviorTreeData);

            if (BehaviorTreeData.BehaviorTrees.Count > 0)
            {
                for (int i = 0; i < BehaviorTreeData.BehaviorTrees.Count; i++)
                {
                    BehaviorTreeDesigner behaviorTree = BehaviorTreeData.BehaviorTrees[i];
                    if (behaviorTree != null)
                    {
                        if (behaviorTree.Nodes.Count > 0)
                        {
                            for (int ii = 0; ii < behaviorTree.Nodes.Count; ii++)
                            {
                                NodeDesigner node = behaviorTree.Nodes[ii];
                                if (node.Transitions.Count > 0)
                                {
                                    for (int iii = 0; iii < node.Transitions.Count; iii++)
                                    {
                                        Transition   transition = node.Transitions[iii];
                                        NodeDesigner fromNode   = behaviorTree.FindNodeByID(transition.FromNodeID);
                                        NodeDesigner toNode     = behaviorTree.FindNodeByID(transition.ToNodeID);
                                        transition.Set(toNode, fromNode);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #23
0
        public void LoadBehaviorTreeData()
        {
            //读取行为树数据
            TreeData = XmlUtility.Read <TreeData>(GetBehaviorTreeDataPath());
            if (TreeData == null)
            {
                TreeData = new TreeData();
                XmlUtility.Save(GetBehaviorTreeDataPath(), TreeData);
            }

            BehaviorTreeDataStringContent = XmlUtility.ObjectToString(TreeData);

            if (TreeData.Agents.Count > 0)
            {
                for (int i = 0; i < TreeData.Agents.Count; i++)
                {
                    AgentDesigner agent = TreeData.Agents[i];
                    if (agent != null)
                    {
                        if (agent.Nodes.Count > 0)
                        {
                            for (int ii = 0; ii < agent.Nodes.Count; ii++)
                            {
                                NodeDesigner node = agent.Nodes[ii];
                                if (node.Transitions.Count > 0)
                                {
                                    for (int iii = 0; iii < node.Transitions.Count; iii++)
                                    {
                                        Transition   transition = node.Transitions[iii];
                                        NodeDesigner fromNode   = agent.FindNodeByID(transition.FromNodeID);
                                        NodeDesigner toNode     = agent.FindNodeByID(transition.ToNodeID);
                                        transition.Set(toNode, fromNode);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #24
0
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Settings.Default.Save();

            if (e.CloseReason == CloseReason.UserClosing)
            {
                bool nodeClassDirty = false;
                if (NodeClasses != null)
                {
                    string tempNodeClassesStringContent = XmlUtility.ObjectToString(NodeClasses);
                    if (tempNodeClassesStringContent != NodeClassesStringContent)
                    {
                        nodeClassDirty = true;
                    }
                }

                bool behaviorTreeDirty = false;
                if (TreeData != null)
                {
                    string tempBehaviorTreeDataStringContent = XmlUtility.ObjectToString(TreeData);
                    if (tempBehaviorTreeDataStringContent != BehaviorTreeDataStringContent)
                    {
                        behaviorTreeDirty = true;
                    }
                }

                if (nodeClassDirty || behaviorTreeDirty)
                {
                    DialogResult result = MessageBox.Show(Settings.Default.SaveWarnning, Settings.Default.EditorTitle,
                                                          MessageBoxButtons.OKCancel);
                    if (result == DialogResult.OK)
                    {
                        Exec(OperationType.Save);
                    }
                }
            }
        }
        private void enterBTN_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(workSpaceNameTB.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("请输入工作区名字", "警告");
                return;
            }

            if (string.IsNullOrEmpty(workSpaceDirectoryTB.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("请选择工作区位置", "警告");
                return;
            }

            if (!Directory.Exists(workSpaceDirectoryTB.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("工作区目录不存在", "警告");
                return;
            }

            //if (string.IsNullOrEmpty(dataSaveDirectoryTB.Text.Trim()))
            //{
            //    MainForm.Instance.ShowMessage("请选择数据保存位置", "警告");
            //    return;
            //}

            if (!string.IsNullOrEmpty(dataSaveDirectoryTB.Text.Trim()) && !Directory.Exists(dataSaveDirectoryTB.Text.Trim()))
            {
                MainForm.Instance.ShowMessage("数据保存目录不存在", "警告");
                return;
            }

            string workSpaceDirector = workSpaceDirectoryTB.Text.Trim();

            string[] files = Directory.GetFiles(workSpaceDirector, "*" + Settings.Default.WorkSpaceSetupSuffix);
            if (files.Length > 0)
            {
                string existWorkSpaceName = Path.GetFileName(files[0]);
                //去掉后缀
                existWorkSpaceName = existWorkSpaceName.Replace(Settings.Default.WorkSpaceSetupSuffix, "");
                MainForm.Instance.ShowMessage(string.Format("该位置已被{0}使用,请选择别的目录作为新的工作区位置", existWorkSpaceName), "警告");
                return;
            }

            MainForm.Instance.WorkSpaceData = new WorkSpaceData();
            MainForm.Instance.WorkSpaceData.WorkSpaceName = workSpaceNameTB.Text.Trim();
            MainForm.Instance.WorkSpaceData.Describe      = describeTB.Text.Trim();

            Settings.Default.WorkSpaceName    = workSpaceNameTB.Text.Trim();
            Settings.Default.WorkDirectory    = workSpaceDirectoryTB.Text.Trim();
            Settings.Default.NodeDataSavePath = dataSaveDirectoryTB.Text.Trim();

            Settings.Default.Save();
            XmlUtility.Save <WorkSpaceData>(MainForm.Instance.GetWorkSpacePath(), MainForm.Instance.WorkSpaceData);
            MainForm.Instance.ShowInfo("新建工作区成功,时间:" + DateTime.Now);

            //初始化节点类信息
            MainForm.Instance.NodeClasses = new NodeClasses();
            MainForm.Instance.NodeClasses.ResetNodes();
            XmlUtility.Save(MainForm.Instance.GetNodeClassPath(), MainForm.Instance.NodeClasses);
            MainForm.Instance.NodeClassesStringContent = XmlUtility.ObjectToString(MainForm.Instance.NodeClasses);

            //初始化行为树数据
            MainForm.Instance.TreeData = new TreeData();
            XmlUtility.Save(MainForm.Instance.GetBehaviorTreeDataPath(), MainForm.Instance.TreeData);
            MainForm.Instance.BehaviorTreeDataStringContent = XmlUtility.ObjectToString(MainForm.Instance.TreeData);

            MainForm.Instance.CreateTreeViewManager();

            MainForm.Instance.Exec(OperationType.Refresh);

            this.Close();
        }
Пример #26
0
        //保存
        public void Save()
        {
            if (WorkSpaceData == null)
            {
                ShowMessage("当前没有工作空间,请新建或者打开工作空间!");
                return;
            }

            if (NodeClasses == null || TreeData == null)
            {
                return;
            }

            //节点类移除未定义的枚举字段
            NodeClasses.RemoveUnDefineEnumField();

            //移除未定义的节点
            TreeData.RemoveUnDefineNode();

            //修正数据,和模板的保持一致
            TreeData.AjustData();

            //检验枚举
            VerifyInfo verifyEnum = NodeClasses.VerifyEnum();

            if (verifyEnum.HasError)
            {
                ShowMessage(verifyEnum.Msg);
                ShowInfo(verifyEnum.Msg);
                return;
            }

            //检验节点类
            VerifyInfo verifyNodeClass = NodeClasses.VerifyNodeClass();

            if (verifyNodeClass.HasError)
            {
                ShowMessage(verifyNodeClass.Msg);
                ShowInfo(verifyNodeClass.Msg);
                return;
            }

            //校验行为树
            VerifyInfo verifyBehaviorTree = TreeData.VerifyBehaviorTree();

            if (verifyBehaviorTree.HasError)
            {
                ShowMessage(verifyBehaviorTree.Msg);
                ShowInfo(verifyBehaviorTree.Msg);
                return;
            }

            if (XmlUtility.Save(GetNodeClassPath(), NodeClasses))
            {
                NodeClassesStringContent = XmlUtility.ObjectToString(NodeClasses);
            }


            if (XmlUtility.Save(GetBehaviorTreeDataPath(), TreeData))
            {
                BehaviorTreeDataStringContent = XmlUtility.ObjectToString(TreeData);
            }

            //序列化成二进制
            BehaviorTreeData.TreeData treeData = EditorUtility.CreateTreeData(TreeData);
            if (treeData != null)
            {
                string savePath = GetNodeDataSavePath();
                if (File.Exists(savePath))
                {
                    File.Delete(savePath);
                }
                BehaviorTreeData.Serializer.SerializeToFile(treeData, savePath);
            }

            ShowInfo("保存成功 时间:" + DateTime.Now);
        }