// 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); } }
// 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); } } }
/// <summary> /// Clears the Fiber's nested owner. /// </summary> public void ClearNestedOwner() { m_Container = null; }
/// <summary> /// Indicates that the Fiber is owned by the given nested container. /// </summary> public void SetNestedOwner(INestedFiberContainer inParallel) { m_Container = inParallel; }
/// <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(); } } }
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); }