前言
想要更好的去学习UniRx,我们最好是先理解UniRx 的语法格式。就像我们去学习英语或者汉语一样,理解了基本的语法规则后,再学其他的就信手拈来了。
语法示例
下面我们来看一个最简单的示例,
Observable.EveryUpdate()
.Where(_ => Input.GetMouseButtonDown(0))
.Subscribe((x) =>
{
Debug.Log("点击了鼠标左键");
});
这个例子虽然简单,但是确实最标准的一个UniRx的语法了。
首先:Observable.EveryUpdate():这句意思是创建一个EveryUpdate的事件发送者。
.Subscribe是事件的接收者,订阅者,发送者发送事件,接收者可以接收事件。没有订阅者订阅之前,数据流是不会执行的。
.Where:是一个过滤器,就是发送者和接收者之间设置的一个条件,会过滤掉不符合条件的事件。
整理分析:这句话的意思就是,开一个每帧的循环事件,监听鼠标左键点击的条件,满足条件,事件接收者就会接收到事件。
可以看下面示意图:
语法分析
所以我们可以看到UniRx的基本语法就是
- 创建一个或多个事件(被订阅者)发送者 + 一个或多个条件 + 事件订阅者(接收者)
Overservable.xxxxx是一个静态函数,可以返回一个IObservable对象。这类的静态函数有很多。
IObservable接口有很多的函数扩展,如Where,Select,Zip,等等。这些函数大部分是和Linq语法一致的,UniRx也有些自己的扩展。大部分都是对订阅事件的一个条件约束,或者理解为数据流的过滤方式。
.Subscribe(onNext,onError,onComplete)订阅函数,有三个参数,后俩是可选的,
onNext代表,数据流执行后的一次结果返回,或者是 一次事件接受
onError代表,数据流执行异常。
onComplete,代表这个IObservable可订阅对象的执行任务完成了。如果是一些循环执行的订阅,onComplete永远不会执行。
我们再来看一个复杂的例子:
var clickStream = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0));
clickStream.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(250)))
.Where(xs => xs.Count >= 2)
.Subscribe(xs => Debug.Log("双击事件"));
我们来简单分析下:
Observerble.EveryUpdate:代表开启一个每帧循环事件,
.Where;条件每次鼠标左键点击
clickStream.Throttle:每个一个时间间隔输出一次数据,即每0.25s输出一次数据
clickStream.Buffer:对输出的数据,我们再进行一个缓冲,就是存储到一个集合中。
.Where(xs.Count>=2):如果缓冲的数据>2个,就代表是连续点击了两次鼠标。
.Subscribe:就是双击事件的订阅者了。
我们可以看到,即使是复杂的UniRx语法,也离不开我们最基础的语法接口,之不是里面 有一些我们不熟悉的语句而已,如果我们了解了Buffer ,了解了Throttle,等等,那么我们就可以游刃有余的使用UniRx了。
好了,这篇文章先到这里,希望能够对你 有所帮助。