繁体   English   中英

我是否正确理解协程?

[英]Am I understanding Coroutines correctly?

我正在编写我的第一个 Unity 游戏。 我有一系列嵌套函数,我们称它们为 Function1、Function2 等。假设在 Function3 中,我想在执行更多代码之前短时间显示某些内容。

如果我将 Function3 设为协程并以 yield return new WaitForSeconds 退出,这不会阻止我的其他函数中的所有代码执行,而只是阻止执行 Function3 中的其余代码,对吗? 与此同时,功能 1 和 2 继续他们的快乐方式。

有没有办法在不将每个函数重组为协程并投入大量收益和真实陈述的情况下获得我想要的? (在我的实际游戏中,在我想成为协程的那个之前还有很多功能。)

我将添加一些伪代码来说明我的情况。

谢谢。

public Function1()
    {
        .
        .
        Does some stuff
        .
        .
        call Function2()
        .
        .
        Do some more stuff
        .
        .
    }

 public Function2()
 {
    .
    .
    Does some stuff
    .
    .
    StartCoroutine(Function3())
    .
    .
    Does some more stuff
    .
    .
    return to Function2;
 }

IEnumerator Function3()
{
    .
    .
    Does some stuff...
    Now I want to wait for specified time (say, .5 seconds) to display a message, play a sound, etc., **without continuing the code in Function2 or Function1 * *!
    yield return new WaitForSeconds(.5f)
    Then do some more stuff
    .
    .
    return to Function2;
 }

有多种方法可以这样做,但是我更喜欢使用在协程“完成”时调用的回调操作。

public IEnumerator Function1(Action callback)
{
    // do some stuff
    yield return new WaitForSeconds(1);
    // do some stuff
    callback.Invoke();
}

public IEnumerator Function2(Action callback)
{
    // do some stuff
    yield return new WaitForSeconds(1);
    // do some stuff
    callback.Invoke();
}

public void CallingMethod()
{
    StartCoroutine(Function1(() => 
    {
        StartCoroutine(Function2(() =>
        {
            // whatever other code you want executed
        }));
    }));
}

这种方法避免使用类标志(布尔值),因为它很容易使您的代码变得混乱。 此外,它还可以轻松地重用您的方法。

您应该让 Function1 和 Function2 都返回IEnumerator ,然后让步给它们调用的函数:

IEnumerator public Function1()
{
    ...
    yield return Function2();
    ...
}
IEnumerator public Function2()
{
    ...
    yield return Function3();
    ...
}
IEnumerator public Function3()
{
    ...
    yield return new WaitForSeconds(.5f); // Or whatever
    ...
}

现在在调用它时调用StartCoroutine(Function1())而不是Function1()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM