在Unity Coroutine中等待活动?

时间:2015-10-18 15:41:47

标签: c# unity3d coroutine

所以我有一个Unity coroutine方法,我有一些对象。这些对象表示从某个服务器收集的值,并在它们准备就绪时发出Updated事件。

我想知道在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
}

做这样的事情最好的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分: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
}

也许您可能想要考虑重构代码,确保不需要自旋锁,但可以实现更多基于中断/事件的方法。这意味着,如果您更新某个值并且必须在其发生后进行某些操作,请在更改该值后立即将其启动。在C#中,甚至还有一个用于该设计模式的接口INotifyPropertyChanged(请参阅MSDN),但您也可以自行设计,例如通过在某个值发生变化时触发事件。如果你想要一个比自旋锁更好的解决方案,我们需要更多关于你想在这里做出什么反应的信息,但这应该会给你一些想法。

答案 1 :(得分:0)

没有内置的直接方法来等待事件本身,但是您可以使用同步嵌套协程来等待事件设置的标志:

<!doctype html>
<html>
  <script src="quick_example.js"></script>
  <script>
  Module['onRuntimeInitialized'] = () => {
    console.log('lerp result: ' + Module.lerp(1, 2, 0.5));
  }
  </script>
</html>

牢记这一点,创建等待//Flag bool eventHappened; //Event subscriber that sets the flag void OnEvent(){ eventHappened=true; } //Coroutine that waits until the flag is set IEnumerator WaitForEvent() { yield return new WaitUntil(eventHappened); eventHappened=false; } //Main coroutine, that stops and waits somewhere within it's execution IEnumerator MainCoroutine(){ //Other stuff... yield return StartCoroutine(WaitForEvent()); //Oher stuff... } 的通用协程很容易:

UnityEvent