如何在Unity3D中使用撤回命令

  介绍

如何在Unity3D中使用撤回命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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

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

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

public  class  CommandManager : MonoBehaviour   {   ,public  static  CommandManager  Instance =,空;   ,//管理命令   ,private  Stack commandStack =, 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中使用撤回命令