/// <summary> /// Ticks the iterator. /// </summary> public void Update() { CallOnEnterOnQueuedNodes(); TickBranch(); int index = _traversal.Peek(); BehaviourNode node = _tree.allNodes[index]; LastStatusReturned = node.Run(); #if UNITY_EDITOR node.SetStatusEditor(LastStatusReturned); #endif if (LastStatusReturned != BehaviourNode.Status.Running) { PopNode(); CallOnChildExit(node); } if (_traversal.Count == 0) { OnDone(); } }
private void stepBackAbort() { int index = _traversal.Pop(); BehaviourNode node = _tree.allNodes[index]; node.OnExit(); #if UNITY_EDITOR node.SetStatusEditor(BehaviourNode.StatusEditor.Aborted); #endif }
/// <summary> /// Requests the iterator to traverse a new node. /// </summary> /// <param name="next"></param> public void Traverse(BehaviourNode next) { int index = next.preOrderIndex; _traversal.Push(index); _requestedTraversals.Enqueue(index); LastStatusReturned = BehaviourNode.Status.Running; #if UNITY_EDITOR next.SetStatusEditor(BehaviourNode.Status.Running); #endif }
/// <summary> /// Only interrupts the subtree until a parallel node. /// </summary> /// <param name="subtree"></param> internal void stepBackInterrupt(BehaviourNode subtree, bool bFullInterrupt = false) { while (_traversal.Count != 0 && _traversal.Peek() != subtree.preOrderIndex) { int index = _traversal.Pop(); BehaviourNode node = _tree.allNodes[index]; node.OnExit(); #if UNITY_EDITOR node.SetStatusEditor(BehaviourNode.StatusEditor.Interruption); #endif } if (bFullInterrupt && _traversal.Count != 0) { int index = _traversal.Pop(); BehaviourNode node = _tree.allNodes[index]; node.OnExit(); #if UNITY_EDITOR node.SetStatusEditor(BehaviourNode.StatusEditor.Interruption); #endif } }