独立的 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 获取第一时间更新通知及更多的免费内容。

UniRx精讲(二):独立的 Update &UniRx 的基本语法格式的更多相关文章

  1. UniRx精讲(一):UniRx简介&定时功能实现

    1.UniRx 简介 UniRx 是一个 Unity3D 的编程框架.它专注于解决时间上异步的逻辑,使得异步逻辑的实现更加简洁和优雅. 简洁优雅如何体现? 比如,实现一个"只处理第一次鼠标点 ...

  2. iOS开发——语法篇OC篇&高级语法精讲二

    Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...

  3. Mybatis精讲(二)---生命周期

    目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...

  4. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  5. 微软BI SSIS 2012 ETL 控件与案例精讲课程学习方式与面试准备详解

    开篇介绍 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程从2014年9月开始准备,到2014年12月在 天善BI学院  ...

  6. SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、)

    SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELE ...

  7. Mysql 索引精讲

    Mysql 索引精讲 开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象- 常见索引类型(实现层面) 索引种类(应用层面) 聚簇索引与非聚簇索引 覆盖索引 最佳索引使用策略 1.常见 ...

  8. 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

    本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  9. 【设计模式】Java设计模式精讲之原型模式

    简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...

随机推荐

  1. vscode格式化Vue出现的问题:单引号变双引号 格式化去掉分号

    学习vue框架时,发现在使用vscode格式化vue代码时,出现单引号变成了双引号问题(导致和EsLint要求不一致),从而导致报错!!!!好坑啊!!! 解决方法如下 在文件根目录下创建 .prett ...

  2. c# 优化代码的一些规则——优先隐式类型[一]

    前言 说到底就是优先使用var,这个关键字,在c# 3.0中出现了. 首先要确认几点,一个就是var 是静态变量,而不是动态变量,也就是说使用var 你是不必去担心性能问题得, 百度百科: 1)静态存 ...

  3. 不懂代码?没关系,照样可以做SaaS软件开发

    众所周知,一家标准化的企业的日常运营管理都需要一个强大的中枢或中台管理系统来统筹整个企业或是整个集团的运作,这个强大的中台管理系统就相当于是企业的引擎.在引擎的带动下,汽车可以快速的飞驰起来,同样,在 ...

  4. Java线程的启动与中止

    一.线程与进程的关系 关于进程与线程,百度百科上是这样描述的: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当 ...

  5. Kivy中ActionBar控件的使用

    这个控件可以作为导航栏来使用,效果非常好. 1. ActionBar包含的组件 ActionBar中需要一个ActionView作为容器来存放其他控件,比如:ActionPrevious.Action ...

  6. 我的Android知识结构图——20200507停止更新,后续通过标签或分类继续完善结构图

    *持续更新中.调整中(带链接的是已经总结发布的,未带链接是待发布的) *个别知识点在多个分类中都是比较重要部分,为了分类完整性 可能多出都列出了 *每一篇都是认真总结并写出来的,若哪里有问题欢迎指正 ...

  7. python脚本:在Ubuntu16系统上基于xtrabackup2.4和mysql5.7实现数据库数据的自动化备份和恢复,亲测有效!

    1 安装教程 官网安装教程:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/apt_repo.html -------- ...

  8. 我终于看懂了HBase,太不容易了...

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在我还不了解分布式和大数据的时候已经听说过HBa ...

  9. 【HBase】 常用命令

    创建表 hbase(main):006:0> create 'goods_zc','type' 0 row(s) in 1.3090 seconds => Hbase::Table - g ...

  10. Java实现蓝桥杯模拟带九9的数的个数

    问题描述 在1至2019中,有多少个数的数位中包含数字9? 注意,有的数中的数位中包含多个9,这个数只算一次.例如,1999这个数包含数字9,在计算只是算一个数. 答案提交 这是一道结果填空的题,你只 ...