【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 orders = new Queue();

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依次执行,结果如下
image

优缺点

优点:

  1. 降低了系统的耦合度。
  2. 易于拓展新的命令。

小结

值得一提的是,命令模式尤为契合某些卡牌游戏的需求,采取该模式进行设计开发,可以很大程度上降低开发难度。

posted @ 2022-04-06 20:39  AshScops  阅读(115)  评论(0)    收藏  举报