所以我有一个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
}
做这样的事情最好的方法是什么?
谢谢!
答案 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