我有一个Unity协程方法,其中有一些对象,这些对象表示从某个服务器收集的值,当它们准备好时,它们会发出一个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
}
做这样的事情最好的方法是什么?
谢谢!
4条答案
按热度按时间11dmarpk1#
没有内置的直接方法来等待事件本身,但是可以使用同步嵌套协程来等待事件设置的标志:
记住这一点,创建一个等待
UnityEvent
的通用协程就很容易了:ars1skjm2#
我认为一个更好的方法是检查服务器的每一帧,而不是等待大量的时间没有任何思考。
这是我的小把戏。
mbzjlibv3#
我直接在需要的地方使用WaitUntil,但是我发现WaitUntil不需要布尔值,而是需要布尔 predicate 函数--所以我在下面的示例中提供了这个函数。
这个例子是真实的的运行代码从一个游戏。它运行在第一个场景,在那里我开始音乐之前,我这样做-略长-加载其他东西。
wgeznvg74#
自旋锁是一种解决方案,但不是一个非常CPU温和的解决方案。在自旋锁中,您只需等待变量具有某个值,否则将休眠几毫秒。
也许你可以考虑重新构造你的代码,这样就不需要自旋锁了,但是可以实现一种更加基于中断/事件的方法。这意味着,如果你更新了一个值,并且在它发生之后必须发生一些事情,那么在改变那个值之后直接启动它。在C#中,甚至有一个用于那个设计模式的接口
INotifyPropertyChanged
(参见MSDN),但您也可以轻松地自行设计,例如,当某个值发生变化时触发一个事件。如果您想要比自旋锁更好的解决方案,我们需要更多关于您在这里想要做出什么React的信息,但这应该会给予您一些想法。