UniRx第一季學習(一) ------ 簡介及優勢
課程地址 : http://www.sikiedu.com/course/271
涼鞋大大的,可以的話大家多支援一波~
一.簡介及優勢
UniRx 就是 Unity Reactive Extensions。是 Unity 版本的 Reactive Extensions。Reactive Extensions 的擅⻓的部分是處理時間上非同步的邏輯。
在遊戲中,⼤部分的邏輯都是在時間上非同步的。⽐如動畫的播放、聲⾳的播放、⽹絡請求、資源載入/解除安裝、 Tween、場景過渡等都是在時間上非同步的邏輯。甚⾄是遊戲迴圈(Every Update,OnCollisionEnter, etc),感測器資料(Kinect, Leap Motion, VR Input, etc.)都是(時間上)非同步的事件, 所以Unity 開發者要實現的非同步(在時間上)任務,是⾮常多的。這也是為什麼 Unity 官⽅提供了 Coroutine (協程)這樣的概念。我們往往在進⾏以上邏輯實現的時候經常⽤到⼤量的回撥,最終隨著項⽬的擴張導致傳中的”回撥地獄”。
相對較好地⽅法則是使⽤訊息/事件的傳送,結果導致“訊息滿天⻜”,導致程式碼⾮常難以閱讀。
使⽤ Coroutine 也是⾮常不錯的,但是 Coroutine 本身的定義,是以⼀個⽅法的格式定義的,寫起來是⾮常⾯向過程的。當邏輯稍微複雜⼀點,就很容易造成 Coroutine 巢狀 Coroutine,程式碼是⾮常不容易閱讀的(強耦合)。
⽽ UniRx 的出現剛好解決了這個問題,它介於回撥和事件之間。
它有事件的概念,只不過他的事件是像⽔⼀樣流過來,⽽我們要做的則是簡單地進⾏組織、變換、過
濾、合併。
它也⽤到了回撥,只不過事件組織之後,只有簡單⼀個回撥就可以進⾏事件的處理了。
它的原理和 Coroutine(迭代器模式) ⾮常類似,但是⽐ Coroutine 強⼤得多。
UniRx 將(時間上)非同步事件轉化為 (響應式的) 事件序列,通過 LINQ 操作可以很簡單地組合起來,
還⽀持時間操作。
二.案例體驗魅力
一個簡單的計時器案例讓你感受到UniRx的魅力~
1.Update計時
public class CommonTimerExample : MonoBehaviour { private float mStartTime; void Start() { mStartTime = Time.time; } private void Update() { if (Time.time - mStartTime > 5) { Debug.Log("do something"); mStartTime = float.MaxValue; } } }
2.協程計時
public class CoroutineTimerExample : MonoBehaviour { void Start() { StartCoroutine(Timer(5, () => { Debug.Log("do something"); })); } IEnumerator Timer(float seconds,Action callback) { yield return new WaitForSeconds(seconds); callback(); } }
3.UniRx計時
public class UniRxTimerExample : MonoBehaviour
{
private void Start()
{
Observable.Timer(TimeSpan.FromSeconds(5.0f))
.Subscribe(_ =>
{
Debug.Log("do something");
});
}
}