Unity學習筆記(1) --- 一切皆組件
來自: http://blog.csdn.net//likendsl/article/details/50220651
Unity有個組件(Component)商店,覺得,這種完全基于組件的頂層結構設計,簡直帥呆了!
首先明確的一點是,Unity的核心就是一切皆Component。
那么到底什么是“基于組件”的對象模型 ?它能夠解決什么問題?
在傳統的結構設計中一般會使用“派生”來描述對象之間的關系。子類通過派生父類,來獲得父類的功能。在設計游戲對象時,會根據游戲本身的需要而為游戲對象添加各種功能支持,比如渲染,碰撞,剛體,粒子系統等等。這些通用功能為了能夠為各種派生類提供服務,都必須實現到基類中。這樣就導致了游戲對象基類變得非常龐大臃腫,即難使用,又難維護。
”基于組件“的對象模型就是把所有需要提供給游戲對象的基礎功能都獨立成單獨的”組件模塊“(Component),一個具體的游戲對象可以將它需要的功能模塊組合到一起使用。所有”功能“不再是父類中的接口,而變成子對象實例,為游戲對象提供服務。這樣既保證了功能代碼的可重用性,又增加了整個對象體系的模塊化和靈活度。
在Unity中,GameObject除了作為Component的容器之外,基本上沒有其他功能。所有需要的功能都要通過組合Component來實現。腳本本身也是Component,用來在GameObject上通過控制其他Component來實現自定義的功能。雖然這些Component在物理上是完全并列的關系,但是他們之間還是會有一定的層次關系的。在設計一個游戲對象的具體功能時,組件一般會被分為三個層次。
引擎的基礎組件
Unity本身提供的各種內部功能組件。比如渲染組件,物理組件,聲音組件等等。這些組件實現了所有引擎提供的基礎功能,被用來組合實現一些高級的復合功能。
模塊功能腳本組件
通過腳本實現的一些相對獨立的通用模塊功能的組件。這類 組件的設計 是腳本可重用的關鍵,需要仔細分析游戲對象中哪些功能可以被獨立出來成為一個可重用的功能模塊組件,并且在實現上應該盡量降低與其他組件的耦合性。比如在設計一個角色游戲對象時,需要為他設計換裝功能。換裝功能其實就是對顯示子對象進行分組管理,切換顯示狀態。這個功能相對獨立,與其將他實現到角色中,不如獨立成一個功能模塊組件。角色游戲對象和其他所有需要換裝功能的游戲對象都可以通過包含這個模塊組件來實現換裝功能。
模塊功能組件之間還可能有依賴關系,也就是一個功能模塊組件可能依賴與另一個功能模塊組件,從而在這個組件層次上形成更多的子層次。
高層的膠水代碼腳本
這些腳本用來真正將引擎基礎組件和模塊功能組件組合到一起實現最終游戲對象邏輯。用“膠水代碼”來形容這些腳本非常的貼切,就是把所有這些子功能“粘”在一起。比如設計一個Player腳本,將所有需要的組件功能組合起來,實現一個玩家的具體游戲邏輯。因為這一層次代表的都是最高層的游戲行為控制對象,是具體的游戲邏輯的“膠水”代碼,不會再為更上層提服務,所以本身的可重用性并不高。但是這些對象之間按照類型區分,往往會有一些功能上的重合,所以反而可以繼續使用派生關系來實現功能的重用。比如在Character中實現所有的基礎功能(這些功能又是通過組合基礎組件來實現的),而Player和NPC都從Character派生,來繼承所有Character的功能,并繼續實現自己特殊的功能。一個功能到底應該用組件實現還是用派生實現并沒有非常明確的界限,應該根據需要靈活運用。
在使用Unity的過程中,如果要實現的是demo級別的小工程,并不需要考慮很多,直接用腳本實現功能就可以了。但是如果要有效地組織復雜的工程,提高代碼的重用性,充分理解和合理的利用“基于組件”的對象模型設計思想還是很重要的。