UniRx第一季学习(五) ------ 操作符Merge/Coroutine/WhenAll/OnCompleted/Start

课程地址 : http://www.sikiedu.com/course/271

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


一.Merge

UniRx 可以开启两个或多个事件流。并使⽤ Merge 进⾏事件流的合并,比如实现⿏标左键或右键点击时都会进⾏处理:

var leftMouseClickStream = Observable.EveryUpdate().Where(_ => 
Input.GetMouseButtonDown(0));
var rightMouseClickStream = Observable.EveryUpdate().Where(_ => 
Input.GetMouseButtonDown(1));

Observable.Merge(leftMouseClickStream, rightMouseClickStream)
.Subscribe(_ => 
{
     // do something
});

二.Coroutine 

UniRx 对 Unity 的 Coroutine 也提供⽀持,可以将⼀个 Coroutine 转化为事件源(Observable)。

 public class Observable2YieldExample : MonoBehaviour
    {
        IEnumerator Delay1Second()
        {
            yield return Observable.Timer(TimeSpan.FromSeconds(1.0f)).ToYieldInstruction();
            Debug.Log("delay 1 seconds");
        }

        void Start()
        {
            StartCoroutine(Delay1Second());
        }
    }

三.WhenAll

WhenAll 和 Merge 是同类型的,是处理多个流的操作符,就是当所有的事件流都结束,就会触发 Subscribe 注册的回调。

1.Coroutine的并行操作

 public class CoroutineSpawnExample : MonoBehaviour
    {
        IEnumerator A()
        {
            yield return new WaitForSeconds(1.0f);
            Debug.Log("A");
        }

        IEnumerator B()
        {
            yield return new WaitForSeconds(1.0f);
            Debug.Log("B");
        }

        void Start()
        {
            var aStream = Observable.FromCoroutine(_ => A());
            var bStream = Observable.FromCoroutine(_ => B());

            Observable.WhenAll(aStream, bStream)
                      .Subscribe(_ =>
                      {
                          Debug.Log("when all 处理了");
                      });
        }
    }

2.按钮的并行操作

 public class AllButtonClickedOnceExample : MonoBehaviour
    {
        void Start()
        {
            var leftMouseClickedEvents = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0)).First();
            var rightMouseClickedEvetns = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(1)).First();

            Observable.WhenAll(leftMouseClickedEvents, rightMouseClickedEvetns)
                      .Subscribe(_ =>
                      {
                          Debug.Log("mouse clicked");
                      });
        }
    }
}

四.事件流的结束OnCompleted 

有的 事件流是有结束事件的,⽐如 Timer、First、Coroutine 等。有的则没有,⽐如 EveryUpdate 等。

 public class OnCompletedExample : MonoBehaviour
    {
        void Start()
        {
            Observable.FromCoroutine(A)
                      .Subscribe(_ =>
                      {
                          Debug.Log("OnNext:");
                      }, () =>
                      {
                          Debug.Log("OnCompleted:");
                      });
        }

        IEnumerator A()
        {
            yield return new WaitForSeconds(2.0f);
        }
    }

五.Start:让多线程更简单

多线程,是作为⾼级开发者必须具备的⼀种技术。了解了多线程可以让我们充分利⽤多核移动端的计算优势,也可以让我们的游戏体验更平滑。
在 Unity 中我们⼀般⽤ Thread.Start 开启⼀个线程。当逻辑⾮常复杂的时候多线程⾮常难以管理。⽽ UniRx 改善了这⼀种状况。

public class ThreadExample : MonoBehaviour
    {
        void Start()
        {
            var threadAStream = Observable.Start(() =>
            {
                Thread.Sleep(TimeSpan.FromSeconds(1));
                return 10;
            });

            var threadBStream = Observable.Start(() =>
            {
                Thread.Sleep(TimeSpan.FromSeconds(3));
                return 10;
            });

            Observable.WhenAll(threadAStream, threadBStream)
                      .ObserveOnMainThread()
                      .Subscribe(results =>
                      {
                          Debug.LogFormat("{0}:{1}", results[0], results[1]);
                      });
        }
    }

Observable.Start:开启⼀个线程流。

ObserveOnMainThread : 把 WhellAll 结果转到主线程上。这样 Subscribe ⾥的回调就可以使⽤Unity 的 API 了(Unity 的很多 API 不可以在其他线程中使⽤ )。

猜你喜欢

转载自blog.csdn.net/dengshunhao/article/details/85379381