开始学习 UniRx

UniRx 是什么

它是一个 Unity3D 的编程框架。
它还有一个名字-------------Unity响应式编程插件。它重写了.Net的响应式扩展。.Net官方的Rx非常棒,但是在Unity中无法直接使用,而且和IOS的IL2CPP有兼容性问题。但是这个库解决了这些问题并且添加了一些Unity专属的工具类。 支持的平台有:PC/Mac/Android/iOS/WP8/WindowsStore/等等,并且支持Unity4.6之后的所有版本。

UniRx 在 UnityAssetStore的地址(免费) http://u3d.as/content/neuecc/uni-rx-reactive-extensions-for-unity/7tT

它专注于解决异步逻辑,使得异步逻辑的实现更加简洁优雅。

简洁优雅如何体现?
比如,实现一个”处理鼠标点击事件”这个功能,使用 UniRx 实现如下:

Observable.EveryUpdate()                            // 开启 Update 的事件监听
                      .Where(_ => Input.GetMouseButtonDown(0))  // 进行一个鼠标是否按下的判断
                      .Subscribe(_ =>                           // 订阅/处理事件
                      {
                          Debug.Log("mouse clicked");
                      });

每点击一下鼠标,就会有一次输出
在这里插入图片描述
那么如果把这个功能更改一下,改为“只处理第一次鼠标点击事件”,该怎么做呢?
可以添加一个关键字,First

 Observable.EveryUpdate()                        
                      .Where(_ => Input.GetMouseButtonDown(0)) 
                      .First()                                  // 只处理第一次的点击事件
                      .Subscribe(_ =>                           
                      {
                          Debug.Log("mouse clicked");
                      });

再次运行后,点击多次鼠标,会发现控制台只输出一次log信息,这是UniRx一个很简单的应用。

但是如果使用传统的方式实现”只处理第一次鼠标点击事件“这个功能,要写很多行的代码,还要去创建⼀个成员变量来记录点击次数,或者用一个布尔值记录是否点击过,并且还要在脚本中写一个Update方法去监听鼠标点击事件。

如果在Update方法中,除了要实现鼠标事件监听这个功能之外,还要实现其他的功能。那么在Update⾥就会有着大量的状态判断的逻辑,会造成代码可读性的降低。

而UniRx提供了了一种编程思维,使得平时一些比较难实现和处理的异步逻辑(比如上文这种),使用UniRx可以轻松搞定,并且不失代码的可读性。

当然UniRx的强大不仅仅如此。

它还可以:

• 优雅实现MVP(MVC)架构模式。
• 对UGUI和Unity的API 提供了增强,很多需要写大量代码的UI逻辑,可以使⽤UniRx来优雅的实现。
• 轻松实现非常复杂的异步逻辑处理。
• 等等

最最重要的是,UniRx可以提高我们的编码效率。还给我们的大脑提供了一个强有力的编程模型。

所以UniRx 非常值得研究和学习。

一些有名的Unity框架, uFrame,QFramework 里都引入了UniRx。

为什么要使用UniRx

UniRx 的全称是Unity Reactive Extensions。也就是 Unity 版本的 Reactive Extensions。

Reactive Extensions 擅⻓的部分是处理时间上异步的逻辑。

因为游戏很多的系统在时间上是异步的,Unity开发者要实现的异步(在时间上)任务,有很多。

这也是为什么 Unity 官⽅提供了 Coroutine (协程)这样的概念。

一般来说,网络操作需要用到 WWW 和 Coroutine。但是使用 Coroutine 对于异步操作来说不是一个好的选择,
原因如下:

1.协程不能有返回值,因为它返回类型必须是IEnumerator
2.协程不能处理异常,因为 yield return 语句没办法被 try-catch

会造成代码大面积的强耦合。

Rx就是为了解决异步问题而来的。Rx可以让异步操作更优雅。

在游戏中,⼤部分的逻辑都是在时间上异步的。⽐如动画的播放、声⾳的播放、⽹络请求、资源加载/
卸载、 Tween、场景过渡等都是在时间上异步的逻辑。甚⾄是游戏循环(Update,OnCollisionEnter),
传感器数据(Kinect, Leap Motion, VR Input)都是(时间上)异步事件。

我们往往在进⾏以上逻辑实现的时候经常⽤到⼤量的回调,最终随着项⽬的扩张导致传说中的”回调地狱”降临。

相对较好地⽅法则是使⽤消息/事件的发送,结果导致“消息满天⻜”,导致代码⾮常难阅读。

使⽤ Coroutine 也是⾮常不错的,但是 Coroutine 本身的定义,是以⼀个⽅法的格式来定义的,写起来
是⾮常⾯向过程的。当逻辑稍微复杂⼀点,就很容易造成一个Coroutine嵌套另一个Coroutine,
代码也是⾮常难阅读的(强耦合)。

而UniRx 的出现刚好解决了这个问题,它介于回调和事件之间。
它有事件的概念,只不过他的事件是像⽔⼀样流过来,而我们要做的则是简单地进⾏组织、变换、过滤、合并。

它也⽤到了回调,只不过事件进行组织之后,只有⼀个简单的回调就可以进⾏事件的处理了。
它的原理和 Coroutine(迭代器模式) ⾮常类似,但是⽐ Coroutine 强⼤得多。
UniRx 将(时间上)异步事件转化为 (响应式的) 事件序列,再通过 LINQ (.)操作可以很简单地组合起来,还⽀持时间操作。

总结为⼀句话就是,游戏本身有⼤量的(时间上)异步逻辑,而 UniRx 恰好擅⻓处理(时间上)异步
逻辑,使⽤ UniRx 可以节省我们的时间,同时让代码更简洁易读。
Rx 只是⼀套标准,在其他语⾔也有实现,如果在 Unity 中熟悉了这套标准,在其他语⾔上也是可以很
快上⼿的。⽐如 RxJava、 Rx.cpp、 SwiftRx 等等。

此次学习目标:

• 实践并详细了解开发中最常⽤的 UniRx API。
• 对⽐ Linq 的操作符系统地对比了解 UnIRx 的操作符。
• 感受 UniRx 的魅⼒

附上此次学习地址

http://www.sikiedu.com/course/271

QFramework作者凉鞋大大的课程,可以的话大家多支持一波~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值