示例#1
0
        // HACK: We need to pass a parent fiber into nested fibers
        //       in order for timescale to work appropriately during a yield update.
        private void CheckForNesting(IEnumerator inEnumerator)
        {
            INestedFiberContainer container = inEnumerator as INestedFiberContainer;

            if (container != null)
            {
                container.SetParentFiber(this);
            }
        }
示例#2
0
        // HACK: We need to pass a parent fiber into nested fibers
        //       in order for timescale to work appropriately during a yield update.
        private void CheckForNesting(IEnumerator inEnumerator, bool inbCheckDecorator)
        {
            INestedFiberContainer container = inEnumerator as INestedFiberContainer;

            if (container != null)
            {
                container.SetParentFiber(this);
            }
            else if (inbCheckDecorator)
            {
                RoutineDecorator decorator = inEnumerator as RoutineDecorator;
                if (decorator != null && decorator.Enumerator != null)
                {
                    CheckForNesting(decorator.Enumerator, true);
                }
            }
        }
示例#3
0
 /// <summary>
 /// Clears the Fiber's nested owner.
 /// </summary>
 public void ClearNestedOwner()
 {
     m_Container = null;
 }
示例#4
0
 /// <summary>
 /// Indicates that the Fiber is owned by the given nested container.
 /// </summary>
 public void SetNestedOwner(INestedFiberContainer inParallel)
 {
     m_Container = inParallel;
 }
示例#5
0
        /// <summary>
        /// Cleans up the Fiber.
        /// </summary>
        public void Dispose()
        {
            if ((uint)m_Handle == 0)
            {
                return;
            }

            if (m_UnityWait != null)
            {
                Manager.Host.StopCoroutine(m_UnityWait);
                m_UnityWait = null;
            }

            bool bKilled  = m_StackPosition >= 0;
            bool bChained = m_Chained;

            ClearStack();

            m_Handle       = Routine.Null;
            m_Host         = null;
            m_HostIdentity = null;

            // If this is chained and we have a parallel
            if (bChained && m_Container != null)
            {
                m_Container.RemoveFiber(this);
            }

            m_Chained = m_Disposing = m_HasIdentity = m_Paused = m_IgnoreObjectTimescale = m_HostedByManager = m_IgnoreObjectActive = m_Executing = false;

            m_WaitTime  = 0;
            m_LockCount = 0;
            m_Name      = null;
            Priority    = 0;

            m_Container = null;
            m_RootFiber = null;

            m_TimeScale       = 1.0f;
            m_YieldFrameDelay = 0;

            if (m_YieldPhase != YieldPhase.None)
            {
                Manager.Fibers.RemoveFiberFromYieldList(this, m_YieldPhase);
                m_YieldPhase = YieldPhase.None;
            }

            if (!bChained)
            {
                Manager.Fibers.RemoveFiberFromUpdateList(this, m_UpdatePhase);
            }
            Manager.RecycleFiber(this, bChained);

            m_UpdatePhase      = Manager.DefaultPhase;
            m_OnException      = null;
            m_HandleExceptions = false;

            if (bKilled)
            {
                m_OnComplete = null;
                Action onStop = m_OnStop;
                m_OnStop = null;
                if (onStop != null)
                {
                    onStop();
                }
            }
            else
            {
                m_OnStop = null;
                Action onComplete = m_OnComplete;
                m_OnComplete = null;
                if (onComplete != null)
                {
                    onComplete();
                }
            }
        }
示例#6
0
        public RoutineStats GetStats()
        {
            RoutineStats stats = new RoutineStats();

            stats.Handle = m_Handle;
            stats.Host   = ReferenceEquals(m_Host, Manager) ? null : m_Host;

            if (m_Disposing || (!m_HostedByManager && !m_Host))
            {
                stats.State = RoutineState.Disposing;
            }
            else if (m_LockCount > 0)
            {
                stats.State = RoutineState.Locked + ": " + m_LockCount;
            }
            else if (m_WaitTime > 0)
            {
                stats.State = RoutineState.WaitTime + ": " + m_WaitTime.ToString("0.000");
            }
            else if (IsPaused())
            {
                stats.State = RoutineState.Paused;
            }
            else if (m_UnityWait != null)
            {
                stats.State = RoutineState.WaitUnity;
            }
            else if (m_YieldPhase == YieldPhase.WaitForEndOfFrame)
            {
                stats.State = RoutineState.WaitEndOfFrame;
            }
            else if (m_YieldPhase == YieldPhase.WaitForFixedUpdate)
            {
                stats.State = RoutineState.WaitFixedUpdate;
            }
            else if (m_YieldPhase == YieldPhase.WaitForLateUpdate)
            {
                stats.State = RoutineState.WaitLateUpdate;
            }
            else if (m_YieldPhase == YieldPhase.WaitForUpdate)
            {
                stats.State = RoutineState.WaitUpdate;
            }
            else if (m_YieldPhase == YieldPhase.WaitForCustomUpdate)
            {
                stats.State = RoutineState.WaitCustomUpdate;
            }
            else if (m_YieldPhase == YieldPhase.WaitForThinkUpdate)
            {
                stats.State = RoutineState.WaitThinkUpdate;
            }
            else if (m_YieldPhase == YieldPhase.WaitForRealtimeUpdate)
            {
                stats.State = RoutineState.WaitRealtimeUpdate;
            }
            else
            {
                stats.State = RoutineState.Running;
            }

            stats.TimeScale = m_TimeScale;
            stats.Name      = Name;
            stats.Priority  = Priority;
            stats.Phase     = m_UpdatePhase;

            if (m_StackPosition >= 0)
            {
                IEnumerator current = m_Stack[m_StackPosition];
                stats.Function = CleanIteratorName(current);

                INestedFiberContainer nested = current as INestedFiberContainer;
                if (nested != null)
                {
                    stats.Nested = nested.GetStats();
                }
            }
            else
            {
                stats.Function = null;
            }

            stats.StackDepth = m_StackPosition + 1;

            return(stats);
        }