123456868 发表于 2020-12-31 12:37

【Unity开源项目精选】UniRx: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) 变成事件流组合事件流合并自身事件流基于时间的操作非常简单
如果以上链接无法下载或者下载太慢,可以在洪流学堂回复UniRx获取网盘链接。
洪流学堂公号中有UniRx的完整介绍和入门教程: https://mp.weixin.qq.com/mp/homepage?__biz=MjM5Mzg2Nzg2MQ==&hid=3&sn=a1a76b31cef3abfb8da55bd1fc1dc4d2
扩展阅读

【Unity开源项目精选】ML-Agents:给你的游戏加入AI【Unity开源项目精选】AssetStudio:提取Unity游戏的资源【Unity开源项目精选】xLua:Unity热更新首选【Unity开源项目精选】Unity引擎源码的C#部分【Unity开源项目精选】Entitas:Unity DOTS的先行者
我是大智,你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。
页: [1]
查看完整版本: 【Unity开源项目精选】UniRx:Unity中的响应式编程