using UnityEngine; using System.Collections; public class TestStartCoroutine : MonoBehaviour { IEnumerator m_etor; bool m_moveNext; MyWaitForSeconds m_waiter; #region MyRegion class MyWaitForSeconds { int m_seconds; float m_timer; public MyWaitForSeconds(int seconds) { m_seconds = seconds; m_timer = 0; } public bool Update(float deltaTime) { m_timer += deltaTime; return m_timer >= m_seconds; } } #endregion void Start() { MyStartCoroutine(T1()); } public void MyStartCoroutine(IEnumerator etor) { m_etor = etor; m_moveNext = true; } IEnumerator T1() { Debug.Log("#1"); int i = 0; while (i++ < 60) { Debug.Log("#2 " + i); yield return null; } Debug.Log("#3"); yield return new MyWaitForSeconds(3); Debug.Log("#4"); } void Update() { if (m_moveNext) { if (!m_etor.MoveNext()) m_moveNext = false; else if (m_etor.Current is MyWaitForSeconds) { m_waiter = (MyWaitForSeconds)m_etor.Current; m_moveNext = false; } } if (m_waiter != null) { if (m_waiter.Update(Time.deltaTime)) { m_waiter = null; m_moveNext = true; } } } }
Unity3d的协程是利用枚举器来实现的,我猜可能是跟以上测试代码一样,在一帧里让枚举器的指针加1,从而可以等待1帧。
时间: 2024-10-12 15:21:20