#Unity中最重要的一個(gè)概念就是組件涉兽,在Unity中--萬物皆組件
在傳統(tǒng)的設(shè)計(jì)中招驴,我們一般會(huì)使用“派生”來描述對象之間的關(guān)系。子類通過派生父類枷畏,來獲得父類的功能别厘。在設(shè)計(jì)游戲?qū)ο髸r(shí),會(huì)根據(jù)游戲本身的需要而為游戲?qū)ο筇砑痈鞣N功能支持拥诡,比如渲染触趴,碰撞,剛體渴肉,粒子系統(tǒng)等等冗懦。這些通用功能為了能夠?yàn)楦鞣N派生類提供服務(wù),都必須實(shí)現(xiàn)到基類中仇祭。這樣就導(dǎo)致了游戲?qū)ο蠡愖兊梅浅}嫶笥纺[批狐,即難使用,又難維護(hù)。
OOP的繼承思想
圖1.png
上圖1的整個(gè)關(guān)系變成了
- Player is a A
- Player is a B
- Player is a C
舉個(gè)實(shí)際的例子:一個(gè)靜態(tài)的敵人嚣艇,并不能夠很好地通過繼承實(shí)現(xiàn)出來承冰。
繼承.jpg
#那么到底什么是“基于組件”的對象模型?它又能夠解決什么問題食零?
”基于組件“的對象模型就是把所有需要提供給游戲?qū)ο蟮幕A(chǔ)功能都獨(dú)立成單獨(dú)的組件模塊(Component)困乒,一個(gè)具體的游戲?qū)ο罂梢詫⑺枰墓δ苣K組合到一起使用。所有”功能“不再是父類中的接口贰谣,而變成子對象實(shí)例娜搂,為游戲?qū)ο筇峁┓?wù)。這樣既保證了功能代碼的可重用性吱抚,又增加了整個(gè)對象體系的模塊化和靈活度百宇。
OOP的組合思想
圖2.png
相比圖1,圖2的關(guān)系更加合理
Player have a A
Player have a B
Player have a C
還是同樣的案例秘豹,用組合的思想來實(shí)現(xiàn)(如下圖)携御,相比繼承的方式,更加靈活既绕,耦合度也更低
組合.jpg
#組件模型在UNITY中是如何運(yùn)用的
另外啄刹,在Unity中,GameObject除了作為Component的容器之外凄贩,基本上沒有其他功能誓军。所有需要的功能都要通過組合Component來實(shí)現(xiàn)。腳本本身也是Component疲扎,用來在GameObject上通過控制其他Component來實(shí)現(xiàn)自定義的功能昵时。雖然這些Component在物理上是完全并列的關(guān)系,但是他們之間還是會(huì)有一定的層次關(guān)系的椒丧。在設(shè)計(jì)一個(gè)游戲?qū)ο蟮木唧w功能時(shí)壹甥,組件一般會(huì)被分為三個(gè)層次。
-
引擎的基礎(chǔ)組件
Unity本身提供的各種內(nèi)部功能組件瓜挽。比如渲染組件盹廷,物理組件,聲音組件等等久橙。這些組件實(shí)現(xiàn)了所有引擎提供的基礎(chǔ)功能俄占,會(huì)被腳本使用來組合高級功能。
-
模塊功能腳本組件
通過腳本實(shí)現(xiàn)的一些相對獨(dú)立的通用模塊功能的組件淆衷。這類組件的設(shè)計(jì)是腳本可重用的關(guān)鍵缸榄,需要仔細(xì)分析游戲?qū)ο笾心男┕δ芸梢员华?dú)立出來成為一個(gè)可重用的功能模塊組件,并且在實(shí)現(xiàn)上應(yīng)該盡量降低與其他組件的耦合性祝拯。
-
實(shí)體
實(shí)體在代碼上就是一個(gè)組件的列表甚带。由于實(shí)體的結(jié)構(gòu)實(shí)在是太簡單了她肯,所以很多實(shí)現(xiàn)都沒有專門的設(shè)計(jì)一個(gè)實(shí)體的數(shù)據(jù)結(jié)構(gòu)。相反的鹰贵,一個(gè)實(shí)體就是一個(gè)ID晴氨,所有組成這個(gè)實(shí)體的組件將會(huì)被這個(gè)ID給標(biāo)記,從而明確的知道哪些組件是屬于哪個(gè)實(shí)體的碉输。如果你想的話籽前,你可以在運(yùn)行時(shí),動(dòng)態(tài)的將組件從實(shí)體中移除或者增加一個(gè)或多個(gè)你感興趣的組件敷钾。比如說枝哄,如果玩家發(fā)出了一個(gè)冰系魔法,將敵人凍住阻荒,你只要簡單的將它的速度組件移除挠锥,那么敵人就靜止住了。
引申到樓主最近項(xiàng)目里的CharacterBase類侨赡,是以面向?qū)ο蟮乃枷雭碓O(shè)計(jì)的蓖租,隨著屬性和方法越來越多,這個(gè)類變的難以維護(hù)辆毡,如果以組件的思想來重新設(shè)計(jì)菜秦,血量甜害、位置舶掖、碰撞等等都拎出來做為基礎(chǔ)組件,而一個(gè)對象只是通過組合基礎(chǔ)組件來實(shí)現(xiàn)的尔店,這樣結(jié)構(gòu)會(huì)更加清晰眨攘,而且要生成一個(gè)擁有其他特性的對象也很簡單,再掛載一特性組件即可嚣州。
總結(jié):
如果你接觸過《軟件架構(gòu)》的編程思想就會(huì)知道鲫售,UNITY的組件模型其實(shí)遵循的就是優(yōu)秀設(shè)計(jì)的準(zhǔn)則:“組合優(yōu)于繼承”