1. 程式人生 > >UniRx精講(二):獨立的 Update &UniRx 的基本語法格式

UniRx精講(二):獨立的 Update &UniRx 的基本語法格式

# 獨立的 Update 在 UniRx 簡介的時候,筆者講了一種比較麻煩的情況:就是在 MonoBehaviour 的 Update 中摻雜了大量互相無關的邏輯,導致程式碼非常不容易閱讀。 這種情況我們平時在專案開發中非常常見,程式碼如下: ```cs private void Update() { if (A) { ... } if (B) { ... if (D) { ... } else {} } switch (C) { ... } if (Input.GetMouseButtonUp(0)) { ... } } ``` Update 方法中程式碼冗長,而且干擾視線,非常影響閱讀。 而使用 UniRx 則可以改善這個問題。 ```cs void Start() { // A 邏輯,實現了 xx Observable.EveryUpdate() .Subscribe(_ => { if (A) { ... } }).AddTo(this); // B 邏輯,實現了 xx Observable.EveryUpdate() .Subscribe(_ => { if (B) { ... if (D) { ... } else {} } }).AddTo(this); // C 邏輯,實現了 xx Observable.EveryUpdate() .Subscribe(_ => { switch (C) { ... } }).AddTo(this); // 滑鼠點選檢測邏輯 Observable.EveryUpdate() .Subscribe(_ => { { if (Input.GetMouseButtonUp(0)) { ... } }).AddTo(this); } ``` 雖然在程式碼長度上沒有任何改善,但是最起碼,這些 Update 邏輯互相之間獨立了。 狀態跳轉、延時等等這些經常在 Update 裡實現的邏輯,都可以使用以上這種方式獨立。 使用 UniRx 可以對我們工程中的程式碼進行了改善,而筆者接觸 UniRx 之後,就再也沒有使用過 Update 方法了。 不過以上的這種 UniRx 使用方式,是比較初級的,而這種使用方式,隨著對 UniRx 的深入學習,也會漸漸淘汰,因為等我們入門之後,會學習更好的實現方式。 今天的內容就這些。 ## 知識地圖 ![image.png](http://file.liangxiegame.com/b50ac389-b14c-4788-92db-9685ff70bf47.png) # UniRx 的基本語法格式 在之前的兩篇文章中,我們學習了 UniRx 的 Timer 和 Update 這兩個 API,但是對程式碼的工作原理還沒有進行過介紹。在這篇文章中,我們就來試著理解一下 UniRx 的程式碼工作原理及 UniRx 的基本語法格式。 先搬出來第一篇文章中 Delay 的實現程式碼: ``` csharp /**************************************************************************** * http://liangxiegame.com liangxie ****************************************************************************/ using System; using UniRx; using UnityEngine; namespace UniRxLesson { public class DelayExample : MonoBehaviour { private void Start() { Observable.Timer(TimeSpan.FromSeconds(2.0f)).Subscribe(_ => { Debug.Log("延時兩秒"); }).AddTo(this); } } } ``` 程式碼中的 Observable.XXX().Subscribe() 是非常經典的 UniRx 格式。只要理解了這種格式就可以看懂大部分的 UniRx 的用法了。 首先解決程式碼中的詞彙問題: * Observable:可觀察的,是形容詞,它形容後邊的詞(Timer)是可觀察的,我們可以直接把 Observable 後邊的詞理解成釋出者。 * Timer:定時器,名詞,被 Observable 修飾,所以是釋出者,是事件的傳送方。 * Subscribe:訂閱,是動詞,它訂閱誰呢?當然是前邊的 Timer,這裡可以理解成訂閱者,也就是事件的接收方。 * AddTo:新增到,這個我們暫時不用理解得太深刻,只需要知道它是與 MonoBehaviour 進行生命週期繫結即可。 以上的程式碼,連起來則是:可被觀察(監聽)的.Timer().訂閱() 理順了之後應該是:訂閱可被觀察的定時器。 其概念關係很容易理解。 * Timer 是可觀察的。 * 可觀察的才能被訂閱。 ``` csharp Observable.XXX().Subscribe(); ``` 這行程式碼我們可以理解為:可被觀察(監聽)的 XX,註冊。 以上筆者從釋出者和訂閱者這個角度進行了簡單的介紹,以便大家理解。 但是 UniRx 的側重點,不是釋出者和訂閱者這兩個概念如何使用,而是事件從釋出者到訂閱者之間的過程如何處理。 所以這兩個點不重要,重要的是兩點之間的線,也就是事件的傳遞過程。 這裡先不說得太深入,在入門之後,會用很大的篇幅去深入介紹這些概念的。 今天的 UniRx 的基本語法格式的介紹就到這裡,我們下一篇再見,拜拜~ ## 知識地圖 ![image.png](http://file.liangxiegame.com/f0a462c1-635d-47d0-93fa-ead9d2047a63.png) 更多內容 QFramework 地址:https://github.com/liangxiegame/QFramework QQ 交流群:623597263 涼鞋的主頁:https://liangxiegame.com/zhuanlan 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費