/// <summary> /// Sets up a Fiber to run with the given host and routine. /// </summary> public Routine Initialize(MonoBehaviour inHost, IEnumerator inStart, bool inChained) { if (Manager.DebugMode && !(inStart is IDisposable)) { throw new ArgumentException("IEnumerators must also implement IDisposable."); } m_Counter = (byte)(m_Counter == byte.MaxValue ? 1 : m_Counter + 1); m_Handle = (Routine)Table.GenerateID(Index, m_Counter); m_Host = inHost; m_HostIdentity = RoutineIdentity.Find(m_Host.gameObject); m_WaitTime = 0; m_UnityWait = null; m_Name = null; Priority = 0; m_GroupMask = ReferenceEquals(m_HostIdentity, null) ? 0 : 1 << m_HostIdentity.Group; // Chained routines are always hosted on the manager if (inChained) { m_Chained = m_HostedByManager = true; } if (!inChained && ReferenceEquals(inHost, Manager)) { m_HostedByManager = true; } if (!ReferenceEquals(m_HostIdentity, null)) { m_HasIdentity = true; } m_TimeScale = 1.0f; m_RootFunction = inStart; m_Stack[m_StackPosition = 0] = inStart; IRoutineEnumerator callback = inStart as IRoutineEnumerator; if (callback != null) { if (!callback.OnRoutineStart()) { ClearStack(); Stop(); } } return(m_Handle); }
/// <summary> /// Sets up a Fiber to run with the given host and routine. /// </summary> public Routine Initialize(MonoBehaviour inHost, IEnumerator inStart, bool inChained) { #if DEVELOPMENT if (Manager.DebugMode && !(inStart is IDisposable)) { throw new ArgumentException("IEnumerators must also implement IDisposable."); } #endif // DEVELOPMENT m_Counter = (byte)(m_Counter == byte.MaxValue ? 1 : m_Counter + 1); m_Handle = (Routine)Table.GenerateID(Index, m_Counter); m_Host = inHost; m_HostIdentity = RoutineIdentity.Find(m_Host.gameObject); m_WaitTime = 0; m_LockCount = 0; m_UnityWait = null; m_Name = null; Priority = 0; // Chained routines are always hosted on the manager if (inChained) { m_Chained = m_HostedByManager = true; } if (!inChained && ReferenceEquals(inHost, Manager.Host)) { m_HostedByManager = true; } if (!ReferenceEquals(m_HostIdentity, null)) { m_HasIdentity = true; } m_TimeScale = 1.0f; m_RootFunction = inStart; m_Stack[m_StackPosition = 0] = inStart; CheckForNesting(inStart); if (!m_Chained) { m_UpdatePhase = Manager.DefaultPhase; Manager.Fibers.AddFiberToUpdateList(this, m_UpdatePhase); } return(m_Handle); }