开始学习 UniRx

2024-03-31 19:48
文章标签 学习 unirx

本文主要是介绍开始学习 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/865187

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件