public BaseNodeProxy CreateProxy(BaseNode node) { if (node == null) { //组合节点必须有子节点 string msg = "BehaviorTreeManager.CreateProxy() \n Create nodeProxy failed,node is null."; LogError(msg); throw new Exception(msg); } //重置节点状态 if (node.Status != ENodeStatus.None) { node.Status = ENodeStatus.None; } IProxyManager proxyManager = null; for (int i = 0; i < m_ProxyManagers.Count; i++) { IProxyManager tempProxyManager = m_ProxyManagers[i]; ProxyData proxyData = tempProxyManager.GetProxyData(node.ClassType); if (proxyData != null) { proxyManager = tempProxyManager; break; } } if (proxyManager == null) { string msg = $"BehaviorTreeManager.CreateProxy() \n Create nodeProxy failed,proxyManager is null."; LogError(msg); throw new Exception(msg); } BaseNodeProxy nodeProxy = proxyManager.CreateProxy(); if (nodeProxy == null) { string msg = $"BehaviorTreeManager.CreateProxy() \n Create nodeProxy failed,ClassType:{node.ProxyData.ClassType}"; LogError(msg); throw new Exception(msg); } nodeProxy.BeginInit(); nodeProxy.SetNode(node); nodeProxy.SetData(node.NodeData); nodeProxy.SetContext(node.Context); nodeProxy.EndInit(); return(nodeProxy); }
/// <summary> /// 构建节点 /// </summary> /// <param name="nodeData">节点数据</param> public BaseNode CreateNode(NodeData nodeData) { if (nodeData == null) { string msg = "BehaviorTreeManager.CreateNode() \n nodeData is null."; LogError(msg); throw new Exception(msg); } ProxyData proxyData = null; for (int i = 0; i < m_ProxyManagers.Count; i++) { IProxyManager proxyManager = m_ProxyManagers[i]; proxyData = proxyManager.GetProxyData(nodeData.ClassType); if (proxyData != null) { break; } } if (proxyData == null) { string msg = "BehaviorTreeManager.CreateNode() \n proxyData is null."; LogError(msg); throw new Exception(msg); } BaseNode baseNode = null; switch (proxyData.NodeType) { case ENodeType.Action: ActionNode actionNode = new ActionNode(); actionNode.NodeType = ENodeType.Action; baseNode = actionNode; break; case ENodeType.Composite: CompositeNode compositeNode = new CompositeNode(); compositeNode.NodeType = ENodeType.Composite; baseNode = compositeNode; break; case ENodeType.Condition: ConditionNode conditionNode = new ConditionNode(); conditionNode.NodeType = ENodeType.Condition; baseNode = conditionNode; break; case ENodeType.Decorator: DecorateNode decorateNode = new DecorateNode(); decorateNode.NodeType = ENodeType.Condition; baseNode = decorateNode; break; } if (baseNode == null) { //组合节点必须有子节点 string msg = $"CreateNode {proxyData.ClassType} Failed"; LogError(msg); throw new Exception(msg); } baseNode.SetData(nodeData); baseNode.SetProxyData(proxyData); if (baseNode is CompositeNode) { if (nodeData.Childs == null || nodeData.Childs.Count == 0) { //组合节点必须有子节点 string msg = $"{proxyData.NodeType} node must have child nodes"; LogError(msg); throw new Exception(msg); } CompositeNode compositeNode = baseNode as CompositeNode; for (int i = 0; i < nodeData.Childs.Count; i++) { NodeData childNodeData = nodeData.Childs[i]; BaseNode childNode = CreateNode(childNodeData); compositeNode.AddChild(childNode); } } return(baseNode); }
/// <summary> /// 构建节点 /// </summary> /// <param name="nodeData">节点数据</param> public BaseNode CreateNode(NodeData nodeData) { if (nodeData == null) { throw new Exception($"BehaviorTreeManager.CreateNode() \n nodeData is null."); } var proxyData = _proxyManager.GetProxyData(nodeData.ClassType); if (proxyData == null) { throw new Exception($"BehaviorTreeManager.CreateNode({nodeData.ClassType}) \n proxyData is null."); } BaseNode baseNode = null; switch (proxyData.NodeType) { case NodeType.Action: baseNode = new ActionNode { NodeType = NodeType.Action }; break; case NodeType.Composite: baseNode = new CompositeNode { NodeType = NodeType.Composite }; break; case NodeType.Condition: baseNode = new ConditionNode { NodeType = NodeType.Condition }; break; case NodeType.Decorator: baseNode = new DecorateNode { NodeType = NodeType.Condition }; break; } if (baseNode == null) { throw new Exception($"CreateNode {proxyData.Name} Failed"); } baseNode.SetData(nodeData); baseNode.SetProxyData(proxyData); if (baseNode is CompositeNode) { if (nodeData.Childs == null || nodeData.Childs.Count == 0) { throw new Exception($"{proxyData.NodeType} node must have child nodes"); } var compositeNode = baseNode as CompositeNode; for (int i = 0; i < nodeData.Childs.Count; i++) { var childNodeData = nodeData.Childs[i]; var childNode = CreateNode(childNodeData); compositeNode.AddChild(childNode); } } return(baseNode); }