Unity中使用命令模式,实现撤销、回放的操作

本文介绍了如何在Unity中运用命令模式来实现撤销和回放用户操作的功能。通过创建命令基类及具体命令类,如InputFieldCommand和PlayerCommand,记录并执行或撤销特定操作。命令收集者CommandManager负责管理和执行命令,从而达到松耦合的效果,便于实现撤销和回放机制。
摘要由CSDN通过智能技术生成

Unity中使用命令模式,实现撤销、回放的操作

设计模式

关于命令模式,我这里就不再做过多详解了,网上随便一搜都会有很多的文章,所以我就直接进入今天的正题,在Unity中如何将命令模式的这种思想展现出来。


首先,我们的目的是要用户能够撤销他所做的任何操作,或者是在完成之后可以回放自己所做的每一步操作,这样的话根据万物皆对象的思想,将用户的每一步操作,比如“输入用户名”“点击地面移动”等,都抽象为一个个真实存在的对象,每个对象会记录每条命令所牵连的所有属性,那么在需要撤销或是回放时,根据这个对象的属性还原操作就可以了。


当然,更安全的方式并不是直接还原操作,而且根据对象记录的属性克隆出新的对象,因为如果当用户删掉了某一个物体,下一刻他要执行撤销时,会发现那个物体的对象已不存在,这样的话撤销操作就会出现找不到对象的问题,所以根据克隆对象的方式,当用户删掉物体再还原时,我们并非还原他原本的那个物体,而是根据操作记录里面记载的对象删除前的属性重新克隆一个物体。


好了,首先,我们先定义一个所有命令的基类,我们知道的是,每个命令有且只会有两个操作:执行命令或撤销命令,我们可以在基类中描述,但具体的实现细节交由派生类自己来处理,毕竟每种命令撤销的方式不一样。


[csharp] view plain copy print ?
  1. public class BaseCommand : object  
  2. {  
  3.     //命令描述  
  4.     private string _commandDescribe;  
  5.     public string CommandDescribe  
  6.     {  
  7.         set {  
  8.             _commandDescribe = value;  
  9.         }  
  10.         get {  
  11.             return _commandDescribe;  
  12.         }  
  13.     }  
  14.   
  15.     //执行命令  
  16.     public virtual void ExecuteCommand()  
  17.     {  
  18.     }  
  19.   
  20.     //撤销命令  
  21.     public virtual void RevocationCommand()  
  22.     {  
  23.     }  
  24. }  
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的输入值,所以将之纳为命令的收集目标即可。


[csharp] view plain copy print ?
  1. using UnityEngine.UI;  
  2. /// <summary>  
  3. /// InputField操作的命令  
  4. /// </summary>  
  5. public class InputFieldCommand : BaseCommand  
  6. {  
  7.     #region 命令操作、撤销所涉及到的属性  
  8.     //目标  
  9.     private InputField _commandTarget;  
  10.     //目标的值  
  11.     private string _commandValue;  
  12.     #endregion  
  13.   
  14.     public InputFieldCommand(InputField commandTarget, string commandValue, string commandDescribe)  
  15.     {  
  16.         _commandTarget = commandTarget;  
  17.         _commandValue = commandValue;  
  18.         CommandDescribe = commandDescribe;  
  19.     }  
  20.   
  21.     /// <summary>  
  22.     /// 执行命令  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值