Unity实现设计模式——命令模式
Unity实现设计模式——命令模式
推荐一个Unity学习设计模式很好的GitHub地址:https://github.com/QianMo/Unity-Design-Pattern 有非常多的Star
一、介绍
命令模式使得请求的发送者与请求的执行者之间消除耦合,让对象之间的调用关系更加灵活。在命令模式中,会将一个命令封装成一个对象,同时命令模式也支持可撤销的操作。
命令里面通常聚合接收者,初始化命令时传入接收者,调用者直接调用命令即可
二、实现
这里使用Unity上下左右控制物体移动同时记录移动信息方便撤回为例子演示命令模式
1.ICommand
命令接口基类
public interface ICommand
{void Execute();void UnExecute();
}
2.MoveCommand
具体的移动命令
class MoveCommand : ICommand
{private MoveDirection _direction;private MoveCommandReceiver _receiver;private float _distance;private GameObject _gameObject;//Constructorpublic MoveCommand(MoveCommandReceiver reciever, MoveDirection direction, float distance,GameObject gameObjectToMove){this._receiver = reciever;this._direction = direction;this._distance = distance;this._gameObject = gameObjectToMove;}//Execute new commandpublic void Execute(){_receiver.MoveOperation(_gameObject, _direction, _distance);}//Undo last commandpublic void UnExecute(){_receiver.MoveOperation(_gameObject, InverseDirection(_direction), _distance);}//invert the direction for undoprivate MoveDirection InverseDirection(MoveDirection direction){switch (direction){case MoveDirection.up:return MoveDirection.down;case MoveDirection.down:return MoveDirection.up;case MoveDirection.left:return MoveDirection.right;case MoveDirection.right:return MoveDirection.left;default:Debug.LogError("Unknown MoveDirection");return MoveDirection.up;}}//So we can show this command in debug output easilypublic override string ToString(){return _gameObject.name + " : " + MoveDirectionString(_direction) + " : " + _distance.ToString();}//Convert the MoveDirection enum to a string for debugpublic string MoveDirectionString(MoveDirection direction){switch (direction){case MoveDirection.up:return "up";case MoveDirection.down:return "down";case MoveDirection.left:return "left";case MoveDirection.right:return "right";default:return "unkown";}}
}
3.MoveCommandReceiver
命令接收者
class MoveCommandReceiver{public void MoveOperation(GameObject gameObjectToMove, MoveDirection direction, float distance){switch (direction){case MoveDirection.up:MoveY(gameObjectToMove, distance);break;case MoveDirection.down:MoveY(gameObjectToMove, -distance);break;case MoveDirection.left:MoveX(gameObjectToMove, -distance);break;case MoveDirection.right:MoveX(gameObjectToMove, distance);break;}}private void MoveY(GameObject gameObjectToMove, float distance){Vector3 newPos = gameObjectToMove.transform.position;newPos.y += distance;gameObjectToMove.transform.position = newPos;}private void MoveX(GameObject gameObjectToMove, float distance){Vector3 newPos = gameObjectToMove.transform.position;newPos.x += distance;gameObjectToMove.transform.position = newPos;}}
4.命令的发出者(或者说是图中Clinet)
这里将命令发出者和Client放到了一起
public class InputHandler : MonoBehaviour
{public float moveDistance = 10f;public GameObject objectToMove;private MoveCommandReceiver moveCommandReciever;private Stack<MoveCommand> commandStack1 = new Stack<MoveCommand>();private Stack<MoveCommand> commandStack2 = new Stack<MoveCommand>();void Start(){moveCommandReciever = new MoveCommandReceiver();if (objectToMove == null){Debug.LogError("objectToMove must be assigned via inspector");this.enabled = false;}}public void Undo(){if (commandStack1.Count > 0){MoveCommand moveCommand = commandStack1.Pop();moveCommand.UnExecute();commandStack2.Push(moveCommand);}}public void Redo(){if (commandStack2.Count > 0){MoveCommand moveCommand = commandStack2.Pop();moveCommand.Execute();commandStack1.Push(moveCommand);}}private void Move(MoveDirection direction){MoveCommand moveCommand = new MoveCommand(moveCommandReciever, direction, moveDistance, objectToMove);moveCommand.Execute();commandStack1.Push(moveCommand);}//Simple move commands to attach to UI buttonspublic void MoveUp() { Move(MoveDirection.up); }public void MoveDown() { Move(MoveDirection.down); }public void MoveLeft() { Move(MoveDirection.left); }public void MoveRight() { Move(MoveDirection.right); }void Update(){if (Input.GetKeyDown(KeyCode.UpArrow)){MoveUp();}if (Input.GetKeyDown(KeyCode.DownArrow)){MoveDown();}if (Input.GetKeyDown(KeyCode.LeftArrow)){MoveLeft();}if (Input.GetKeyDown(KeyCode.RightArrow)){MoveRight();}if (Input.GetKeyDown(KeyCode.R)){Redo();}if (Input.GetKeyDown(KeyCode.U)){Undo();}}
}
相关文章:
Unity实现设计模式——命令模式
Unity实现设计模式——命令模式 推荐一个Unity学习设计模式很好的GitHub地址:https://github.com/QianMo/Unity-Design-Pattern 有非常多的Star 一、介绍 命令模式使得请求的发送者与请求的执行者之间消除耦合,让对象之间的调用关系更加灵活。在命令模…...
四、YApi的安装和配置
YApi是去哪儿网的前端技术中心的一个开源可视化接口管理平台。 创建接口项目 创建接口 编写接口...
JAVA学习(2)-全网最详细~
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
MySQL学习笔记27
MySQL主从复制的核心思路: 1、slave必须安装相同版本的mysql数据库软件。 2、master端必须开启二进制日志,slave端必须开启relay log 日志。 3、master主服务器和slave从服务器的server-id号不能一致。 4、slave端配置向master端来同步数据。 master…...
数据结构与算法之字典: Leetcode 76. 最小覆盖子串 (Typescript版)
最小覆盖子串 https://leetcode.cn/problems/minimum-window-substring/description/ 描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意: 对于 t 中重…...
2023-10-03 VsCode诡异消失事件
VsCode诡异消失事件 前言一、排查问题二、原因分析三、其它可能不好的倾向总结 前言 今天打开电脑, 习惯性的打开VsCode, 收到错误消息, 该快捷方式所指向的项目Code.exe已经更改或移动, 因此该快捷方式无法正常工作. 是否删除该快捷方式. 一、排查问题 打开快捷方式指向的位…...
elementPlus表格组件el-table实现只能同时选择一行,全选按第一行处理
目录 需求背景: 具体实现: 模板代码: 函数处理代码: 代码讲解: 需求背景: 点击表格最左侧的复选框列,选中当前表格行,而且只允许选择一行,选中一行后,其…...
栈的应用场景(三)
最小栈 1.题目2.画图分析3.代码实现 1.题目 2.画图分析 3.代码实现 package Stack;import java.util.Stack; public class MinStack {private Stack <Integer> stack;private Stack <Integer> MinStack;public MinStack() {stack new Stack<>();MinStack …...
leetCode 45.跳跃游戏 II 贪心算法
45. 跳跃游戏 II - 力扣(LeetCode) 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 &…...
【MATLAB-基于直方图优化的图像去雾技术】
【MATLAB-基于直方图优化的图像去雾技术】 1 直方图均衡2 程序实现3 局部直方图处理 1 直方图均衡 直方图是图像的一种统计表达形式。对于一幅灰度图像来说,其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言,图像的视觉效果和其直方…...
读书笔记|《数据压缩入门》—— 柯尔特·麦克安利斯 亚历克斯·海奇
前言:在接触文本隐写研究领域时了解到这本书。本书可算作《数据压缩》的入门书籍之一,这本书对熵编码、变长编码、统计编码、自适应统计编码、字典编码、上下文编码等常用编码方式的定义及来源进行介绍,对不同场景下不同格式的压缩数据有针对…...
Pandas进阶修炼120题-第五期(一些补充,101-120题)
目录 往期内容:第一期:Pandas基础(1-20题)第二期:Pandas数据处理(21-50题)第三期:Pandas金融数据处理(51-80题)第四期:当Pandas遇上NumPy…...
NPDP产品经理知识(产品创新管理)
复习文化,团队与领导力 产品创新管理: 如何树立愿景: 如何实现产品战略 计划 实施产品开发: 商业化,营销计划,推广活动 管理产品生命周期: 新式走向市场的流程:...
Flutter+SpringBoot实现ChatGPT流实输出
FlutterSpringBoot实现ChatGPT流式输出、上下文了连续对话 最终实现Flutter的流式输出上下文连续对话。 这里就是提供一个简单版的工具类和使用案例,此处页面仅参考。 服务端 这里直接封装提供工具类,修改自己的apiKey即可使用,支持连续…...
淘宝天猫粉丝福利购店铺优惠券去哪里找到领取网站?
淘宝天猫优惠券去哪里找到领取网站? 领取淘宝天猫粉丝福利购优惠券可通过百度搜索:草柴,进入草柴官方网站 或 手机应用商店搜索:草柴,下载安装草柴APP,就可以领取淘宝天猫优惠券; 草柴APP如何领…...
【考研复习】union有关的输出问题
文章目录 遇到的问题正确解答拓展参考文章 遇到的问题 首次遇到下面的代码时,感觉应该输出65,323。深入理解union的存储之后发现正确答案是:67,323. union {char c;int i; } u; int main(){u.c A;u.i 0x143;printf("%d,%d\n", u.c, u.i); …...
Android学习之路(16) Android 数据库Litepal
一.LitePal的介绍 Litepal是Android郭霖大神的一个开源Android数据库的开源框架,它采用了对象关系映射(ORM)的模式,这是让我们非常好的理解的数据库,一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法&a…...
Redis持久化(RDB/AOF)
"在哪里走散,你都会 找 到 我。" 认识持久化 我们在接触Mysql事务的时候,一定了解过Mysql事务的四个特性: "原子性(A)一致性(C)隔离性(I)持久性(D)" 而其中持久性其实与持久化是一回事,所谓持久与不持久&#x…...
小谈设计模式(15)—观察者模式
小谈设计模式(15)—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject(被观察者)ConcreteSubject(具体被观察者)Observer(观察者)ConcreteObserver࿰…...
简单工厂模式 创建型模式(非GoF经典设计模式)
简单工厂模式是属于创建型模式,也因为工厂中的方法一般设置为静态,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工…...
PE文件之导入表
1. 导入表 2. 显示导入表信息的例子 ; 作用: 将RVA地址转成FOA即文件偏移 ; 参数: _pFileHdr 指向读到内存中文件的基址指针 ; _dwRVA 目标RVA地址 ; 返回: 目标RVA转成文件偏移的值 RVA2FOA PROC USES esi edi edx, _pFileHdr:PTR BYTE, _dwRVA:DWORDmov esi, _pFil…...
二、码制及其转换
原码 根据我们所学可知,数字电路的逻辑电路是通过输出0和1来表示二进制数的,那么这个二进制数的正负又该怎么表示呢? 答案是在这个二进制数的最高位作为符号位来表示正负性,用0正数,用1表示负数,在这种表达…...
在pycharm中出现下载软件包失败的解决方法
一. 一般情况下我们会选择在设置中下载软件包,过程如下. 1. 直接点击左上角的文件, 再点击设置, 再点击项目, 在右边选择python解释器,点击号,输入要下载的软件包, 在下面的一系列的包中选择相对应的包,点击安装就可以了,有的时候我们下载的是最新的版本,如果要下载固定的版本…...
10.0 探索API调试事件原理
本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者…...
文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题
二、用go语言,说明如何在一个数组 A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者都不会发生上溢。要求 PUSH 和 POP 操作的运行时间为 O(1)。 文心一言: 在这个问题中,我们要在一个数组 A[1…n] 中…...
检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)
VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…...
vtk 动画入门 1 代码
实现效果如图: #include <vtkAutoInit.h> //VTK_MODULE_INIT(vtkRenderingOpenGL2); //VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); //VTK_MODULE_INIT(vtkRenderingFreeType); #in…...
【VR】【unity】如何在VR中实现远程投屏功能?
【背景】 目前主流的VD应用,用于娱乐很棒,但是用于工作还是无法效率地操作键鼠。用虚拟键盘工作则显然是不现实的。为了让自己的头显能够起到小面积代替多显示屏的作用,自己动手开发投屏VR应用。 【思路】 先实现C#的投屏应用。研究如何将C#投屏应用用Unity 3D项目转写。…...
OpenGl材质
在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter),因而产生较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的…...
背包问题
目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…...
企业应该找什么样的网站建设公司/自己在家怎么做电商
数据协商的概念 客户端发送请求给服务端,客户端会声明请求希望拿到的数据的格式和限制,服务端会根据请求头信息,来决定返回的数据。 分类 请求 Accept 返回 Content Accept Accept 声明想要数据的类型 Accept-Encoding 数据以哪种编码方式传输…...
下列属于b2b电子商务网站的是/外贸网站哪个比较好
本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证都不在话下。 当然对于爬虫来说,有了它,我们从 HTML 里面提取我…...
wordpress汉化视频模板/百度手机助手下载安装最新版
Java-odbc-000-连接、插入、查询、修改、删除-2020-6-25 目录提示零、最终效果一、准备二、ListDB.java三、SQLDB.java提示 运行环境jdk1.6 零、最终效果 一、准备 ①sample.mdb(利用微软的access) ②管理工具->ODBC数据管理程序(32位)//虽然我电脑是64位->用户DSN-&…...
专业网站制作公司/交换友情链接的注意事项
昨天,中国教育学会会长顾明远来杭州,参加杭州师范大学主办的第九届亚洲比较教育学会年会。会上,他对本报记者确认,全国执行高考新方案,不会在2016年,而是2017年。语文、数学在新高考里,份量加重…...
wordpress 空间推荐/网络营销的工具和方法
多年以后,面对办公室的屏幕,我会回忆起开始肝第二周OO作业的那个遥远的下午。那时的程序是一个一两百行的符号求导,基类与接口在包里一字排开,工整的注释一望到底 谁能想到,接下来的十几个小时我要经历什么样的噩梦&am…...
成都商城网站制作/seo发外链的网站
知乎首发,超全学习算法&数据结构干货:0基础入门算法面试提升指南!不废话,直接上干货!★本文将从以下3个方面告诉你:一、新手怎么快速入门算法基础——【0基础学习算法】二、如何拔高算法技能࿰…...