【问题标题】:Unity C# waitingUnity C# 等待
【发布时间】:2017-11-09 13:14:04
【问题描述】:

目前,我有这个代码

void update()
{
    Debug.Log(1);
    StartCoroutine(wait());
    Debug.Log(4);
}
IEnumerator wait()
{
    Debug.Log(2)
    yield return new WaitForSeconds(3);
    Debug.Log(3)
}

我想要输出 1、2、3、4,但我得到的是 1、2、4、3。我想我可能误解了协程在这里的作用。为什么我会出现这种行为,我将如何解决它?提前致谢

【问题讨论】:

  • 你可以完全跳过协程。常规函数堆栈会按照您的请求方式运行。

标签: c# unity3d wait coroutine ienumerator


【解决方案1】:

要了解有关协程的更多信息,我建议阅读here 给出的优秀答案。

为了对您的代码进行高级摘要,当您在 wait() 上调用 StartCoroutine 时,直到您的 yield 语句的所有代码都将运行。所以现在你的输出是 1, 2。当调用 yield 时,Unity 将返回并执行 update() 中的代码,记录 int 4。3 秒后它将返回到 wait() 并继续执行,给出最终输出 1 ,2,4,3。

如果要输出 1,2,3,4,则需要使用 yield return 来调用 wait() 方法,因此之后会打印 4。为此,update() 中的代码需要位于返回类型为 IEnumerator 本身的方法中。

void update()
{
    StartCoroutine(dosomething());
}

IEnumerator dosomething()
{
    Debug.Log(1);
    yield return wait();
    Debug.Log(4);
}

IEnumerator wait()
{
    Debug.Log(2);
    yield return new WaitForSeconds(3);
    Debug.Log(3);
}

【讨论】:

  • 感谢您的解释,但由于我需要等待函数在程序的几个不同部分执行类似的任务,有没有办法允许这个执行序列而不将代码移动到我的等待中功能?
  • 你的等待函数是否必须在update()中调用,不能是IEnumerator类型?为了暂停当前在 update() 中编写的进程,直到 wait() 返回,该代码也需要在协程中。
  • 不是真的,我只是迫不及待地把代码放在里面,因为它看起来效率低下。但如果这是操纵执行顺序的唯一方法,那么它会正常工作。感谢您的帮助
  • 在这种情况下,是的,我将创建另一个方法,该方法返回一个 IEnumerator,(在您的示例中)打印 1,运行 wait(),然后打印 4,并在 update() 中启动它。我已经更新了上面的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2020-11-02
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多