1. 程式人生 > >UniRx第一季學習(一) ------ 簡介及優勢

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");
                      });
        }
    }