/// <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); } }