Unity协程不起作用
问题描述:
我不认为我完全理解协程,它不按我想要的方式工作,所以我需要帮助。Unity协程不起作用
我有一个记忆游戏(Simon喜欢),它由4个随机打开和关闭的方块组成。在方形开关打开/关闭之后,应该稍微休息一下,然后切换下一个按钮,而我的程序似乎没有这样做。对于切换过程中,我使用闪烁* 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;
}
我一直在使用waitforseconds试图在2个地方来实现我的目标:首先,在闪烁*颜色如下:
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);
}
我缺少的东西?所有的建议和帮助表示赞赏。谢谢!
答
Unity不会等待已启动协程的完成以继续执行代码。如果输入(伪代码):
print "1"
start coroutine that prints "2" after a second
print "3"
输出将是:“1”,“3”,“2”。
如果你把所有的代码放在一个协程中,所有的东西都按照预期顺序运行。
答
好吧,因为无论如何它们都在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.
}