Unity框架設(shè)計(jì):常用設(shè)計(jì)模式之工廠模式
工廠模式(Factory Pattern)是游戲開發(fā)中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)用戶暴露創(chuàng)建邏輯,并且是通過使用一個(gè)共同的接口來指向新創(chuàng)建的對(duì)象。
先來看一個(gè)生活中的真實(shí)的案例,某個(gè)品牌的汽車制造工廠,對(duì)外提供生產(chǎn)這個(gè)品牌的不同型號(hào)汽車的服務(wù)。外界只要下一個(gè)”汽車型號(hào)”, 工廠可以根據(jù)型號(hào)構(gòu)建出來不同型號(hào)的汽車。這樣外界不用關(guān)心工廠內(nèi)部是怎么運(yùn)作的,當(dāng)用戶需要某個(gè)型號(hào)的汽車的時(shí)候調(diào)用接口就可以了,同時(shí)內(nèi)部工廠的機(jī)制,可以任意的修改,比如增加了一個(gè)新的汽車型號(hào)的服務(wù)等。
通過上面的例子,我們來分析一下工程模式的幾個(gè)重要的元素,掌握這幾個(gè)元素,你就可以非常方便的在你的游戲項(xiàng)目中使用工廠模式。
首先是要定義和規(guī)劃我們工廠模式創(chuàng)建出來的對(duì)象,我們可以成為”工廠元素”。這些工廠元素都屬于不同的類型(上面例子中的不同型號(hào)的某品牌汽車),這些類型都屬于同一個(gè)基類(某品牌汽車,具有汽車的通用功能)。所以工廠元素的設(shè)計(jì)規(guī)劃就是 基類+子類的模式,基類提供對(duì)外使用的接口(如汽車的功能), 而子類定義具體的不同的類型。如果要新增一種類型,那么只要繼承自這個(gè)基類就可以了。

工廠元素設(shè)計(jì)好了以后,接下來就是提供一個(gè)”工廠構(gòu)造接口”來構(gòu)造不同的類型的實(shí)例,一般我們會(huì)提供一個(gè) Create的接口,用戶傳遞一個(gè)標(biāo)識(shí)類型的參數(shù),Create里面根據(jù)用戶傳遞的類型來new 不同的子類實(shí)例,返回一個(gè)基類的引用, 讓基類指向子類的實(shí)例。如圖:
?

用戶就可以基于基類來管理子類的實(shí)例。當(dāng)我們新加一種類型的時(shí)候,只要繼承自基類,然后在Create接口加一個(gè)類型來構(gòu)造這個(gè)新類的實(shí)例就可以了。
?
介紹完工廠模式后,相信大家對(duì)工廠模式已經(jīng)有所了解了,接下來我們來通過地圖上戰(zhàn)斗單元的設(shè)計(jì)來講解一下我們整個(gè)戰(zhàn)斗系統(tǒng)中使用工廠模式來處理敵人小怪。
步驟1:定義一個(gè)怪物的基類:
class BaseEnemy extends MonoBehaviour {
//攻擊接口
// end
// 行走接口
// end ….
}
步驟2: 定義具體戰(zhàn)斗單元的子類FlyEnemy, MonestEnemy , 重載實(shí)現(xiàn)具體的接口
class FlyEnemy extends Enemy {
// …
}
class MonestEnemy extends Enemy {
// …
}
步驟3: 編寫一個(gè)工廠模式的Create接口
class EnemyFactory {
?public static BaseEnemy AddEnemyComponent(GameObject obj, int enmeyType) {
? ?switch(enemyType) {
? ? ?case eFlyEnemy:
? ? ?return obj.AddComponent<FlyEnmey>();
? ? ?break;
? ? ?case eMonestEnemy:
? ? ?return obj.AddComponent<MonestEnemy> ();
? ? ?break;
? ?…
? ?}
?}
}
?
步驟4: 根據(jù)Excel表格描述與地圖數(shù)據(jù)來生成敵人。
敵人類型描述表,如圖:

地圖數(shù)據(jù)描述表,如圖:

我們編寫地圖管理代碼,讀取地圖表格,讀取到地圖上怪物的類型,資源路徑,位置,縮放,旋轉(zhuǎn),然后我們根據(jù)描述來在地圖上創(chuàng)建怪物,代碼如下:
GameObject obj = GameObject.Instantiate(資源路徑對(duì)應(yīng)的預(yù)制體);
obj.transform.position = new Vector3(配置表讀取的位置);
…
// 通過工廠模式把敵人構(gòu)建出來
BaseEenemy enemy = EnemyFactory.AddEnemyComponent(obj, 配置表讀取的type);
?
這樣我們就把地圖上的不同的敵人都構(gòu)建與創(chuàng)建出來了,如果有新的敵人,這邊的邏輯都不用改,只要加一種類型,加一個(gè)子類就可以了。這就是工廠模式在游戲中的設(shè)計(jì),很有用,大家要多多體會(huì)實(shí)踐。
?
今天的分享就到這里了,關(guān)注我,可以獲得更多的技巧。
附:視頻教
https://www.bycwedu.com/promotion_channels/2146264125?