Unity游戲開發(fā)中必備的設(shè)計(jì)模式之外觀模式詳解
一、外觀模式定義
外觀模式(Facade)在GoF中的解釋:為子系統(tǒng)定義一組統(tǒng)一的接口,這個(gè)高級接口會(huì)讓子系統(tǒng)更容易被使用。
所以,外觀模式的重點(diǎn)在于,它能夠?qū)⑾到y(tǒng)內(nèi)部的互動(dòng)細(xì)節(jié)隱藏起來,并提供一個(gè)簡單方便的接口。
二、外觀模式說明
示意圖表示:整合子系統(tǒng)并提供一個(gè)高級的界面讓客戶端使用。
其中的參與者具體說明:
client(客戶端、用戶)
從原本需要操作多個(gè)子系統(tǒng)改為只需要面對一個(gè)整合后的界面。
subSystem(子系統(tǒng))
原本會(huì)由不同的客戶端(非同一系統(tǒng)相關(guān))來操作,改為只會(huì)由內(nèi)部系統(tǒng)之間交互使用。
Facade(統(tǒng)一對外的界面)
整合所有子系統(tǒng)的接口及功能,并提供高級界面(或接口)供客戶端使用。
接受客戶端的信息后,將信息傳送給負(fù)責(zé)的子系統(tǒng)。
具體來說,外觀模式可以讓客戶端使用簡單的界面來操作一個(gè)復(fù)雜的系統(tǒng),并且減少客戶端要與之互動(dòng)的系統(tǒng)數(shù)量,讓客戶端能夠?qū)P奶幚砼c本身有關(guān)的事情。
三、實(shí)現(xiàn)游戲主程序
1、游戲主架構(gòu)設(shè)計(jì)
2、實(shí)現(xiàn)說明
子系統(tǒng)對外接口類 - PBaseDefenseGame
/// <summary> /// Describe:整合所有子系統(tǒng)的接口及功能 /// </summary> public class PBaseDefenseGame { //使用單例 private static PBaseDefenseGame _instance; public static PBaseDefenseGame Instance { get { if (_instance == null) _instance = new PBaseDefenseGame(); return _instance; } } //場景狀態(tài) private bool m_bGameOver = false; //游戲系統(tǒng) private GameEventSystem m_GameEventSystem; private CampSystem m_CampSystem; private StageSystem m_StageSystem; /// <summary> /// 初始化 /// </summary> public void Initinal() { m_bGameOver = false; //游戲系統(tǒng) m_GameEventSystem = new GameEventSystem(this); m_CampSystem = new CampSystem(this); m_StageSystem = new StageSystem(this); //... } //釋放系統(tǒng)游戲 public void Release() { // 游戲系統(tǒng) m_GameEventSystem.Release(); m_CampSystem.Release(); m_StageSystem.Release(); m_CharacterSystem.Release(); //... } /// <summary> /// 更新 /// </summary> public void Update() { //游戲系統(tǒng)更新 m_GameEventSystem.Update(); m_CampSystem.Update(); m_StageSystem.Update(); //... } //游戲狀態(tài) public bool ThisGameIsOver() { return m_bGameOver; } //... }
戰(zhàn)斗狀態(tài)類調(diào)用Facade接口
/// <summary> /// Describe:戰(zhàn)斗場景 /// </summary> public class BattleState : ISceneState { public BattleState(SceneStateController Controller) : base(Controller) { this.StateName = "BattleState"; } // 開始 public override void StateBegin() { PBaseDefenseGame.Instance.Initinal(); } // 結(jié)束 public override void StateEnd() { PBaseDefenseGame.Instance.Release(); } // 更新 public override void StateUpdate() { // 游戲更新 PBaseDefenseGame.Instance.Update(); // Render由Unity負(fù)責(zé) // 游戲是否結(jié)束 //if (PBaseDefenseGame.Instance.ThisGameIsOver()) //m_Controller.SetState(new MainMenuState(m_Controller), "MainMenuScene"); } }
3、使用外觀模式的優(yōu)點(diǎn)
上述示例中可體現(xiàn):
1、將戰(zhàn)斗狀態(tài)類BattleState單一化,讓該類只負(fù)責(zé)游戲在“戰(zhàn)斗狀態(tài)”下的功能執(zhí)行及狀態(tài)切換,不用負(fù)責(zé)串接各個(gè)游戲系統(tǒng)的初始化和功能調(diào)用。
2、使戰(zhàn)斗狀態(tài)類BattleState減少了不必要的類引用即功能整合,因此增加了BattleState類被重復(fù)使用的機(jī)會(huì)。
如果外觀模式運(yùn)用得當(dāng)還具有以下優(yōu)點(diǎn):
節(jié)省時(shí)間
比如:Unity組件接口(物理、渲染,UI,粒子等)是使用Facade接口,通過面板公開參數(shù),可通過調(diào)整相關(guān)參數(shù)數(shù)據(jù)可以輕易得到反饋效果。
易于分工開發(fā)
比如,在工作分工配合上,開發(fā)者只需要了解對方負(fù)責(zé)系統(tǒng)的Facade接口,不必深入了解其中運(yùn)作方式。
增加系統(tǒng)的安全性
這里安全性是指系統(tǒng)執(zhí)行時(shí)“意外宕機(jī)或者出錯(cuò)”的情況。比如,一個(gè)功能先通知A去做后通知B做,一旦順序出錯(cuò)會(huì)讓系統(tǒng)初始化失敗或?qū)е洛礄C(jī),所以需要Facade接口類來完成,不應(yīng)該有客戶端去做。
四、結(jié)論
將復(fù)雜的子系統(tǒng)溝通交給單一的一個(gè)類負(fù)責(zé),并提供單一界面給客戶端使用,使客戶減少對系統(tǒng)的耦合度使外觀模式(Facade)的優(yōu)點(diǎn)。
到此這篇關(guān)于Unity游戲開發(fā)中必備的設(shè)計(jì)模式之外觀模式詳解的文章就介紹到這了,更多相關(guān)Unity外觀模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#使用FreeSql生產(chǎn)環(huán)境時(shí)自動(dòng)升級備份數(shù)據(jù)庫
使用FreeSql,包含所有的ORM數(shù)據(jù)庫,都會(huì)存在這樣的問題。在codefirst模式下,根據(jù)代碼自動(dòng)更新數(shù)據(jù)庫,都建議不要在生產(chǎn)環(huán)境使用。因?yàn)槿菀讈G失數(shù)據(jù),本文提供一種自動(dòng)更新數(shù)據(jù)庫的解決的思路:在判斷需要升級時(shí),才自動(dòng)升級,同時(shí)升級前先備份數(shù)據(jù)庫2021-06-06C# 如何使用OpcUaHelper讀寫OPC服務(wù)器
這篇文章給大家介紹C# 如何使用OpcUaHelper讀寫OPC服務(wù)器,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12C#設(shè)置自定義文件圖標(biāo)實(shí)現(xiàn)雙擊啟動(dòng)(修改注冊表)
這篇文章介紹的是利用C#設(shè)置自定義文件圖標(biāo),然后實(shí)現(xiàn)雙擊啟動(dòng)的功能,文章給出了示例代碼,介紹的很詳細(xì),有需要的可以參考借鑒。2016-08-08C#實(shí)現(xiàn)路由器斷開連接,更改公網(wǎng)ip的實(shí)例代碼
C#實(shí)現(xiàn)路由器斷開連接,更改公網(wǎng)ip的實(shí)例代碼,需要的朋友可以參考一下2013-05-05C#實(shí)現(xiàn)倒計(jì)時(shí)關(guān)閉提示框功能
最近小編接到一個(gè)功能需要實(shí)現(xiàn)一個(gè)提示框并且能自動(dòng)關(guān)閉的,看到這個(gè)需求真是懵了,四處搜集資料才搞定,接下來通過本文給大家分享C#實(shí)現(xiàn)倒計(jì)時(shí)關(guān)閉提示框功能,感興趣的朋友跟隨小編一起看看吧2019-07-07C#實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11