獨立的 Update
在 UniRx 簡介的時候,筆者講了一種比較麻煩的情況:就是在 MonoBehaviour 的 Update 中摻雜了大量互相無關的邏輯,導致程式碼非常不容易閱讀。
這種情況我們平時在專案開發中非常常見,程式碼如下:
private void Update()
{
if (A)
{
...
}
if (B)
{
...
if (D)
{
...
}
else {}
}
switch (C)
{
...
}
if (Input.GetMouseButtonUp(0))
{
...
}
}
Update 方法中程式碼冗長,而且干擾視線,非常影響閱讀。
而使用 UniRx 則可以改善這個問題。
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 的深入學習,也會漸漸淘汰,因為等我們入門之後,會學習更好的實現方式。
今天的內容就這些。
知識地圖
UniRx 的基本語法格式
在之前的兩篇文章中,我們學習了 UniRx 的 Timer 和 Update 這兩個 API,但是對程式碼的工作原理還沒有進行過介紹。在這篇文章中,我們就來試著理解一下 UniRx 的程式碼工作原理及 UniRx 的基本語法格式。
先搬出來第一篇文章中 Delay 的實現程式碼:
/****************************************************************************
* 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 是可觀察的。
- 可觀察的才能被訂閱。
Observable.XXX().Subscribe();
這行程式碼我們可以理解為:可被觀察(監聽)的 XX,註冊。
以上筆者從釋出者和訂閱者這個角度進行了簡單的介紹,以便大家理解。
但是 UniRx 的側重點,不是釋出者和訂閱者這兩個概念如何使用,而是事件從釋出者到訂閱者之間的過程如何處理。
所以這兩個點不重要,重要的是兩點之間的線,也就是事件的傳遞過程。
這裡先不說得太深入,在入門之後,會用很大的篇幅去深入介紹這些概念的。
今天的 UniRx 的基本語法格式的介紹就到這裡,我們下一篇再見,拜拜~
知識地圖
更多內容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
涼鞋的主頁:https://liangxiegame.com/zhuanlan
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。