我认为我没有完全理解协程,它没有按照我想要的方式工作,所以我需要帮助。
我有一个记忆游戏(类似西蒙),由 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);
}
我错过了什么吗?
Unity 不会等待启动的协程完成才继续执行代码。如果您输入(伪代码):
print "1"
start coroutine that prints "2" after a second
print "3"
输出将为:“1”,“3”,“2”。
如果将所有代码放在一个协程中,所有内容都会按预期顺序运行。
好吧,因为无论如何它都在 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.
}
您的
foreach
循环也应该位于协程内,并且您可以在每次迭代之前放置 yield return new WaitForSeconds (seconds)
。