你好,我是元宇宙大智,让你学Unity快人几步。
今天给你分享一个Unity开源项目,我们一起来看看吧!
UniRx是什么?
UniRx (Unity响应式编程插件) 重写了.Net的响应式扩展。.Net官方的Rx很棒,但是在Unity中无法使用,并且与IOS的IL2CPP有兼容性问题。这个库这些问题并且添加了一些Unity专属的工具类。 支持的平台有:PC/Mac/Android/iOS/WP8/WindowsStore/等等,并且支持Unity4.6之后的所有版本。
源码地址:
https://github.com/neuecc/UniRx
UniRx 在 Unity Asset Store 的地址(免费):
http://u3d.as/content/neuecc/uni-rx-reactive-extensions-for-unity/7tT
为什么用Rx?
一般来说,网络操作需要用到 WWW
和 Coroutine
。但是使用 Coroutine
对于异步操作来说不是一个好的选择,原因如下:
- 协程不能有返回值,因为它返回类型必须是IEnumerator
- 协程不能处理异常,因为 yield return 语句没办法被 try-catch
会造成代码大面积的强耦合。
Rx就是为了解决异步问题而来的。Rx可以让异步操作更优雅,使用事件驱动编程,使用LINQ操作。
游戏循环 (every Update, OnCollisionEnter, etc), 传感器数据 (Kinect, Leap Motion, VR Input, etc.) 都是事件。Rx将事件转化为响应式的序列,通过LINQ操作可以很简单地组合起来,还支持时间操作。
Unity通常是单线程,但是UniRx可以让多线程更容易。
UniRx 可以简化 uGUI 的编程,所有的UI事件 (clicked, valuechanged, etc) 可以转化为 UniRx 的事件流。
下面的代码实现了双击的检测:
var clickStream = Observable.EveryUpdate()
.Where(_ => Input.GetMouseButtonDown(0));
clickStream.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(250)))
.Where(xs => xs.Count >= 2)
.Subscribe(xs => Debug.Log("DoubleClick Detected! Count:" + xs.Count));
这个例子仅用5行代码,展示出了下面的特性:
- 将游戏循环为 (Update) 变成事件流
- 组合事件流
- 合并自身事件流
- 基于时间的操作非常简单