2016-02-25 248 views
0

我不認爲我完全理解協程,它不按我想要的方式工作,所以我需要幫助。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); 
    } 

我缺少的東西?所有的建議和幫助表示讚賞。謝謝!

回答

0

Unity不會等待已啓動協程的完成以繼續執行代碼。如果輸入(僞代碼):

print "1" 
start coroutine that prints "2" after a second 
print "3" 

輸出將是:「1」,「3」,「2」。

如果你把所有的代碼放在一個協程中,所有的東西都按照預期順序運行。

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