ECS 游戲架構 理解


轉載自:http://blog.csdn.net/i_dovelemon/article/details/25798677

理解 組件-實體-系統 (ECS \CES)游戲編程模型 - 博客頻道

 

原文出處:點擊打開鏈接

一般來說,我們實現游戲實體都是采用面向對象的方法進行編程。每一個實體都是一個對象,並且需要一個基於類的實例化系統,允許實體通過多態 來擴展。但是,這樣的方法,往往導致系統中出現大量的類,造成類爆炸的情況出現。隨着新的實體出現,我們發現很難在類繼承圖中添加新的實體,特別是當這個 實體需要很多不同類型的功能的時候。你可以看下下面的一個簡單的類圖繼承。一個靜態的敵人,並不能夠很好的繼承出來。

為了解決這樣的問題,游戲開發人員想出了通過組合而不是繼承的方法來進行實體的構建。一個實體,就是一群組件的聚合,通過這樣的方式,它具有以下面向對象方法所不具有的好處:

1.容易添加新的復雜的實體類型

2.容易定義新的實體數據

3.更加的高效率

下面是如何實現實體的一種方式。注意,這里的組件都是純粹的數據,沒有任何的方法,在下面會詳細解釋為什么這么做。

一 個組件可以使用C中的結構體來進行設計。它沒有方法,只是用來存儲一些數據,並不在它之上進行動作。一個經典的實現方式是,每一個不同的組件都繼承至一個 抽象的Componet類,通過這樣的方法我們能夠在運行時動態的添加組件,識別組件。每一個組件都描述了實體的某個屬性特征。當他們單獨存在的時候,實 際上是沒有任何意義的,但是當多個組件通過系統的方式組織在一起,就能夠發揮強大的力量。我們可以使用空的組件來對實體進行標記,從而能夠在運行時動態的 識別它。

例子

  • Position(x,y)
  • Velocity(x,y)
  • Physics(body)
  • Sprite(images, animations)
  • Heath(value)
  • Character(name, level)
  • Player(empty)

一個實體指的是存在於你的游戲世界中的物體。實體在代碼上就是一個組件的列表。由於實體的結構實在是太簡單了,所以很多實現都沒有專門的設計一個實體的數據結構。 相反的,一個實體就是一個ID,所有組成這個實體的組件將會被這個ID給標記,從而明確的知道哪些組件是屬於哪個實體的。如果你想的話,你可以在運行時, 動態的將組件從實體中移除或者增加一個或多個你感興趣的組件。比如說,如果玩家發出了一個冰系魔法,將敵人凍住,你只要簡單的將它的速度組件移除,那么敵 人就靜止住了。

例子

  • Rock(Position, Sprite)
  • Crate(Position,Sprite,Health)
  • Sign(Position,Sprite,Text)
  • Ball(Position,Velocity,Physics,Sprite)
  • Enemy(Position,Velocity,Sprite,Character,Input,AI)
  • Player(Position,Velocity,Sprite,Character,Input,Player)

注 意,我在上面沒有提到任何和游戲邏輯相關的話題。游戲邏輯是系統需要進行的工作。一個系統就是對所有相關聯的組件記性操作,比如說,同一個實體的組件。舉 個例子,人物的移動系統可能會對位置(Position),速度(Velocity),碰撞(Collider),和輸入(Input)進行操作。每一個 系統,都會在每一幀中按照邏輯上的順序進行更新。如果要讓一個角色跳起來,我們只要檢測下Input中的keyJump按鍵是否被按下,如果是,那么系統 就會查看下載Collider中是否有一個接觸了地面,如果是,就將這個實體的Velocity的y速度設置一下,讓這個物體跳起來。

由於 系統只會對相關聯的組件進行操作,所以組件就定義了一個實體所應該具有的行為。比如說,如果一個實體有一個Position組件,但是沒有 Velocity組件,那么我們就知道,這個物體是靜止不動的,系統就不會對這個實體的Position組件進行操作了。當我們對這個實體增加了一個 Velocity組件的時候,系統就會使用Velocity組件來對物體進行移動。這樣的行為可以使用被標記的組件來進行,被標記的組件能夠重復的使用在 不同的上下文中。對一個實體,增加一個空的Player組件,將會為這個實體打上了Player的標簽,那么PlayerControl系統,就會尋找帶 有這個標簽的所有組件,然后使用Input中的數據,進行操作。

例子

  • Movememt(Position, Velocity) - 將速度增加到位置上去
  • Gravity (Velocity) - 使用重力來對速度進行加速
  • Render(Position, Sprite) - 繪制精靈
  • PlayerControl(Input, Player) - 更具Input中的數據控制Player
  • BotControl(Input, AI) - 更具AI代理和輸入的數據控制

使用了CES系統之后,我們就可以避免使用大量的類了。實體就是你游戲中存在的物體,它隱式的使用一系列的組件進行定義,這些組件都是純粹的數據,只有系統才能夠操作他們。

我希望我已經成功的向您解釋了什么是CES系統,並且你有欲望在自己接下來的項目中試試這個系統的效果。如果你有任何關於本片文章的疑問,很感謝你在后面留下你的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM