1. 程式人生 > >UniRx第一季學習(三) ------ 操作符Where/First/AddTo

UniRx第一季學習(三) ------ 操作符Where/First/AddTo

課程地址 : http://www.sikiedu.com/course/271

涼鞋大大的,可以的話大家多支援一波~


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 進⾏了擴充套件。
只要任何實現了 IDisposable 的接⼝,都可以使⽤ AddTo API,不管是不是 UniRx 的 API。
當 GameObject 銷燬時,就會調⽤ IDisposable 的 OnDispose 這個⽅法。

有了 AddTo,在開啟 Observable.EveryUpdate 時調⽤ 當前指令碼的⽅法,則不會造成引⽤異常等錯誤,它使得 UniRx 的使⽤更加安全