介绍
如何在Unity3D中使用撤回命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
首先肯定要创建命令的基类,
public class BaseCommand { , ,//执行命令 ,public virtual void  ExcuteCommand (), {,} , , ,//撤销命令 ,public virtual void  RevocationCommand (), {,} , }
因为我们控制物体的类似移动改变方式不同,有可能是直接移动的,有可能是用的dotween来操作移动,所以我们的执行命令函数可能对于我们没有实现的必要的。下面我们要创建一个用来管理命令的脚本,供我们添加和移除命令,同时这个脚本我们给设置为单例,可供全局调用。如下:
public class CommandManager : MonoBehaviour { ,public static  CommandManager Instance =,空; ,//管理命令 ,private StackcommandStack =, new Stack (); , ,private void 清醒() ,{ 时间=Instance 才能;; ,} , , ,//增加命令, ,public void  AddCommand (BaseCommand baseCommand) ,{ commandStack.Push才能(baseCommand); ,} , , ,//移除命令,并且撤销一步操作 ,public void  RemoveCommand () ,{ 如果才能(commandStack.Count> 0) {才能 ,,BaseCommand BaseCommand =, commandStack.Pop (); ,,baseCommand.RevocationCommand (); ,,} ,} }
有个命令基类,有了管理类、下面我们就要对不同命令进行专门的功能实现了。
<强>一。移动类命令强>
//保存模型的位置,角度,大小信息 public class TransformCommand : BaseCommand { ,private Transform 目标; ,private Vector3 pos; ,private Vector3 轮值表; ,private Vector3 规模; ,private Transform 家长;//我们在构造函数里直接传进来我们改变状态前的变换信息 ,public TransformCommand (Transform 目标,Vector3 pos,, Vector3 罗,Vector3 规模,Transform 父母) ,{ 时间=this.target 才能;目标; 时间=this.pos 才能;pos; this.rota 才能=,轮值表; 时间=this.scale 才能;规模; 时间=this.parent 才能;家长; ,} , ,public override void  ExcuteCommand () ,{ base.ExcuteCommand才能(); ,} , ,public override void  RevocationCommand () ,{ target.SetParent才能(父); 时间=target.transform.localPosition 才能;pos; target.transform.localEulerAngles 才能=,轮值表; 时间=target.transform.localScale 才能;规模; ,} }
下面是我们写的测试脚本挂在到摄像头上,
public class CameraMove :, MonoBehaviour { , , ,//Update is  nbsp; once per 框架 ,void Update () ,{ 如果才能(Input.GetKeyDown (KeyCode.W)) {才能 ,,TransformCommand cmd =, new TransformCommand(变换,transform.localPosition, ,,,transform.localEulerAngles, transform.localScale,零); ,,CommandManager.Instance.AddCommand (cmd); ,,transform.Translate (Vector3.forward Space.Self); ,,} ,} }
还需要写一个输入的类来调用撤退命令,代码如下:
public class Test :, MonoBehaviour { , ,private void 更新() ,{ 如果才能(Input.GetKeyDown (KeyCode.Escape)) {才能 ,,CommandManager.Instance.RemoveCommand (); ,,} ,} }
<强>二。UI类用户控制改变状态强>
下面以InputField为例,介绍UI交互类的撤退命令,这个要比普通的麻烦一些。我找了官方文档好久也没发现值改变前得回掉函数,所以只能自己来实现了。首先我们要自己写一个脚本用来记录改变之前的值。挂载在场景里的InputField上。代码如下:
public class MyInputField : MonoBehaviour, IPointerClickHandler { ,private InputField 输入; ,private string  preString;//用来记录改变前得值 , ,private bool IsValueChange =,假;//判断值是否发生改变 , ,private bool IsClick =,假;//用来判断InputField是否被选中交互 , , , ,private void 清醒() ,{ 时间=input 才能;GetComponent如何在Unity3D中使用撤回命令