Unity基于响应式编程(Reactive programming)入门
系列目录
【Unity3D基础】让物体动起来①--基于UGUI的鼠标点击移动
【Unity3D基础】让物体动起来②--UGUI鼠标点击逐帧移动
时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现
时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画
时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率
背景
前有慕容小匹夫的一篇《解构C#游戏框架uFrame兼谈游戏架构设计》,引用文中内容
uFrame是提供给3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分)。因为用于Unity3D,所以它向开发者提供了一套基于Editor的可视化编辑工具,可以用来管理代码结构等。需要指出的是它的一个重要的理念,同时也是软件工程中的一个重要理念就是关注分离(Separation of concern,SoC)。uFrame借助控制反转(IoC)/依赖注入(DI)实现了这种分离,从而进一步实现了MVVM这种模式。且在1.5版本之后,引入了UniRx库,引进了响应式编程的思想。
读起来高大上,本文主要想从实际出发,着手最后一句“且在1.5版本之后,引入了UniRx库,引进了响应式编程的思想。”,在Unity中如何使用响应式编程,如何使用UniRx库。
当然一下列出这么多新概念性的东西,作为新手必然理解起来有困难的,当然我也希望你是天赋迥异的人。这里列出几点,如果你不了解,请自行去学习或者复习,回来在看也不迟。
1、Linq基础,Linq的本质及与传统命令式编程的区别和优点
2、声明式编程和命令式编程的概念和区别
3、什么是响应式编程
4、什么是观察者模式
5、软件编程中Stream的概念
好了装b时间过去了,让我们简单的说下什么是响应式编程。这里也不废话,引用一段,看的懂得自然明白,不懂得还是不明白
什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LINQ风格编写基于观察者模式的异步编程模型。简单点说Rx = Observables + LINQ + Schedulers。
这里为什么要在游戏开发中引入响应式编程Rx,答案是游戏特别适合RX编程,因为在游戏中广泛应用了时间(帧)和事件(UI)的概念,时间本身是一种流,而事件也是基于时间的一种信号(并不是特别准确,意会),而这正是RX所擅长的。
实现
本文以系列文章中的精灵鼠标移动和序列帧动画为基础,没有基础的先参考下传统实现方式一下两篇文章
时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画
时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率
这里引入了UniRx库,来实现基于响应式编程及声明式编程代码重构,代码如下:
using UnityEngine;
using UniRx;
public class PlayerController : MonoBehaviour
{
public float speed;
private Vector3 moveDirection;
private int currentTexture = 0;
public Sprite[] textureArray;
// Use this for initialization
void Start()
{
//鼠标控制移动,每帧更新
Observable.EveryUpdate()
.Subscribe(_ =>
{
//1、获得当前位置
Vector3 curenPosition = this.transform.position;
//2、获得方向
if (Input.GetButton("Fire1"))
{
Vector3 moveToward = Camera.main.ScreenToWorldPoint(Input.mousePosition);
moveDirection = moveToward - curenPosition;
moveDirection.z = 0;
moveDirection.Normalize();
}
//3、插值移动
Vector3 target = moveDirection * speed + curenPosition;
transform.position = Vector3.Lerp(curenPosition, target, Time.deltaTime);
});
//帧动画
SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
//定时器每隔5帧
Observable.IntervalFrame(5).Subscribe(_ =>
{
currentTexture++;
if (currentTexture >= textureArray.Length)
{
currentTexture = 0;
}
spriteRenderer.sprite = textureArray[currentTexture];
});
}
}
是的没有看错,你没有发现熟悉的Update函数,如果说以上函数让你看到就是把所有代码就放在了Start里面而已,我们再重构一下代码,使用提取方法,看看效果,这就是声明式编程的魅力,程序可读性增强,更适合人类的思维方式
using UnityEngine;
using UniRx;
public class PlayerController : MonoBehaviour
{
public float speed;
private Vector3 moveDirection;
private int currentTexture = 0;
public Sprite[] textureArray;
// Use this for initialization
void Start()
{
//鼠标控制移动,每帧更新
PlayerMove();
//角色 帧动画
PlayerAnimation();
}
/// <summary>
/// 角色 帧动画控制
/// </summary>
private void PlayerAnimation()
{
SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
//定时器每隔5帧
Observable.IntervalFrame(5).Subscribe(_ =>
{
currentTexture++;
if (currentTexture >= textureArray.Length)
{
currentTexture = 0;
}
spriteRenderer.sprite = textureArray[currentTexture];
});
}
/// <summary>
/// 鼠标控制移动,每帧更新
/// </summary>
private void PlayerMove()
{
Observable.EveryUpdate()
.Subscribe(_ =>
{
//1、获得当前位置
Vector3 curenPosition = this.transform.position;
//2、获得方向
if (Input.GetButton("Fire1"))
{
Vector3 moveToward = Camera.main.ScreenToWorldPoint(Input.mousePosition);
moveDirection = moveToward - curenPosition;
moveDirection.z = 0;
moveDirection.Normalize();
}
//3、插值移动
Vector3 target = moveDirection*speed + curenPosition;
transform.position = Vector3.Lerp(curenPosition, target, Time.deltaTime);
});
}
}
总结
这里记住UniRx两个方法 Observable.EveryUpdate,Observable.IntervalFrame(这里还记得以前文章里提的定时器吗,这个定时器怎么样简单吧),还有ObservableWWW.GetWWW(上一篇的一个异步加载资源的函数),采用声明式编程的方式,看看函数名就知道是干什么的了吧,还用看文档或者解释什么吗?
文章内容比较简单,实现的功能也简单,函数也简单,希望你们喜欢。
Unity基于响应式编程(Reactive programming)入门的更多相关文章
- 函数响应式编程(FRP)从入门到”放弃”——基础概念篇
前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...
- 响应式编程系列(一):什么是响应式编程?reactor入门
响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...
- .Net中的反应式编程(Reactive Programming)
系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...
- (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...
- Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统 ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- 1小时让你掌握响应式编程,并入门Reactor
我看同步阻塞 “你知道什么是同步阻塞吗”,当然知道了.“那你怎么看它呢”,这个... 在同步阻塞的世界里,代码执行到哪里,数据就跟到哪里.如果数据很慢跟不上来,代码就停在那里等待数据的到来,然后再带着 ...
- 函数响应式编程(FRP)—基础概念篇
原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...
- [译] Swift 的响应式编程
原文 https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-3/Swift的响应式编程.md 原文链接 : Reactiv ...
随机推荐
- HDU 2825 Wireless Password(AC自动机+DP)
题目链接 做题, #include <cstdio> #include <string> #include <cstring> using namespace st ...
- BZOJ1391: [Ceoi2008]order
Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Inpu ...
- Emmet:HTML/CSS代码快速编写神器
本文来源:http://www.iteye.com/news/27580 ,还可参考:http://www.w3cplus.com/tools/emmet-cheat-sheet.html Em ...
- 使用 GCC 调试程序
系统 Ubuntu 调试示例: #include <stdio.h> int func(int n) { ,i; ;i<n;i++) { sum+=i; } return sum; ...
- 记录JVM内存模型,参数含义和优化
一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...
- java中用过滤器解决字符编码问题
java的web程序经常出现中文乱码的问题,用一个实现了Filter接口的过滤器类可以较好地解决这个问题. 方式一 EncodingFilter import java.io.IOException; ...
- UDP和TCP的区别(转)
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- markdown语法学习笔记
##1.**标题** # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ##2.**加粗** 首尾各加两个*号 ##3.*斜字体 ...
- Python 基础 - 随机列表最大的两个值
# -*- coding: utf-8 -*- #author:v def sywmemeda(l): #list 冒泡排序 length = len(l) for i in range(length ...
- JSP页面以及简单的指令
JSP(Java Server Pages)是指: 在HTML中嵌入Java脚本语言 由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本语言命令 然后将生成的整个页面信息返回给客户端 页 ...