UniRx第一季学习(二) ------ UniRx 的基本语法格式+Update

UniRx第一季学习(二) ------ UniRx 的基本语法格式+Update

课程地址 :

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


一.UniRx 的基本语法格式

 private void Start()
        {
            Observable.Timer(TimeSpan.FromSeconds(5.0f))
                      .Subscribe(_ =>
                      {
                          Debug.Log("do something");
                      });
        }

Observable.XXX().Subscribe() 是⾮常典型的 UniRx 格式。
只要理解什么意思就可以看懂⼤部分的 UniRx 的⽤法了。

⾸先解决词汇问题:
Observable: 可观察的,形容词,形容后边的词(Timer) 是可观察的,我们可以粗暴地把 Observable 后
边的理解成发布者。
Timer: 定时器,名词,被 Observable 描述,

连起来则是:可被观察(监听)的.Timer().订阅()
顺下来应该是:订阅可被观察的定时器。
其概念关系很容易理解。
•     Timer 是可观察的。
•     可观察的才能被订阅

Observable.XXX().Subscribe();
可被观察(监听)的 XX,注册。
以上从发布者和订阅者这个⻆度来进⾏的介绍,以便⼤家理解。
但是 UniRx 的侧重点,不是发布者和订阅者这两个概念如何使⽤,⽽是事件从发布者到订阅者之间的
过程如何处理。
所以两个点不重要,重要的是两点之间的线,也就是事件的传递过程。

二.独立的Update

在写代码的过程中经常会在MonoBehaviour 的 Update 中掺杂了⼤量互相⽆关的逻辑,导致代码⾮常不容易阅读

private void Update()
{
   if (A)
   {
     ...
   }
}

代码冗⻓,⽽且⼲扰视线。UniRx 可以改善这个问题。

enum ButtonState
        {
            None,
            Clicked,
            DoubleClicked
        }


        void Start()
        {
            ButtonState buttonState = ButtonState.None;

            bool buttonClicked = false;

            // 监听鼠标左键
            Observable.EveryUpdate()
                      .Subscribe(_ =>
                      {
                          if (Input.GetMouseButtonDown(0))
                          {
                              Debug.Log("left mouse button clicked");
                              buttonClicked = true;
                          }
                      });


            // 监听鼠标右键
            Observable.EveryUpdate()
                      .Subscribe(_ =>
                      {
                          if (Input.GetMouseButtonDown(1))
                          {
                              Debug.Log("right mouse button clicked");
                              buttonClicked = true;
                          }
                      });

            // 监听状态 
            if (buttonClicked && buttonState == ButtonState.None)
            {
                buttonState = ButtonState.Clicked;
            }

        }