通常來講,咱們實現遊戲實體都是採用面向對象的方法進行編程。每個實體都是一個對象,而且須要一個基於類的實例化系統,容許實體經過多態來擴展。可是,這樣的方法,每每致使系統中出現大量的類,形成類爆炸的狀況出現。隨着新的實體出現,咱們發現很難在類繼承圖中添加新的實體,特別是當這個實體須要不少不一樣類型的功能的時候。你能夠看下下面的一個簡單的類圖繼承。一個靜態的敵人,並不可以很好的繼承出來。數據結構
爲了解決這樣的問題,遊戲開發人員想出了經過組合而不是繼承的方法來進行實體的構建。一個實體,就是一羣組件的聚合,經過這樣的方式,它具備如下面向對象方法所不具備的好處:ide
1.容易添加新的複雜的實體類型阿里雲
2.容易定義新的實體數據設計
3.更加的高效率3d
下面是如何實現實體的一種方式。注意,這裏的組件都是純粹的數據,沒有任何的方法,在下面會詳細解釋爲何這麼作。
代理
一個組件可使用C中的結構體來進行設計。它沒有方法,只是用來存儲一些數據,並不在它之上進行動做。一個經典的實現方式是,每個不一樣的組件都繼承至一個抽象的Componet類,經過這樣的方法咱們可以在運行時動態的添加組件,識別組件。每個組件都描述了實體的某個屬性特徵。當他們單獨存在的時候,其實是沒有任何意義的,可是當多個組件經過系統的方式組織在一塊兒,就可以發揮強大的力量。咱們可使用空的組件來對實體進行標記,從而可以在運行時動態的識別它。cdn
注意,我在上面沒有提到任何和遊戲邏輯相關的話題。遊戲邏輯是系統須要進行的工做。一個系統就是對全部相關聯的組件記性操做,好比說,同一個實體的組件。舉個例子,人物的移動系統可能會對位置(Position),速度(Velocity),碰撞(Collider),和輸入(Input)進行操做。每個系統,都會在每一幀中按照邏輯上的順序進行更新。若是要讓一個角色跳起來,咱們只要檢測下Input中的keyJump按鍵是否被按下,若是是,那麼系統就會查看下載Collider中是否有一個接觸了地面,若是是,就將這個實體的Velocity的y速度設置一下,讓這個物體跳起來。htm
因爲系統只會對相關聯的組件進行操做,因此組件就定義了一個實體所應該具備的行爲。好比說,若是一個實體有一個Position組件,可是沒有Velocity組件,那麼咱們就知道,這個物體是靜止不動的,系統就不會對這個實體的Position組件進行操做了。當咱們對這個實體增長了一個Velocity組件的時候,系統就會使用Velocity組件來對物體進行移動。這樣的行爲可使用被標記的組件來進行,被標記的組件可以重複的使用在不一樣的上下文中。對一個實體,增長一個空的Player組件,將會爲這個實體打上了Player的標籤,那麼PlayerControl系統,就會尋找帶有這個標籤的全部組件,而後使用Input中的數據,進行操做。
使用了CES系統以後,咱們就能夠避免使用大量的類了。實體就是你遊戲中存在的物體,它隱式的使用一系列的組件進行定義,這些組件都是純粹的數據,只有系統纔可以操做他們。
我但願我已經成功的向您解釋了什麼是CES系統,而且你有慾望在本身接下來的項目中試試這個系統的效果。若是你有任何關於本片文章的疑問,很感謝你在後面留下你的問題。