2015-10-18 158 views
0

所以我有一個Unity協程的方法,其中我有一些對象。這些對象表示正在從某個服務器收集的值,並且它們在準備就緒時發送一個Updated事件。等待Unity協程中的事件?

我想知道什麼最好的方法是等待所有的值被更新,在Unity的協同程序中。

public IEnumerator DoStuff() 
{ 
    foreach(var val in _updateableValues) 
    { 
     if (val.Value != null) continue; 
     else **wait for val.Updated to be fired then continue** 
    } 
    //... here I do stuff with all the values 
    // I use the WWW class here, so that's why it's a coroutine 
} 

這樣做的最好方法是什麼?

謝謝!

回答

0

自旋鎖是一種解決方案,但不是一個非常溫和的CPU。在旋轉鎖定中,您只需等待變量具有一定的值,否則會休眠幾毫秒。

public IEnumerator DoStuff() 
{ 
    /* wait until we have the value we want */ 
    while(value != desiredValue) 
     yield return new WaitForSeconds(0.001f); 
    //after this loop, start the real processing 
} 

也許你可能要考慮重組你的代碼式,因此沒有自旋鎖是該電源線,但基於事件的更多interupt /基礎的方法可以實現。這意味着,如果您更新了某個值並在發生後發生了某些事情,請在更改該值後直接將其啓動。在C#中,該設計模式甚至還有一個接口INotifyPropertyChanged(請參閱MSDN),但您也可以自己輕鬆設計該接口。通過在某個值發生變化時觸發事件。如果你想得到比螺旋鎖更好的解決方案,我們需要更多關於你想要在這裏做出什麼反應的更多信息,但是這應該給你一些想法。

+0

啊是的,我有這樣的事件。我在問題中談到的var.Updated是一個在更新值時觸發的事件。我希望會有類似'yield return new WaitForUpdateEventOf(myObject)'的東西。 –

+0

你*可以鉤住'Update'事件來設置一個標誌爲'true',在這個標誌上你將等待你的旋轉鎖定**或**,嘗試重新構造邏輯,例如處理'Update'上的所有內容。在什麼情況下,這些更新發生在什麼對象上,你究竟想要做什麼? –