Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }