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

涼鞋的筆記發表於2020-06-16

獨立的 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 的深入學習,也會漸漸淘汰,因為等我們入門之後,會學習更好的實現方式。

今天的內容就這些。

知識地圖

image.png

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 的基本語法格式的介紹就到這裡,我們下一篇再見,拜拜~

知識地圖

image.png

更多內容
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
涼鞋的主頁:https://liangxiegame.com/zhuanlan
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。

相關文章