1. 程式人生 > 其它 >【unity】命令模式

【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依次執行,結果如下

優缺點

優點:

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

小結

值得一提的是,命令模式尤為契合某些卡牌遊戲的需求,採取該模式進行設計開發,可以很大程度上降低開發難度。