本文实例为大家分享了Unity3D撤回命令功能开发,供大家参考,具体内容如下

在类似操作考核的项目中我们经常会遇到回到上一步的需求。所以我们有必要对每一个状态点的所有参与交互的物体的状态进行记录。好了,下面就是代码的实现:

首先肯定要创建命令的基类,

public class BaseCommand { //执行命令 public virtual void ExcuteCommand() { } //撤销命令 public virtual void RevocationCommand() { } }

因为我们控制物体的类似移动改变方式不同,有可能是直接移动的,有可能是用的dotween来操作移动,所以我们的执行命令函数可能对于我们没有实现的必要。下面我们要创建一个用来管理命令的脚本,供我们添加和移除命令,同时这个脚本我们给设置为单例,可供全局调用。如下:

public class CommandManager : MonoBehaviour { public static CommandManager Instance = null; //管理命令 private Stack commandStack = new Stack(); private void Awake() { Instance = this; } //增加命令 public void AddCommand(BaseCommand baseCommand) { commandStack.Push(baseCommand); } //移除命令 并且撤销一步操作 public void RemoveCommand() { if(commandStack.Count>0) { BaseCommand baseCommand = commandStack.Pop(); baseCommand.RevocationCommand(); } } }

有个命令基类,有了管理类,下面我们就要对不同命令进行专门的功能实现了。

一.移动类命令

//保存模型的位置 角度 大小信息 public class TransformCommand : BaseCommand { private Transform target; private Vector3 pos; private Vector3 rota; private Vector3 scale; private Transform parent; //我们在构造函数里直接传进来我们改变状态前的Transform信息 public TransformCommand(Transform target, Vector3 pos, Vector3 rota, Vector3 scale,Transform parent) { this.target = target; this.pos = pos; this.rota = rota; this.scale = scale; this.parent = parent; } public override void ExcuteCommand() { base.ExcuteCommand(); } public override void RevocationCommand() { target.SetParent(parent); target.transform.localPosition = pos; target.transform.localEulerAngles = rota; target.transform.localScale = scale; } }

下面是我们写的测试脚本挂在到摄像头上,

public class CameraMove : MonoBehaviour { // Update is called once per frame void Update () { if(Input.GetKeyDown(KeyCode.W)) { TransformCommand cmd = new TransformCommand(transform,transform.localPosition, transform.localEulerAngles,transform.localScale,null); CommandManager.Instance.AddCommand(cmd); transform.Translate(Vector3.forward,Space.Self); } } }

还需要写一个输入的类来调用撤退命令,代码如下:

public class Test : MonoBehaviour { private void Update() { if(Input.GetKeyDown(KeyCode.Escape)) { CommandManager.Instance.RemoveCommand(); } } }

二.UI类用户控制改变状态

下面以InputField为例,介绍UI交互类的撤退命令,这个要比普通的麻烦一些。我找了官方文档好久也没发现值改变前得回掉函数,所以只能自己来实现了。首先我们要自己写一个脚本用来记录改变之前的值。挂载在场景里的InputField上。代码如下:

public class MyInputField : MonoBehaviour,IPointerClickHandler { private InputField input; private string preString;//用来记录改变前得值 private bool IsValueChange = false;//判断值是否发生改变 private bool IsClick = false;//用来判断InputField是否被选中交互 private void Awake() { input = GetComponent(); input.onValueChanged.AddListener(delegate { IsValueChange=true; }); input.onEndEdit.AddListener(OnEndEditCallBck); } //结束编辑得回调函数 void OnEndEditCallBck(string content) { IsClick = false; //如果值没变 直接返回 没必要增加命令 if (IsValueChange == false) return; InputFieldCommand cmd = new InputFieldCommand(input,preString); CommandManager.Instance.AddCommand(cmd); } //当被点击时,我们的UI组件被交互 有被更改值得可能 所以要记录当前值 public void OnPointerClick(PointerEventData eventData) { Debug.Log("点击"); if (IsClick) return; preString = input.text; IsClick = true; } } public class InputFieldCommand : BaseCommand { private InputField targetInput; private string content; public InputFieldCommand(InputField inputField,string content) { this.targetInput = inputField; this.content = content; } public override void RevocationCommand() { base.RevocationCommand(); targetInput.text = content; } }

上面就是在用户对InputField输入内容改变时自动记录上一步得命令。对于其他得UI组件类似Toggle Slider同样适用。

三.销毁生成的物体

我们在当前一步实例化很多物体,返回上一步就需要销毁所有实例化的物体。这里我们不建议直接销毁,而是利用对象池技术进行回收,还节约性能。对象池技术博客地址:点击打开链接  代码如下:

public class DestoryCommand : BaseCommand { private List objects; public DestoryCommand(List objects) { this.objects = objects; } public override void RevocationCommand() { for(int i=0;i< objects.Count;i++) { //利用对象池技术回收物体 这里就不写了 因为还要把对象池的脚本添加进来 } } }

这个命令是在我们实例化物体后才能增加。其实就是把实例化的物体加入到List数组然后传入一个新声明的DestoryCommand构造函数中。以上效果图如下:

希望本博客对你有帮助!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。

unity撤销上一步_Unity3D撤回命令开发详解|chu相关推荐

