UniRx第一季学习(三) ------ 操作符Where/First/AddTo

UniRx第一季学习(三) ------ 操作符Where/First/AddTo

课程地址 :

凉鞋大大的,可以的话大家多支持一波~


UniRx 的侧重点,不是发布者和订阅者这两个概念如何使⽤,⽽是事件从发布者到订阅者之间的过程如何处理。这就要说操作符了,之前在介绍独立的Update时代码还不够简洁,本文利用操作符来简化其代码

 Observable.EveryUpdate()
                      .Subscribe(_ =>
                      {
                          if (Input.GetMouseButtonDown(0))
                          {
                              Debug.Log("left mouse button clicked");
                              buttonClicked = true;
                          }
                      });

一.Where

Where 是⼀个过滤的操作,过滤掉不满⾜条件的事件。类似于if

Observable.EveryUpdate()
   .Where(_ => Input.GetMouseButtonUp(0))
   .Subscribe(_ =>
   {
     // do something
   }).AddTo(this);

1. EveryUpdate 是事件的发布者。他会每帧会发送⼀个事件过来。
2. Subscribe 是事件的接收者,接收的是 EveryUpdate 发送的事件。
3. Where 则是在事件的发布者和接收者之间的⼀个过滤操作。会过滤掉不满⾜条件的事件。

所以,Subscribe 处理的事件,都是满⾜ Input.GetMouseButtonUp(0) 条件的事件.

二.First

就是获取第⼀个通过的事件.如果你只想条件只执行一次,可以采用以下两种写法

1.Where+First

Observable.EveryUpdate()
.Where(_ => Input.GetMouseButtonUp(0))
.First()
.Subscribe(_ => { /* do something */ })
.AddTo(this);

2.First

Observable.EveryUpdate()
.First(_ => Input.GetMouseButtonUp(0))
.Subscribe(_ => { /* do something */ })
.AddTo(this);

三.AddTo

添加到Unity 的 GameObject 或者 MonoBehaviour。GameObject 和 MonoBehaviour 可以获取到 OnDestroy 事件。也就是 GameObject 或者MonoBehaviour 的销毁事件.获取之后⽤来 进⾏与 UniRx 进⾏销毁事件的绑定,也就是当 GameObject 或者 MonoBehaviour 被销毁时,同样去销毁正在进⾏的 UniRx 任务。

Observable.Timer(TimeSpan.FromSeconds(1.0f)
.Subscribe()
.AddTo(this);

当 this 所在的 GameObject 销毁时,这个 Timer 就会被销毁

原理:

本质上, AddTo 是⼀个 静态扩展关键字,他对进⾏了扩展。
只要任何实现了 IDisposable 的接⼝,都可以使⽤ AddTo API,不管是不是 UniRx 的 API。
当 GameObject 销毁时,就会调⽤ IDisposable 的 OnDispose 这个⽅法。

有了 AddTo,在开启 Observable.EveryUpdate 时调⽤ 当前脚本的⽅法,则不会造成引⽤异常等错误,它使得 UniRx 的使⽤更加安全