【unity】命令模式
引子
为什么需要命令模式?
开发时,我们可能遇到某些特殊的需求,比如对某些步骤进行记录、撤销等。这种情况下,我们可以使用命令模式,将请求封装成对象,实现"行为请求者"与"行为实现者"之间的松耦合。
什么是命令模式
将一个请求封装为一个对象(命令),使发出命令与执行命令的类分开。
实现
定义一个命令的抽象基类 BaseOrder
public abstract class BaseOrder
{
public abstract void Execute();
}
编写一些命令类,使其继承于 BaseOrder
Attack类
using UnityEngine;
public class Attack : BaseOrder
{
public override void Execute()
{
Debug.Log("Player enter attack state");
}
}
Defense类
using UnityEngine;
public class Defense : BaseOrder
{
public override void Execute()
{
Debug.Log("Player enter defense state");
}
}
编写命令发送类 Sender
using UnityEngine;
public class Sender : MonoBehaviour
{
public Receiver receiver;
private void Update() {
SendOrders();
}
private void SendOrders()
{
if(Input.GetKeyDown(KeyCode.A))
receiver.ReceiveSingleOrder(new Attack());
if(Input.GetKeyDown(KeyCode.D))
receiver.ReceiveSingleOrder(new Defense());
}
}
编写命令接收类 Receiver ,我这里创建了一个队列,用于按顺序存放 Sender 发送的命令,在必要时依次出队列并执行命令
using System.Collections.Generic;
using UnityEngine;
public class Receiver : MonoBehaviour
{
private Queue<BaseOrder> orders = new Queue<BaseOrder>();
private void Update() {
ExecuteSingleOrder();
}
public void ReceiveSingleOrder(BaseOrder o)
{
orders.Enqueue(o);
}
public void ExecuteSingleOrder()
{
if(Input.GetKeyDown(KeyCode.E))
orders.Dequeue().Execute();
}
}
运行后,依次按下AAD发送命令,再按下EEE依次执行,结果如下
优缺点
优点:
- 降低了系统的耦合度。
- 易于拓展新的命令。
小结
值得一提的是,命令模式尤为契合某些卡牌游戏的需求,采取该模式进行设计开发,可以很大程度上降低开发难度。