• UniRx精讲(二):独立的 Update &UniRx 的基本语法格式


    独立的 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 的深入学习,也会渐渐淘汰,因为等我们入门之后,会学习更好的实现方式。

    今天的内容就这些。

    知识地图

    image.png

    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 的基本语法格式的介绍就到这里,我们下一篇再见,拜拜~

    知识地图

    image.png

    更多内容
    QFramework 地址:https://github.com/liangxiegame/QFramework
    QQ 交流群:623597263
    凉鞋的主页:https://liangxiegame.com/zhuanlan
    关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

  • 相关阅读:
    mysql 刘道成视频教程 第4-8课 --- 数据类型
    mysql 刘道成视频教程 第3课
    9款优秀的开源版本控制和源代码管理系统 转载
    mysql主要应用场景 转载
    平时收藏网页
    mysql 刘道成视频教程1、2课----------大致结构
    软件
    visual studio 2010 快捷键
    将CString(unicode)转换为char*(ANSI)
    去掉Visual Studio 编辑器里中文注释的红色波浪线 转载
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/13139519.html
Copyright © 2020-2023  润新知