我不认为我完全理解协同程序,它不能按我想要的方式工作,所以我需要帮助。
我有一个记忆游戏(喜欢西蒙),由4个随机打开和关闭的方块组成。方形开关打开/关闭后,在切换下一个按钮之前应该稍微休息,我的程序似乎没有这样做。对于切换过程,我使用blink * Colorname协程,其中包括:
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个地方使用waitforseconds来实现我的目标:首先,在闪烁*颜色如下:
IEnumerator blinkGreen (float seconds)
{
greenImg.color = Color.white;
yield return new WaitForSeconds (seconds);
greenImg.color = Color.green;
yield return new WaitForSeconds (seconds);
}
其次,在循环之后,在//下执行:按钮之间的暂停功能通过调用另一个协程闪烁:
StartCoroutine(waitfornexttransition(5.0f));
IEnumerator waitfornexttransition (float second)
{
yield return new WaitForSeconds (second);
}
我错过了什么吗?所有建议和帮助表示赞赏。谢谢!
答案 0 :(得分:0)
Unity不会等待已启动的协程的完成继续执行代码。如果键入(伪代码):
print "1"
start coroutine that prints "2" after a second
print "3"
输出将是:" 1"," 3"," 2"。
如果您将所有代码放在一个协程中,一切都会按预期顺序运行。
答案 1 :(得分:0)
好吧,因为无论如何它都在foreach循环中,并且你为每次迭代开始一个新的couroutine,然后基本上所有协程都在同一帧内同时开始。然后,无论代码的其余部分是什么,它们都会同时运行,同时闪烁所有灯光。
如果你希望你的代码在执行之间等待一段时间,那么制作一个计时器,只有在计时器达到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.
}
答案 2 :(得分:0)
您的foreach
循环也应该在协程中,并且您可以在每次迭代之前放置yield return new WaitForSeconds (seconds)
。