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