找回密码
 立即注册
查看: 473|回复: 9

UniRx 精讲 2019:1.UniRx 简介

[复制链接]
发表于 2022-3-25 19:24 | 显示全部楼层 |阅读模式
UniRx 是一个 Unity3D 的编程框架。它专注于解决时间上异步的逻辑,使得异步逻辑的实现更加简洁和优雅。
简洁优雅如何体现?

比如,实现一个“只处理第一次鼠标点击事件”这个功能,使用 UniRx 实现如下:
Observable.EveryUpdate()
            .Where(_ => Input.GetMouseButtonUp(0))
            .First()
            .Subscribe(_ => { // do something   });
代码做的事情很简单:

  • 开启一个 Update 的事件监听。
  • 每次 Update 事件被调用时,进行鼠标是否抬起的判断。
  • 如果判断通过,则进行计数,并且只获取第一次点击事件。
  • 订阅/处理事件。
如果在 Unity 中,使用传统的方式实现如上功能,首先要创建一个成员变量来记录点击次数/是否点击过,然后在脚本中创建一个 Update 方法来监听鼠标抬起的事件。
如果在 Update 方法中,除了实现鼠标事件监听这个功能之外,还要实现其他的功能。那么 Update 里就会充斥着大量的状态判断等逻辑。代码非常不容易阅读。
而 UniRx 提供了一种编程思维,使得平时一些比较难以实现的异步逻辑(比如以上这种),使用 UniRx 轻松搞定,并且不失代码的可读性。
当然 UniRx 的强大不仅仅如此。
它还可以:

  • 优雅实现 MVP(MVC)架构模式。
  • 对 UGUI/Unity API 提供了增强,很多需要写大量代码的 UI 逻辑,使用 UniRx 优雅实现。
  • 轻松完成非常复杂的异步任务处理。
  • ……
最最重要的是,它可以提高我们的编码效率,同时还给我们的大脑提供一个强有力的编程模型。而 UniRx 本身的源码非常值得研究学习,就连大名鼎鼎的 uFrame 框架,在 1.6 版本之后,使用 UniRx 进行了大幅重构,其事件/数据绑定层使用 UniRx 强力驱动。
笔者的 QFramework 也同样引入了 UniRx,有一大批的框架用户都是因为支持了 UniRx 慕名而来。
为什么要用 UniRx ?

UniRx 就是 Unity 版本的 Reactive Extensions,Reactive Extensions 中文意思是:响应式扩展,响应式指的是观察者和定时器,扩展指的是 LINQ 的操作符。Reactive Extensions 以擅长处理时间上异步的逻辑、以及极简的 API 风格而闻名。
我们都知道,游戏很多的系统都是在时间上异步的,所以 Unity 开发者所需要实现的异步逻辑是非常多的。这也是为什么 Unity 官方在引擎层实现了 Coroutine(协程)这样的概念。
在游戏中,像动画的播放、声音的播放、网络请求、资源加载/卸载、Tween 动画、场景过渡等都是在时间上异步的逻辑。甚至是游戏循环(Every Update、OnCollisionEnter 等)、传感器数据(Kinect、Leap Motion、VR Input 等)都是时间上异步的逻辑(事件)。
当我们在项目中实现以上的逻辑的时候,往往使用的方式是用大量的回调实现,最终随着项目的扩张会导致传说中的”回调地狱”。
相对较好的方法则是使用消息/事件进行实现,结果导致“消息满天飞”,导致代码非常难以阅读。
以上的任务使用 Coroutine 也是非常不错的,但是 Coroutine 在 Unity 使用的时候,需要定义一个方法。写起来是非常面向过程的。当逻辑稍微复杂一点,就很容易造成 Coroutine 嵌套 Coroutine,代码是非常不容易阅读的(强耦合)。
而 UniRx 的出现刚好解决了这个问题,它介于回调和事件之间。
它有事件的概念,只不过它的事件是像流水一样流过来,而我们要做的则是简单地对这些事件进行组织、变换、过滤、合并就可以得到我们想要的结果了。
它也用掉了回调,只不过它的回调是在事件经过组织之后,只需要调用一次就可以进行事件处理了。
它的原理和 Coroutine (迭代器模式)、LINQ 非常相似,但是比 Coroutine 强大得多。
UniRx 将时间上异步的事件转化为响应式的事件序列,通过 LINQ操作可以很简单地组合起来。
为什么要用 UniRx? 答案就是游戏本身有大量的在时间上异步的逻辑,而 UniRx 恰好擅长处理这类逻辑,使用 UniRx 可以节省我们的时间,同时让代码更简洁易读。
Rx 只是一套标准,其他的语言也有实现,如果在 Unity 中熟悉了这套标准,那么在未来,大家在做别的语言的项目的时候,很容易获得 Rx 的能力。
专栏内容:


  • 实践并讲解开发中最常用的 UniRx API。
  • 对 UniRx 进行一个全方面的简介。
  • 在每个阶段结束后就会结合所学的知识进行项目实践。
  • UniRx 操作符大全。
  • UniRx 源码阅读。
  • UniRx 背后的设计原理及设计模式学习。
  • LINQ、Coroutine 底层原理剖析。
  • BindingsRx、uFrame 源码阅读。
OK,让我们从下一篇开始,感受一下 UniRx 的魅力吧。
知识地图



更多内容

GamePix 独立游戏学院:gamepixedu.com

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-3-25 19:33 | 显示全部楼层
这个东西虽然很好,但是不知道为什么国外用的人比较少。
发表于 2022-3-25 19:38 | 显示全部楼层
em... 哪里的数据?
发表于 2022-3-25 19:45 | 显示全部楼层
性能消耗怎样?
发表于 2022-3-25 19:48 | 显示全部楼层
用的人很多现在github unity 热度前几的开源
发表于 2022-3-25 19:56 | 显示全部楼层
响应式编程是不错的,就是有点点担心性能,会不会在堆上生成过多的小对象,导致GC太多,有这方面的测试吗
发表于 2022-3-25 19:57 | 显示全部楼层
测试没做过 但是多多少少会有, 我自己 一般用于 数据+事件驱动会多一些,其他的地方能不用就不用。
发表于 2022-3-25 20:05 | 显示全部楼层
哈哈哈,大名鼎鼎的uframework,作者,凉鞋
发表于 2022-3-25 20:07 | 显示全部楼层
我自己开发过程中会用到UniRx,用了快一年了,做性能优化的时候能看到UniRx消耗不会占项目总消耗的大头。当性能消耗占比最大的部分是UniRx的时候,这个项目应该已经优化的非常好了吧[调皮]
发表于 2022-3-25 20:16 | 显示全部楼层
嗯 没有做过因为 UniRx 造成瓶颈的项目
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-17 04:50 , Processed in 0.096890 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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