【unity】命令模式
阿新 • • 發佈:2022-04-06
引子
為什麼需要命令模式?
開發時,我們可能遇到某些特殊的需求,比如對某些步驟進行記錄、撤銷等。這種情況下,我們可以使用命令模式,將請求封裝成物件,實現"行為請求者"與"行為實現者"之間的鬆耦合。
實現
定義一個命令的抽象基類 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依次執行,結果如下
優缺點
優點:
- 降低了系統的耦合度。
- 易於拓展新的命令。
小結
值得一提的是,命令模式尤為契合某些卡牌遊戲的需求,採取該模式進行設計開發,可以很大程度上降低開發難度。