UniRx事件流并行处理
使用Merge合并事件流
UniRx可以开启多个事件流,然后用Merge
进行事件流的合并。
var leftMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(0));
var rightMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(1));
Observable.Merge(leftMouseClickStream, rightMouseClickStream)
.Subscribe(_ =>
{
// do something
2
});
- 示例-一个按钮点击后所有按钮不可用:
public class TestPanel : XXXPanel
{
[SerializeField] Button mButtonA;
[SerializeField] Button mButtonB;
[SerializeField] Button mButtonC;
void Start()
{
var buttonAStream = mButtonA.OnClickAsObservable();
var buttonBStream = mButtonB.OnClickAsObservable();
var buttonCStream = mButtonC.OnClickAsObservable();
Observable.Merge(
buttonAStream,
buttonBStream,
buttonCStream)
.First()
.Subscribe(_ =>
{
// any button clicked
});
}
}
使用WhenAll操作符
Siki:WhenAll也是处理多个流的操作符。
Siki:WhenAll就是当所有的事件流都结束,就会触发回调。
Siki:WhenAll可以用于协程事件流,也可用于其他事件流。
示例:
var aStream = mButtonA.OnClickAsObervable().First();
var bStream = mButtonB.OnClickAsObervable().First();
var cStream = mButtonC.OnClickAsObervable().First();
Observable.WhenAll(
aStream,
bStream,
cStream)
.Subscribe(_ =>
{
Debug.Log("clicked");
})
.AddTo(this);
//当点击完A、B、C按钮之后就会输出。
事件流的结束
Siki:有的事件流是有结束事件的,比如Timer、First、Coroutine等,有的则没有,比如EveryUpdate等。
Siki:Subscribe的第一个参数是OnNext回调,第二个参数则是OnComplete回调。
Observable.FromCoroutine(A)
.Subscribe(_ =>
{
Debug.Log("OnNext:");
}, () =>
{
Debug.Log("OnCompleted:");
});
(END)