/// <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);
        }
Esempio n. 2
0
        /// <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);
        }