Unity中使用命令模式,实现撤销、回放的操作
设计模式版权声明:本文为博主原创文章,未经博主允许不得转载。
关于命令模式,我这里就不再做过多详解了,网上随便一搜都会有很多的文章,所以我就直接进入今天的正题,在Unity中如何将命令模式的这种思想展现出来。
首先,我们的目的是要用户能够撤销他所做的任何操作,或者是在完成之后可以回放自己所做的每一步操作,这样的话根据万物皆对象的思想,将用户的每一步操作,比如“输入用户名”“点击地面移动”等,都抽象为一个个真实存在的对象,每个对象会记录每条命令所牵连的所有属性,那么在需要撤销或是回放时,根据这个对象的属性还原操作就可以了。
当然,更安全的方式并不是直接还原操作,而且根据对象记录的属性克隆出新的对象,因为如果当用户删掉了某一个物体,下一刻他要执行撤销时,会发现那个物体的对象已不存在,这样的话撤销操作就会出现找不到对象的问题,所以根据克隆对象的方式,当用户删掉物体再还原时,我们并非还原他原本的那个物体,而是根据操作记录里面记载的对象删除前的属性重新克隆一个物体。
好了,首先,我们先定义一个所有命令的基类,我们知道的是,每个命令有且只会有两个操作:执行命令或撤销命令,我们可以在基类中描述,但具体的实现细节交由派生类自己来处理,毕竟每种命令撤销的方式不一样。
- public class BaseCommand : object
- {
- //命令描述
- private string _commandDescribe;
- public string CommandDescribe
- {
- set {
- _commandDescribe = value;
- }
- get {
- return _commandDescribe;
- }
- }
- //执行命令
- public virtual void ExecuteCommand()
- {
- }
- //撤销命令
- public virtual void RevocationCommand()
- {
- }
- }
public class BaseCommand : object
{
//命令描述
private string _commandDescribe;
public string CommandDescribe
{
set {
_commandDescribe = value;
}
get {
return _commandDescribe;
}
}
//执行命令
public virtual void ExecuteCommand()
{
}
//撤销命令
public virtual void RevocationCommand()
{
}
}
然后我们针对不同的对象,定制各自的命令类,这里我暂时只针对UGUI的InputField和角色Player进行命令收集,通过命令收集者来监听对象的一举一动,记录每一条命令的属性,比如InputField的操作,我们需要的属性也就只有一个,那就是InputField的输入值,所以将之纳为命令的收集目标即可。
- using UnityEngine.UI;
- /// <summary>
- /// InputField操作的命令
- /// </summary>
- public class InputFieldCommand : BaseCommand
- {
- #region 命令操作、撤销所涉及到的属性
- //目标
- private InputField _commandTarget;
- //目标的值
- private string _commandValue;
- #endregion
- public InputFieldCommand(InputField commandTarget, string commandValue, string commandDescribe)
- {
- _commandTarget = commandTarget;
- _commandValue = commandValue;
- CommandDescribe = commandDescribe;
- }
- /// <summary>
- /// 执行命令