예제 #1
0
        public static BTData.NodeData CreateNode(BehaviorTreeDesigner behaviorTree, NodeDesigner nodeData)
        {
            BTData.NodeData data = new BTData.NodeData();
            data.ID        = nodeData.ID;
            data.ClassType = nodeData.ClassType;
            data.Label     = nodeData.Label;
            data.X         = (int)nodeData.Rect.x;
            data.Y         = (int)nodeData.Rect.y;

            for (int i = 0; i < nodeData.Fields.Count; i++)
            {
                FieldDesigner field = nodeData.Fields[i];
                if (field == null)
                {
                    continue;
                }
                data.Fields.Add(CreateField(field));
            }

            if (nodeData.Transitions.Count > 0)
            {
                data.Childs = new List <BTData.NodeData>(nodeData.Transitions.Count);
                for (int i = 0; i < nodeData.Transitions.Count; i++)
                {
                    Transition      transition    = nodeData.Transitions[i];
                    NodeDesigner    childNode     = behaviorTree.FindByID(transition.ToNodeID);
                    BTData.NodeData childNodeData = CreateNode(behaviorTree, childNode);
                    data.Childs.Add(childNodeData);
                }
            }

            return(data);
        }
예제 #2
0
        private DebugNode CreateDebugNode(BehaviorTreeDesigner behaviorTree, NodeDesigner node)
        {
            DebugNode debugNode = null;

            //组合节点
            if (node.NodeType == NodeType.Composite)
            {
                //顺序节点
                if (node.ClassType == "Sequence")
                {
                    Debug__Sequence debug__Sequence = new Debug__Sequence();
                    debugNode = debug__Sequence;
                }
                //并行节点
                else if (node.ClassType == "Parallel")
                {
                    EnumFieldDesigner successPolicy = node.Fields[0].Field as EnumFieldDesigner;
                    EnumFieldDesigner failedPolicy  = node.Fields[0].Field as EnumFieldDesigner;

                    Debug__Parallel debug__Parallel = new Debug__Parallel();
                    debug__Parallel.SuccessPolicy = (Debug__Parallel.SUCCESS_POLICY)successPolicy.ValueInt;
                    debug__Parallel.FailurePolicy = (Debug__Parallel.FAILURE_POLICY)failedPolicy.ValueInt;

                    debugNode = debug__Parallel;
                }
                //随机节点
                else if (node.ClassType == "Random")
                {
                    Debug__Random debug__Random = new Debug__Random();
                    debugNode = debug__Random;
                }
                //随机序列
                else if (node.ClassType == "RandomSequence")
                {
                    Debug__RandomSequence__Node debug__RandomSequence__Node = new Debug__RandomSequence__Node();
                    debugNode = debug__RandomSequence__Node;
                }
                //随机选择节点
                else if (node.ClassType == "RandomSelector")
                {
                    Debug__RandomSelector debug__RandomSelector = new Debug__RandomSelector();
                    debugNode = debug__RandomSelector;
                }
                //ifelse节点
                else if (node.ClassType == "IfElse")
                {
                    Debug__IfElse debug__IfElse = new Debug__IfElse();
                    debugNode = debug__IfElse;
                }
                //选择节点
                else if (node.ClassType == "Selector")
                {
                    Debug__Selector debug__Selector = new Debug__Selector();
                    debugNode = debug__Selector;
                }
                //概率选择
                else if (node.ClassType == "RateSelector")
                {
                    Debug__SelectorProbability debug__SelectorProbability = new Debug__SelectorProbability();
                    debugNode = debug__SelectorProbability;
                }
                else
                {
                    //统一用默认的组合节点,(顺序节点)
                    Debug__Composite debug__Composite = new Debug__Composite();
                    debugNode = debug__Composite;
                }
            }
            //装饰节点
            else if (node.NodeType == NodeType.Decorator)
            {
                //失败节点
                if (node.ClassType == "Failure")
                {
                    Debug__Failure debug__Failure = new Debug__Failure();
                    debugNode = debug__Failure;
                }
                //成功节点
                else if (node.ClassType == "Success")
                {
                    Debug__Success debug__Success = new Debug__Success();
                    debugNode = debug__Success;
                }
                //执行帧节点
                else if (node.ClassType == "Frames")
                {
                    Debug__Frames debug__Frames = new Debug__Frames();
                    debugNode = debug__Frames;
                }
                //循环节点
                else if (node.ClassType == "Loop")
                {
                    Debug__Loop debug__Loop = new Debug__Loop();
                    debugNode = debug__Loop;
                }
                //取反节点
                else if (node.ClassType == "Not")
                {
                    Debug__Not debug__Not = new Debug__Not();
                    debugNode = debug__Not;
                }
                //指定时间内运行
                else if (node.ClassType == "Time")
                {
                    Debug__Time debug__Time = new Debug__Time();
                    debugNode = debug__Time;
                }
                //等待直到子节点返回成功
                else if (node.ClassType == "SuccessUntil")
                {
                    Debug__SuccessUntil debug__SuccessUntil = new Debug__SuccessUntil();
                    debugNode = debug__SuccessUntil;
                }
                else
                {
                    Debug__Decorator debug__Decorator = new Debug__Decorator();
                    debug__Decorator.CanChangeStatus = true;
                    debugNode = debug__Decorator;
                }
            }
            //条件节点
            else if (node.NodeType == NodeType.Condition)
            {
                Debug__Condition debug__Condition = new Debug__Condition();
                debug__Condition.CanChangeStatus = true;
                debugNode = debug__Condition;
            }
            //动作节点
            else if (node.NodeType == NodeType.Action)
            {
                //等待一段时间
                if (node.ClassType == "Wait")
                {
                    Debug__Wait debug__Wait = new Debug__Wait();
                    debugNode = debug__Wait;
                }
                //赋值节点Int
                else if (node.ClassType == "AssignmentInt")
                {
                    Debug__AssignmentInt debug__AssignmentInt = new Debug__AssignmentInt();
                    debugNode = debug__AssignmentInt;
                }
                //赋值节点Float
                else if (node.ClassType == "AssignmentFloat")
                {
                    Debug__AssignmentFloat debug__AssignmentFloat = new Debug__AssignmentFloat();
                    debugNode = debug__AssignmentFloat;
                }
                //赋值节点String
                else if (node.ClassType == "AssignmentString")
                {
                    Debug__AssignmentString debug__AssignmentString = new Debug__AssignmentString();
                    debugNode = debug__AssignmentString;
                }
                //空操作节点
                else if (node.ClassType == "Noop")
                {
                    Debug_Noop debug_Noop = new Debug_Noop();
                    debugNode = debug_Noop;
                }
                //输出log节点
                else if (node.ClassType == "Log")
                {
                    Debug__Log debug__Log = new Debug__Log();
                    debugNode = debug__Log;
                }
                else
                {
                    Debug__Action debug__Action = new Debug__Action();
                    debugNode = debug__Action;
                    debugNode.CanChangeStatus = true;
                }
            }

            debugNode.Node = node;
            m_Nodes.Add(debugNode);

            for (int i = 0; i < node.Transitions.Count; i++)
            {
                Transition   transition     = node.Transitions[i];
                NodeDesigner childNode      = behaviorTree.FindByID(transition.ToNodeID);
                DebugNode    childDebugNode = CreateDebugNode(behaviorTree, childNode);
                childDebugNode.ParentNode = debugNode;
                debugNode.Childs.Add(childDebugNode);
            }

            return(debugNode);
        }