UniRx第一季学习(一) ------ 简介及优势

UniRx第一季学习(一) ------ 简介及优势

课程地址 :

凉鞋大大的,可以的话大家多支持一波~


一.简介及优势

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