本文由 簡悅 SimpRead 轉碼, 原文地址 mp.weixin.qq.com
在 unity 游戲設計中,觀察者模式(Observer Pattern)有著重要的作用,它主要用于實現對象之間的一對多的依賴關系,當一個對象的狀態發生變化時,所有依賴于它的對象都得到通知并自動更新。
觀察者模式在游戲設計中有幾個重要的作用:
松耦合(Loose Coupling): 觀察者模式幫助實現了對象之間的松耦合關系。主題和觀察者之間沒有直接的依賴關系,使得它們能夠獨立地演化。這使得游戲系統更容易擴展和修改,因為一個對象的改變不會直接影響到其他對象。
事件處理: 在游戲中,有許多事件(例如玩家輸入、游戲狀態變化、玩家死亡等)。觀察者模式使得不同的游戲元素能夠訂閱并響應這些事件,從而實現更靈活的事件處理機制。
實時通知: 觀察者模式允許在主題狀態變化時實時通知所有觀察者。這對于實時性要求高的游戲系統非常重要,例如當一個敵人被擊敗時,所有相關的元素都能夠及時做出響應。
解耦主題和觀察者: 主題和觀察者之間的解耦使得系統更易于維護。如果需要添加新的觀察者或改變觀察者的行為,可以做到不影響主題的實現,從而降低了代碼的復雜性。
舉個例子:
傳統方式:
當玩家 HP<=0 時,要調用動畫、音效、存檔,每個系統都要在玩家類里引用,需要調用一系列方法。耦合性高、代碼難以維護。
一個代碼里耦合了多個系統。
//玩家死亡
void PlayerDead()
{// 播放死亡動畫AnimationSystem.PlayDeathAnimation();// 播放死亡音效SoundSystem.PlayDeathSound();// 存檔系統記錄SaveSystem.SaveGame();
}
觀察者模式:
在 unity 中可以通過 c# 委托函數實現觀察者模式。
// 定義委托
public delegate void PlayerDeathEvent();
// 被觀察者(事件源)
public class Observer : MonoBehaviour
{// 委托事件,將需要觸發的一系列事件+=進來public static event PlayerDeathEvent OnPlayerDeath;//點擊按鈕模擬玩家死亡,玩家死亡就是一個事件//一個事件會觸發多個事件Button btn;void Start(){btn = GetComponent<Button>();// 當按鈕點擊時(玩家死亡),觸發委托事件,//點擊后會觸發+=進來的一系列事件:動畫處理、音效處理、存檔處理btn.onClick.AddListener(() =>{if (OnPlayerDeath != null){OnPlayerDeath();}});}
}// 具體的觀察者類
public class AnimationSystem : MonoBehaviour
{void Start(){// 注冊觀察者事件,在PlayerDeathEvent里面加入需要觸發的一系列事件Observer.OnPlayerDeath += PlayDeathAnimation;}void PlayDeathAnimation(){// 處理動畫系統邏輯}
}// 具體的觀察者類
public class SoundSystem : MonoBehaviour
{void Start(){// 注冊觀察者Observer.OnPlayerDeath += PlayDeathSound;}void PlayDeathSound(){// 處理音效系統邏輯}
}// 具體的觀察者類
public class SaveSystem : MonoBehaviour
{void Start(){// 注冊觀察者Observer.OnPlayerDeath += SaveGame;}void SaveGame(){// 處理存檔系統邏輯}
}
上面的代碼的表示是這些相關系統在觀察玩家是否死亡,一旦死亡,就會觸發注冊的事件,跟在玩家死亡后面執行。通過觀察者模式,按鈕的點擊事件(玩家死亡)與其他系統的邏輯彼此解耦,不再需要直接引用對方。這使得系統更加靈活,可以方便地擴展和維護。
通過觀察者模式,可以實現游戲中對象之間的松耦合關系,提高代碼的可維護性和擴展性。當游戲中的某個模塊需要與其他模塊進行通信時,可以通過觀察者模式實現一種靈活而有效的方式。