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