如何理解这个统一推论
本文关键字:何理解 | 更新日期: 2023-09-27 18:00:46
using UnityEngine;
using System.Collections;
public class CoroutineExample : MonoBehaviour
{
IEnumerator Start ()
{
print ("Starting " + Time.time);
yield return StartCoroutine (WaitAndPrint ());
print ("Done " + Time.time);
}
IEnumerator WaitAndPrint ()
{
yield return new WaitForSeconds (5f);
print ("WaitAndPrint " + Time.time);
}
}
结果是
Starting 0
WaitAndPrint 5.010554
Done 5.010554
我有两个问题?
首先,如何理解函数Start((的返回值。我曾经看到Start((的返回值是void。在我看来,Unity只执行了一次Start(((一帧(,但yield return似乎使Start((函数在两帧中执行;
其次,我也对结果感到困惑。我认为结果应该是
Starting 0
Done 5.010554
WaitAndPrint 5.010554
因为StartCoroutine((启动函数WaitAndPrint((。在函数WaitAndPrint((中,yield return使此函数在此帧中暂停并返回Start((。然后Start((继续进行并打印"Done xxxxx"。5秒钟后,WaitAndPrint((恢复并打印"WaitAndPrint xxxxx"。
我哪里错了?
当您调用yield return
时,Unity将接管控制。
当您启动Coroutine
时,Unity将接受该方法返回的IEnumerator
,并对返回的IEnumerator
调用MoveNext。
根据对象的类型和对象中的值,Unity将决定要做什么。
在Start
方法中,yield
语句返回另一个IEnumerator
,因此Unity在第二个IEnumerator
完成之前不会对Start
返回的对象调用MoveNext
。
在WaitAndPrint
中,第一个MoveNext
返回一个WaitForSeconds
对象,在此基础上,Unity决定在5秒内不调用MoveNext
。5秒后,它再次调用MoveNext
,并执行该方法的其余部分,即这一行
print ("WaitAndPrint" + Time.time);
当yield return StartCoroutine (WaitAndPrint ());
返回的IEnumerator
到达其末端时,它将在Start
返回的IEnumerator
上调用MoveNext
,这反过来将执行Start
:
print ("Done " + Time.time);
希望这足够清楚:(
以下是我如何理解这个结果:
Start((函数由Unity调用一次并打印"Started"。
然后下面的行做两件事:
yield return StartCoroutine (WaitAndPrint ());
- 它启动WaitAndPrint((协同程序
- 它等待它结束,然后继续执行Start((协程
WaitAndPrint((协同程序将完成它的任务:
- 等待5秒钟
- 打印"WaitAndPrint"+时间
然后,Start((协同程序将继续并打印"完成"+时间。
这就是的原因
print ("WaitAndPrint" + Time.time);
打印之前:
print ("Done " + Time.time);
此外,你应该编辑你的帖子,它在第一个结果中遗漏了一个空格:
WaitAndPrint5.010554
应该是
WaitAndPrint 5.010554
如果不清楚,很抱歉,这是我第一次在StackOverflow上回答,希望它能有所帮助!
IEnumerators
是迭代器块,它们不一定执行1帧,当你放置yield return
时,你实际上是在告诉它在多个帧上迭代。
当在迭代器方法中达到yield return语句时,表达式,并保留代码中的当前位置。
- https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx
您可以"几乎"始终使用Invoke方法来代替IE分子。试着用它工作,你的生活会更轻松:(