gpt4 book ai didi

c# - 怎么理解这个Unity Coroutine呢?

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:25 24 4
gpt4 key购买 nike

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() 的返回值是无效的。在我看来,Start() 仅由 Unity 执行一次(一帧),但 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 并将调用MoveNext。在返回的 IEnumerator 上。

根据对象的类型和对象中的值,Unity 将决定要做什么。

如果你在 Start 方法中 yield 语句返回另一个 IEnumerator 所以 Unity 不会调用 MoveNextStart 返回的对象上,直到第二个 IEnumerator 完成。

WaitAndPrint 中,第一个 MoveNext 返回一个 WaitForSeconds 对象,基于此 Unity 决定它不会在 5 秒后调用 MoveNext。 5 秒后它再次调用 MoveNext 并执行该方法的其余部分,就是这一行

print ("WaitAndPrint" + Time.time);

yield return StartCoroutine (WaitAndPrint ()); 返回的 IEnumerator 结束时,它将调用 上的 MoveNext Start 返回的 IEnumerator,这将依次执行 Start 的剩余部分:

print ("Done " + Time.time);

希望这已经够清楚了:)

关于c# - 怎么理解这个Unity Coroutine呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com