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

优缺点

优点:

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

小结

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

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