首页 > 解决方案 > 我是否正确理解协程?

问题描述

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

如果我将 Function3 设为 Coroutine 并以 yield return new WaitForSeconds 退出,这并不会阻止我的其他函数中的所有代码执行,而只是阻止 Function3 中其余代码的执行,对吧?与此同时,Functions1 和 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;
 }

标签: c#unity3d

解决方案


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

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
        }));
    }));
}

这种方法避免了使用类标志(布尔值),这很容易使您的代码混乱。此外,它允许您的方法轻松重用。


推荐阅读