  1. linux上传文件命令ftp put,Linux ftp 命令行中下载文件get与上传文件put的命令应用详解...

    介绍:从本地以用户anok登录的机器192.168.0.16上通过ftp远程登录到192.168.0.6的ftp服务器上,登录用户名是peo.以下为使用该连接做的实验. 查看远程ftp服务器上用户pe ...

  2. linux get与put,科技常识:Linux ftp 命令行中下载文件get与上传文件put的命令应用详解...

    今天小编跟大家讲解下有关Linux ftp 命令行中下载文件get与上传文件put的命令应用详解 ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关Linux ftp 命令行中下载文件get与 ...

  3. linux中代码挂上n,Linux系统常用命令nl详解(示例代码)

    nl命令在linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号!其默认的结果与cat -n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能.本文 ...

  4. matlab撤销上一步命令_CAD快速入门技巧:CAD软件中撤销操作的方法汇总

    在使用浩辰CAD软件画图的过程中都难免会误操作,因此CAD与WORD.EXCEL等其他软件一样,在误操作后可以通过"放弃"来取消刚进行的操作,Windows软件的常规操作也适用于C ...

  5. java撤销上一步_CAD快速入门技巧:CAD软件中撤销操作的方法汇总

    在使用浩辰CAD软件画图的过程中都难免会误操作,因此CAD与WORD.EXCEL等其他软件一样,在误操作后可以通过"放弃"来取消刚进行的操作,Windows软件的常规操作也适用于C ...

  6. python写错了如何撤销-Python集成开发工具Pycharm的使用方法:复制,撤销上一步.......

    复制行,在代码行光标后,输入Ctrl + d ,即为复制一行,输入多次即为复制多行 撤销上一步操作:Ctrl + z 为多行代码加注释# 代码选中的条件下,同时按住 Ctrl+/,被选中行被注释,再次 ...

  7. vi 撤销上一步操作

    在vi中按u可以撤销一次操作 u   撤销上一步的操作       Ctrl+r 恢复上一步被撤销的操作

  8. 计算机怎么恢复上一步,电脑怎么撤销上一步操作

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 电脑撤销上一步操作的方法如下: 1.按CTRL加Z可以撤销上一次的操作. 2.常用的恢复数据的有EasyRecovery Prof ...

  9. CAD二次开发之撤销上一步(Undo)

    一.背景 小伙伴们在做CAD二次开发时,是否需要在代码中撤销上一步动作呢? 二.实现代码 Editor ed = Application.DocumentManager.MdiActiveDocume ...

最新文章

  1. 【FPGA】SRIO例子程序仿真分析实践
  2. windows下查看dns缓存和刷新缓存
  3. 加州大学新算法:让智能汽车更精准检测行人
  4. 你以为的BUG--BFC给你解决!
  5. 深度神经网络模型压缩方法总结
  6. 【白话科普】上网时遇到的 404 是什么意思?
  7. String实例化两种方式的区别
  8. [转载] 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)
  9. chm文件打开出现已取消该网页的导航
  10. 787. K 站中转内最便宜的航班
  11. 0.1+0.2 等于 0.3 吗?
  12. Android 客户端与服务器端时间校准
  13. Python 碎碎念 -- 不定期记录遇到的各种小问题(藤原豆腐坊自家用)
  14. 中国小三多,是因为女人缺乏精神上的独立,男人缺乏人格上的体面。
  15. Android内存原理
  16. 【man】getsockopt 和 setsockopt
  17. 阿德莱德计算机科学学士好吗,阿德莱德大学哪个专业好
  18. gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计
  19. tex 表格中内容左对齐/居中/右对齐
  20. python取余什么意思_python取余运算符是什么?

热门文章

  1. EMP v5.3 技术白皮书
  2. 折腾本身就是一种精进修行
  3. 网神保障中国中化集团公司核心业务安全
  4. error: No rule to make target '/usr/lib/libOpenNI.so', needed by 'bin/euroc_rectify'。 停止。
  5. 教你怎样煮鸡蛋 煮软蛋 煮溏心蛋
  6. makefile传字符串给c语言,makefile终极奥义
  7. Python学习笔记(十九)——Matplotlib入门
  8. HDU - 4737 A Bit Fun 暴力水题
  9. dlib库 眨眼 张嘴
  10. nginx配置web项目外网访问