没错,Unity实现协程的原理,就是通过yield return生成的IEnumerator再配合控制何时触发MoveNext来实现了执行权的调度 具体而言,Unity每通过MonoBehaviour.StartCoroutine启动一个协程,就会获得一个IEnumerator(StartCoroutine的参数就是IEnumerator,参数是方法名的重载版本也会通过反射拿到该方法对应的IEnumerator)。并在它的游戏循...
IEnumerable:是在IEnumerator基础上的一个封装接口,有一个GetEnumerator()方法返回IEnumerator。 在迭代器中呢,最关键的是yield的使用,这是实现我们协程功能的主要途径,通过该关键方法,可以使得协程的运行暂停、记录下一次启动的时间与位置等等。 5、从IEnumerator/IEnumerable到yield c#语言中,迭代器特性最常见的莫过于f...
Unity 使用StartCoroutine(IEnumerator)来启动一个协程。参数IEnumerator对象,通常有三种方式获得。 第一种方式,也是最常用方式,是使用带有yield指令的协程函数。 private IEnumerator Start() { yield return …
总结下: 在协程方法中使用 yield return 其实就是为了返回 IEnumerator对象,只有当这个对象的 MoveNext() 返回 false 时,即该 IEnumertator 的 Current 已经迭代到最后一个元素了,才会执行 yield return 后面的语句。也就是说, yield return 被会“翻译”为一个 IEnmerator 对象,要想深入了解这方面的更多细节,...
模拟协程实现 思路//模拟协程实现 思路 每隔一帧对IEnumerator 进行MoveNext() private IEnumerator m_sumlateIe; //模拟协程实现 思路 每隔一帧对IEnumerator 进行MoveNext() public void SumlateCoroutine(IEnumerator sumlateIe) { m_sumlateIe = sumlateIe; ...
首先,最常见的做法是使用带有yield指令的协程函数。yield return语句允许在执行过程中暂停并返回控制,这种情况下,编译器会自动生成一个实现了IEnumerator接口的类。第二种方式是继承Unity提供的CustomYieldInstruction类,虽然这个类本质上实现了IEnumerator,但它主要用于Unity内部的特殊处理,比如定时回调,不...
二.协程的入口 协程必须以IEnumerator开始,并且方法中必须包含关键字yield return,下面我们给出一个协程和普通程序的对比: IEnumerator PrintDebug() { Debug.Log(1); yield return 0;//暂时挂起程序 } void PrintDebug() { Debug.Log(1); } 这时我们想要调用我们的协程就需要用到以下的代码 ...
我们知道Unity中开启一个协程是这样的: publicclassExampleScript : MonoBehaviour {voidStart() { StartCoroutine(DoSomThing()); }publicIEnumerator DoSomeThing() { Debug.Log("Start"+Time.realtimeSinceStartup);yieldreturnnewWaitForSeconds(5); Debug.Log("End"+Time.realtimeSinceStartup); ...
for (int i = 0; i < 10000; i++) { //内部循环计算 //在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出 //yield return null; } //如果取消内部的yield操作,仅在for循环外边写yield操作,则会执行完10000次循环后再结束,相当于直接调用了一个函数,而非协程。