/// <summary>
        /// 自动配置所有行为树结点
        /// </summary>
        /// <param name="npDataSupportorBase">自定义的继承于NP_DataSupportorBase的数据体</param>
        private void AutoSetNP_NodeData(NP_DataSupportorBase npDataSupportorBase)
        {
            npDataSupportorBase.NPBehaveTreeDataId = 0;
            npDataSupportorBase.NP_DataSupportorDic.Clear();

            //当前Canvas所有NP_Node
            List <NP_NodeBase> allNodes = new List <NP_NodeBase>();

            foreach (var node in this.nodes)
            {
                if (node is NP_NodeBase mNode)
                {
                    allNodes.Add(mNode);
                }
            }

            //排序
            allNodes.Sort((x, y) => - x.position.y.CompareTo(y.position.y));

            //配置每个节点Id
            foreach (var node in allNodes)
            {
                node.NP_GetNodeData().id = IdGenerater.GenerateId();
            }

            //设置导出的Id
            foreach (string str in this.Config.text.Split(new[] { "\n" }, StringSplitOptions.None))
            {
                try
                {
                    string str2 = str.Trim();
                    if (str2 == "")
                    {
                        continue;
                    }

                    object config = JsonHelper.FromJson(this.ConfigType, str2);

                    //目前行为树只有三种类型,直接在这里写出
                    switch (config)
                    {
                    case Server_AICanvasConfig serverAICanvasConfig:
                        if (serverAICanvasConfig.Id == this.IdInConfig)
                        {
                            npDataSupportorBase.NPBehaveTreeDataId = serverAICanvasConfig.NPBehaveId;
                        }

                        break;

                    case Client_SkillCanvasConfig clientSkillCanvasConfig:
                        if (clientSkillCanvasConfig.Id == this.IdInConfig)
                        {
                            npDataSupportorBase.NPBehaveTreeDataId = clientSkillCanvasConfig.NPBehaveId;
                        }

                        break;

                    case Server_SkillCanvasConfig serverSkillCanvasConfig:
                        if (serverSkillCanvasConfig.Id == this.IdInConfig)
                        {
                            npDataSupportorBase.NPBehaveTreeDataId = serverSkillCanvasConfig.NPBehaveId;
                        }

                        break;
                    }

                    if (npDataSupportorBase.NPBehaveTreeDataId != 0)
                    {
                        break;
                    }
                }
                catch (Exception e)
                {
                    throw new Exception($"parser json fail: {str}", e);
                }
            }

            if (npDataSupportorBase.NPBehaveTreeDataId == 0)
            {
                //设置为根结点Id
                npDataSupportorBase.NPBehaveTreeDataId = allNodes[allNodes.Count - 1].NP_GetNodeData().id;
                Log.Error(
                    $"注意,名为{this.canvasName}的Canavs首次导出,或者未在配置表中找到Id为{this.IdInConfig}的数据行,行为树Id被设置为{npDataSupportorBase.NPBehaveTreeDataId},请前往Excel表中进行添加,然后导出Excel");
            }
            else
            {
                allNodes[allNodes.Count - 1].NP_GetNodeData().id = npDataSupportorBase.NPBehaveTreeDataId;
            }

            foreach (var node in allNodes)
            {
                //获取结点对应的NPData
                NP_NodeDataBase mNodeData = node.NP_GetNodeData();
                if (mNodeData.LinkedIds == null)
                {
                    mNodeData.LinkedIds = new List <long>();
                }

                mNodeData.LinkedIds.Clear();

                //出结点连接的Nodes
                List <NP_NodeBase> theNodesConnectedToOutNode = new List <NP_NodeBase>();

                List <ValueConnectionKnob> valueConnectionKnobs = node.GetNextNodes()?.connections;

                if (valueConnectionKnobs != null)
                {
                    foreach (var valueConnectionKnob in valueConnectionKnobs)
                    {
                        theNodesConnectedToOutNode.Add((NP_NodeBase)valueConnectionKnob.body);
                    }

                    //对所连接的节点们进行排序
                    theNodesConnectedToOutNode.Sort((x, y) => x.position.x.CompareTo(y.position.x));

                    //配置连接的Id,运行时实时构建行为树
                    foreach (var npNodeBase in theNodesConnectedToOutNode)
                    {
                        mNodeData.LinkedIds.Add(npNodeBase.NP_GetNodeData().id);
                    }
                }

                //将此结点数据写入字典
                npDataSupportorBase.NP_DataSupportorDic.Add(mNodeData.id, mNodeData);
            }
        }
        /// <summary>
        /// 自动配置所有行为树结点
        /// </summary>
        /// <param name="npDataSupportorBase">自定义的继承于NP_DataSupportorBase的数据体</param>
        private void AutoSetNP_NodeData(NP_DataSupportorBase npDataSupportorBase)
        {
            npDataSupportorBase.NP_DataSupportorDic.Clear();

            //当前Canvas所有NP_Node
            List <NP_NodeBase> allNodes = new List <NP_NodeBase>();

            foreach (var node in this.nodes)
            {
                if (node is NP_NodeBase mNode)
                {
                    allNodes.Add(mNode);
                }
            }

            //排序
            allNodes.Sort((x, y) => - x.position.y.CompareTo(y.position.y));

            //配置每个节点Id
            foreach (var node in allNodes)
            {
                node.NP_GetNodeData().id = IdGenerater.GenerateId();
            }

            //设置根结点Id
            npDataSupportorBase.RootId = allNodes[allNodes.Count - 1].NP_GetNodeData().id;

            foreach (var node in allNodes)
            {
                //获取结点对应的NPData
                NP_NodeDataBase mNodeData = node.NP_GetNodeData();
                if (mNodeData.LinkedIds == null)
                {
                    mNodeData.LinkedIds = new List <long>();
                }
                mNodeData.LinkedIds.Clear();

                //出结点连接的Nodes
                List <NP_NodeBase> theNodesConnectedToOutNode = new List <NP_NodeBase>();

                List <ValueConnectionKnob> valueConnectionKnobs = node.GetNextNodes()?.connections;

                if (valueConnectionKnobs != null)
                {
                    foreach (var valueConnectionKnob in valueConnectionKnobs)
                    {
                        theNodesConnectedToOutNode.Add((NP_NodeBase)valueConnectionKnob.body);
                    }

                    //对所连接的节点们进行排序
                    theNodesConnectedToOutNode.Sort((x, y) => x.position.x.CompareTo(y.position.x));

                    //配置连接的Id,运行时实时构建行为树
                    foreach (var npNodeBase in theNodesConnectedToOutNode)
                    {
                        mNodeData.LinkedIds.Add(npNodeBase.NP_GetNodeData().id);
                    }
                }

                //将此结点数据写入字典
                npDataSupportorBase.NP_DataSupportorDic.Add(mNodeData.id, mNodeData);
            }
        }