Ejemplo n.º 1
0
        protected override CompositeStatus UpdateChilds(Context <TBlackboard> context, NodeContext <TBlackboard> nodeContext)
        {
            CompositeStatus result = new CompositeStatus()
            {
                Status = Status.Fail
            };

            for (int i = 0; i < Childs.Length; i++)
            {
                Node <TBlackboard> node = Childs[i];
                if (node == null)
                {
                    throw new NullReferenceException("BTNode child can not be null");
                }

                //check if this child is running in previous update
                bool isRunning = nodeContext.IsRunning && (i == nodeContext.ChildNodeIndex);
                //update child
                result.Status = node.Update(context);
                //stop if Succeed
                if (result.Status == Status.Ok || result.Status == Status.Running)
                {
                    result.ChidlNodeIndex = i;
                    break;
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        protected override Status OnUpdate(Context <TBlackboard> context, NodeContext <TBlackboard> nodeContext)
        {
            CompositeStatus status = UpdateChilds(context, nodeContext);

            if (status.Status == Status.Running)
            {
                nodeContext.ChildNodeIndex = status.ChidlNodeIndex;
            }
            return(status.Status);
        }
Ejemplo n.º 3
0
        protected override CompositeStatus UpdateChilds(Context <TBlackboard> context, NodeContext <TBlackboard> nodeContext)
        {
            CompositeStatus result = new CompositeStatus()
            {
                Status = Status.Ok
            };

            int startIndex = 0;

            //if node contains running childs, update it firstly
            if (nodeContext.IsRunning)
            {
                int index = nodeContext.ChildNodeIndex;
                Node <TBlackboard> node = Childs[index];
                result.Status         = node.Update(context);
                result.ChidlNodeIndex = index;
                startIndex            = index + 1;
            }
            //if previous node was successful
            if (result.Status == Status.Ok)
            {
                for (int i = startIndex; i < Childs.Length; i++)
                {
                    Node <TBlackboard> node = Childs[i];
                    if (node == null)
                    {
                        throw new NullReferenceException("BTNode child can not be null");
                    }

                    result.Status = node.Update(context);
                    //stop if node Fails or in running state
                    if (result.Status == Status.Fail || result.Status == Status.Running)
                    {
                        result.ChidlNodeIndex = i;
                        break;
                    }
                }
            }

            return(result);
        }