如何理解这个统一推论

本文关键字:何理解 | 更新日期: 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分子。试着用它工作,你的生活会更轻松:(