本文主要是介绍开始学习 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作者凉鞋大大的课程,可以的话大家多支持一波~
这篇关于开始学习 UniRx的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!