Unity协程未启动

问题描述 投票:0回答:3

我认为我没有完全理解协程,它没有按照我想要的方式工作,所以我需要帮助。

我有一个记忆游戏(类似西蒙),由 4 个随机打开和关闭的方块组成。方块打开/关闭后,在切换下一个按钮之前应该稍作休息,但我的程序似乎没有这样做。对于切换过程,我使用

blinkColor()
协程,如下所示:

foreach (int color in pattern) 
{
    switch (color) 
    {
        case 0:
            StartCoroutine (blinkGreen (blinkSeconds));
            break;
        case 1:
            StartCoroutine (blinkRed (blinkSeconds));
            break;
        default:
            break;
    }
}
//to do: pause function between button blinks
     
IEnumerator blinkGreen (float seconds)
{
    greenImg.color = Color.white;
    yield return new WaitForSeconds (seconds);
    greenImg.color = Color.green;
}

我尝试在 2 个地方使用

WatiForSeconds
来实现我的目标:首先,在
blinkColor()
如下:

IEnumerator blinkGreen (float seconds)
{
    greenImg.color = Color.white;
    yield return new WaitForSeconds (seconds);
    greenImg.color = Color.green;
    yield return new WaitForSeconds (seconds);
}

第二,循环之后,在

//to do: pause function between button blinks by calling another coroutine:

StartCoroutine(waitfornexttransition(5.0f));

IEnumerator waitfornexttransition (float second)
{
    yield return new WaitForSeconds (second);
}

我错过了什么吗?

c# unity-game-engine coroutine
3个回答
0
投票

Unity 不会等待启动的协程完成才继续执行代码。如果您输入(伪代码):

print "1"
start coroutine that prints "2" after a second
print "3"

输出将为:“1”,“3”,“2”。

如果将所有代码放在一个协程中,所有内容都会按预期顺序运行。


0
投票

好吧,因为无论如何它都在 foreach 循环中,并且您为每次迭代启动一个新的协程,所以基本上所有协程都在同一帧内同时启动。然后,无论其余代码在做什么,它们都会同时运行,同时闪烁所有灯。

如果您希望代码在执行之间等待一定的时间,则可以创建一个计时器,并且仅在计时器达到 0 时才闪烁灯光。一个基本示例是:

private float timer;

void Start()
{
    timer = 2f; // Waiting 2 seconds between blinks
}

void Update()
{
    timer -= Time.deltaTime;  // Consistently decrement timer independently of frame rate

    if (timer <= 0)
    {
        blinkLight();
        timer = 2f;
    }
}

void blinkLight()
{
    // Light blinking logic goes here.
}

0
投票

您的

foreach
循环也应该位于协程内,并且您可以在每次迭代之前放置
yield return new WaitForSeconds (seconds)

© www.soinside.com 2019 - 2024. All rights reserved.