找回密码
 立即注册
查看: 613|回复: 0

[笔记] 【Unity开源项目精选】UniRx:Unity中的响应式编程

[复制链接]
发表于 2020-12-31 12:37 | 显示全部楼层 |阅读模式
洪流学堂,让你快人几步。你好,我是你的技术探路者郑洪智,你可以叫我大智。
本篇文章首发于我的公众号:洪流学堂
今天给你分享一个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 的事件流。
下面的代码实现了双击的检测:
  1. var clickStream = Observable.EveryUpdate()
  2.     .Where(_ => Input.GetMouseButtonDown(0));
  3. clickStream.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(250)))
  4.     .Where(xs => xs.Count >= 2)
  5.     .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的先行者
我是大智,你的技术探路者,下次见!
别走!点赞收藏哦!
好,你可以走了。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 18:48 , Processed in 0.089929 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表