4.UniRx 的基本语法格式
在之前的两篇文章中,我们学习了 UniRx 的 Timer 和 Update 这两个 API,但是对代码的工作原理还没有进行过介绍。在这篇文章中,我们就来试着理解一下 UniRx 的代码工作原理及 UniRx 的基本语法格式。
先搬出来第一篇文章中 Delay 的实现代码:
/****************************************************************************
* http://liangxiegame.com liangxie
****************************************************************************/
using
System
;
using
UniRx
;
using
UnityEngine
;
namespace
UniRxLesson
{
public
class
DelayExample
:
MonoBehaviour
{
private
void
Start
(
)
{
Observable
.
Timer
(
TimeSpan
.
FromSeconds
(
2.0f
)
)
.
Subscribe
(
_
=>
{
Debug
.
Log
(
"延时两秒"
)
;
}
)
.
AddTo
(
this
)
;
}
}
}
代码中的 Observable.XXX().Subscribe() 是非常经典的 UniRx 格式。只要理解了这种格式就可以看懂大部分的 UniRx 的用法了。
首先解决代码中的词汇问题:
-
Observable:可观察的,是形容词,它形容后边的词(Timer)是可观察的,我们可以直接把 Observable 后边的词理解成发布者。
-
Timer:定时器,名词,被 Observable 修饰,所以是发布者,是事件的发送方。
-
Subscribe:订阅,是动词,它订阅谁呢?当然是前边的 Timer,这里可以理解成订阅者,也就是事件的接收方。
-
AddTo:添加到,这个我们暂时不用理解得太深刻,只需要知道它是与 MonoBehaviour 进行生命周期绑定即可。
以上的代码,连起来则是:可被观察(监听)的.Timer().订阅() 理顺了之后应该是:订阅可被观察的定时器。
其概念关系很容易理解。
-
Timer 是可观察的。
-
可观察的才能被订阅。
Observable
.
XXX
(
)
.
Subscribe
(
)
;
这行代码我们可以理解为:可被观察(监听)的 XX,注册。
以上笔者从发布者和订阅者这个角度进行了简单的介绍,以便大家理解。 但是 UniRx 的侧重点,不是发布者和订阅者这两个概念如何使用,而是事件从发布者到订阅者之间的过程如何处理。 所以这两个点不重要,重要的是两点之间的线,也就是事件的传递过程。
这里先不说得太深入,在入门之后,会用很大的篇幅去深入介绍这些概念的。
今天的 UniRx 的基本语法格式的介绍就到这里,我们下一篇再见,拜拜~
知识地图
5.操作符 Where
在上一篇,笔者介绍了 UniRx 的基本语法格式。 其中有一句话:UniRx 的侧重点,不是 发布者 和 订阅者 这两个概念如何使用,而是事件从发布者到订阅者之间的过程如何处理。
如何处理?
今天我们就试着了解一下这部分。
在之前,我们有介绍 Update API。 其中有一段代码如下:
Observable
.
EveryUpdate
(
)
.
Subscribe
(
_
=>
{
if
(
Input
.
GetMouseButtonUp
(
0
)
)
{
// do something
}
}
)
.
AddTo
(
this
)
;
这段代码实现了鼠标按钮的点击事件处理。
但是这段代码,还不够简洁。如何更加简洁? 答案是:使用 Where 操作符。
代码如下:
Observable
.
EveryUpdate
(
)
.
Where
(
_
=>
Input
.
GetMouseButtonUp
(
0
)
)
.
Subscribe
(
_
=>
{
// do something
}
)
.
AddTo
(
this
)
;
Where 的意思是在哪儿。这里我们理解成一个条件语句。也就是 if 语句。 类似:
if
(
Input
.
GetMouseButtonUp
(
0
)
)
Where 是一个过滤的操作,它过滤掉了不满足条件的事件。
笔者呢,在这里给大家一个比较容易的理解:
-
EveryUpdate 是事件的发布者。它会每帧发一个事件过来。
-
Subscribe 是事件的接收者,接收的是 EveryUpdate 发送的事件。
-
Where 则是在事件发布者和接收者之间的一个过滤操作。会过滤掉不满足条件的事件。
所以,Subscribe 处理的事件,都是满足 Input.GetMouseButtonUp(0) 条件的时间。 看以下这两幅图就可以理解了。 顶部是事件的发布者,中间是操作符,底部则是订阅者。 这个图意思是,只有原型的才可以通过。
事件本身可以是参数,但是 EveryUpdate 没有参数所以发送的事件是 Unit ,在 Rx 里,这个是空的意思,与我们程序语言中的 null 是一个意思,所以在 Where 这行代码中不需要接收参数,我们使用
把参数屏蔽掉,当然在 Subscribe 中,也是用了一个
来接收参数。
这种就是,UniRx 的基本编程模型。
今天的内容就这些,我们下一篇再见拜拜~
知识地图
转载请注明地址:凉鞋的笔记:
liangxiegame.com
更多内容
-
QFramework 地址: https://github.com/liangxiegame/QFramework
-
QQ 交流群: 623597263
-
2020届Unity 凉鞋小班招生 : liangxiegame.com
-
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
806

被折叠的 条评论
为什么被折叠?



