2015-10-18 159 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'上的所有内容。在什么情况下,这些更新发生在什么对象上,你究竟想要做什么? –