Unity协程不起作用

时间:2016-02-25 23:31:26

标签: c# unityscript coroutine unity5

我不认为我完全理解协同程序,它不能按我想要的方式工作,所以我需要帮助。

我有一个记忆游戏(喜欢西蒙),由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);
     }

我错过了什么吗?所有建议和帮助表示赞赏。谢谢!

3 个答案:

答案 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)