Unity 协程不起作用

本文关键字:不起作用 Unity | 更新日期: 2023-09-27 18:36:12

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

我有一个记忆游戏(像西蒙一样),由 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);
 }
其次,在

循环之后,在//to do 下:通过调用另一个协程在按钮闪烁之间的暂停函数:

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

我错过了什么吗?所有的建议和帮助都值得赞赏。谢谢!

Unity 协程不起作用

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.
}

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