独立的 Update

在 UniRx 简介的时候,笔者讲了一种比较麻烦的情况:就是在 MonoBehaviour 的 Update 中掺杂了大量互相无关的逻辑,导致代码非常不容易阅读。

这种情况我们平时在项目开发中非常常见,代码如下:

private void Update()
{
if (A)
{
...
} if (B)
{
...
if (D)
{
...
}
else {}
} switch (C)
{
...
} if (Input.GetMouseButtonUp(0))
{
...
}
}

Update 方法中代码冗长,而且干扰视线,非常影响阅读。

而使用 UniRx 则可以改善这个问题。

void Start()
{
// A 逻辑,实现了 xx
Observable.EveryUpdate()
.Subscribe(_ =>
{
if (A)
{
...
}
}).AddTo(this); // B 逻辑,实现了 xx
Observable.EveryUpdate()
.Subscribe(_ =>
{
if (B)
{
...
if (D)
{
...
}
else {}
}
}).AddTo(this); // C 逻辑,实现了 xx
Observable.EveryUpdate()
.Subscribe(_ =>
{
switch (C)
{
...
}
}).AddTo(this); // 鼠标点击检测逻辑
Observable.EveryUpdate()
.Subscribe(_ => {
{
if (Input.GetMouseButtonUp(0))
{
...
}
}).AddTo(this);
}

虽然在代码长度上没有任何改善,但是最起码,这些 Update 逻辑互相之间独立了。

状态跳转、延时等等这些经常在 Update 里实现的逻辑,都可以使用以上这种方式独立。

使用 UniRx 可以对我们工程中的代码进行了改善,而笔者接触 UniRx 之后,就再也没有使用过 Update 方法了。

不过以上的这种 UniRx 使用方式,是比较初级的,而这种使用方式,随着对 UniRx 的深入学习,也会渐渐淘汰,因为等我们入门之后,会学习更好的实现方式。

今天的内容就这些。

知识地图

UniRx 的基本语法格式

在之前的两篇文章中,我们学习了 UniRx 的 Timer 和 Update 这两个 API,但是对代码的工作原理还没有进行过介绍。在这篇文章中,我们就来试着理解一下 UniRx 的代码工作原理及 UniRx 的基本语法格式。

先搬出来第一篇文章中 Delay 的实现代码:

/****************************************************************************
* http://liangxiegame.com liangxie
****************************************************************************/ using System;
using UniRx;
using UnityEngine; namespace UniRxLesson
{
public class DelayExample : MonoBehaviour
{
private void Start()
{
Observable.Timer(TimeSpan.FromSeconds(2.0f)).Subscribe(_ =>
{
Debug.Log("延时两秒"); }).AddTo(this);
}
}
}

代码中的 Observable.XXX().Subscribe() 是非常经典的 UniRx 格式。只要理解了这种格式就可以看懂大部分的 UniRx 的用法了。

首先解决代码中的词汇问题:

  • Observable:可观察的,是形容词,它形容后边的词(Timer)是可观察的,我们可以直接把 Observable 后边的词理解成发布者。
  • Timer:定时器,名词,被 Observable 修饰,所以是发布者,是事件的发送方。
  • Subscribe:订阅,是动词,它订阅谁呢?当然是前边的 Timer,这里可以理解成订阅者,也就是事件的接收方。
  • AddTo:添加到,这个我们暂时不用理解得太深刻,只需要知道它是与 MonoBehaviour 进行生命周期绑定即可。

以上的代码,连起来则是:可被观察(监听)的.Timer().订阅()

理顺了之后应该是:订阅可被观察的定时器。

其概念关系很容易理解。

  • Timer 是可观察的。
  • 可观察的才能被订阅。
Observable.XXX().Subscribe();

这行代码我们可以理解为:可被观察(监听)的 XX,注册。

以上笔者从发布者和订阅者这个角度进行了简单的介绍,以便大家理解。

但是 UniRx 的侧重点,不是发布者和订阅者这两个概念如何使用,而是事件从发布者到订阅者之间的过程如何处理。

所以这两个点不重要,重要的是两点之间的线,也就是事件的传递过程。

这里先不说得太深入,在入门之后,会用很大的篇幅去深入介绍这些概念的。

今天的 UniRx 的基本语法格式的介绍就到这里,我们下一篇再见,拜拜~

知识地图

更多内容

QFramework 地址:https://github.com/liangxiegame/QFramework

QQ 交流群:623597263

凉鞋的主页:https://liangxiegame.com/zhuanlan

关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

最新文章

  1. Gc.Db之循序渐进
  2. 黑马程序员——OC基础 三种特性之封装
  3. linux awk的使用
  4. php curl向远程服务器上传文件
  5. python学习之---函数进阶
  6. Excel导入mysql数据库
  7. 对发给Application.Handle消息的三次执行(拦截)消息的过程
  8. AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)
  9. 博客加上“Fork me on Github”彩带
  10. layer弹窗插件实战用法小结1—— layer.alert()
  11. 将Java Web项目部署到远程主机上
  12. Spring Boot 构建电商基础秒杀项目 (七) 自动校验
  13. MySQL InnoDB引擎B+树索引简单整理说明
  14. java.io.ByteArrayInputStream 源码分析
  15. wireshark抓取OMCI报文
  16. 【Cf #502 H】The Films(莫队)
  17. C 应用
  18. #leetcode刷题之路12-整数转罗马数字
  19. Win10家庭版卸载Mysql 8.0.13实录
  20. [ Openstack ] Openstack-Mitaka 高可用之 环境初始化

热门文章

  1. tomcat启动失败怎么回事?
  2. [Objective-C] 012_数据持久化_XML属性列表,NSUserDefaults
  3. 【转】eclipse找不到或无法加载主类
  4. debug PHP程序(xdebug、IntelliJ IDEA)
  5. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
  6. 01 . Redis简介及部署主从复制
  7. WebSocket是什么,有什么作用和特点?
  8. 【朝夕专刊】RabbitMQ消息的持久化优先级
  9. webstorm 单词快捷翻译设置
  10. 【Hadoop】Hadoop的安装,本地模式、伪分布模式的配置