你好,我是元宇宙大智,让你学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?

一般来说,网络操作需要用到 WWWCoroutine。但是使用 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) 变成事件流
  • 组合事件流
  • 合并自身事件流
  • 基于时间的操作非常简单