理解 DOTS - ECS - 編程思想(基礎(chǔ)入門)

本文轉(zhuǎn)自Unity Connect博主 郡墻

這是一篇關(guān)于 DOTS\ ECS \JobSystem相關(guān)的小白轉(zhuǎn)換編程思想

實現(xiàn)游戲?qū)嶓w的傳統(tǒng)方式是使用面向?qū)ο蟮木幊?。每個實體都是一個對象,可以直觀地允許基于類的實例化系統(tǒng),并使實體可以通過多態(tài)性擴展其他實體。 這導(dǎo)致了龐大而僵化的類層次結(jié)構(gòu)。隨著實體數(shù)量的增加,在層次結(jié)構(gòu)中放置新實體變得越來越困難,尤其是在該實體需要大量不同類型的功能的情況下。 舉個栗子

image

需要實現(xiàn)一類怪物為 邪惡的樹。在這個編程模式里,不論是繼承哪邊都會存在設(shè)計上的沖突或者冗余。 為了解決這個問題,我們通過組合模式來代替繼承的設(shè)計來構(gòu)建實體。實體只是組件的“集合“與上述面向?qū)ο蟮捏w系結(jié)構(gòu)相比,這具有一些主要優(yōu)點:

  • 便于添加新的復(fù)雜實體

  • 便于在數(shù)據(jù)中定義新實體

  • 更高效

組件 - Component

image

組件可以類比 C語言的結(jié)構(gòu)。它沒有方法,只能存儲數(shù)據(jù),不能對其進行操作。在典型的實現(xiàn)中,每種不同的組件類型都將從抽象的Component類派生,該類提供了在運行時獲取組件的類型并包含實體的工具。每個組件都描述實體的某個方面及其參數(shù)。組件本身幾乎沒有任何意義,但是當(dāng)與實體和系統(tǒng)結(jié)合使用時,它們將變得非常強大。空組件對于標(biāo)記實體很有用。 例如:

  • Position (x, y)

  • Velocity (x, y)

  • Physics (body)

  • Sprite (images, animations)

  • Health (value)

  • Character (name, level)

  • Player (empty)

實體 - Entity 實體就是游戲世界中存在的東西。同樣,實體不過是組件列表而已。因為它們是如此簡單,所以大多數(shù)實現(xiàn)都不會將實體定義為具體的數(shù)據(jù)。相反,實體是唯一的ID,組成該實體的所有組件都將使用該ID進行標(biāo)記。實體是用其ID標(biāo)記的組件的隱式聚合。如果需要,可以允許將組件動態(tài)添加到實體或從實體中刪除。這使可以動態(tài)“改變”實體。比如,法師釋放了一個冰凍技能,那么只需刪除被命中對象的Velocity組件。 例如:

  • 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)

系統(tǒng) - Systems 注意,在上面的兩個概念里,都沒有實現(xiàn)具象的游戲邏輯。因為這是 System 概念里要處理的事情。系統(tǒng)對相關(guān)的組件組(即屬于同一實體的組件)進行操作。 拆解角色跳躍邏輯

  1. 首先檢測下Input中的keyJump按鍵是否被按下

  2. 如果是,那么檢查Collider中是否有接觸地面

  3. 如果是,設(shè)置這個實體的Velocity的y速度,讓這個實體對象跳起來。

由于系統(tǒng)只會對相關(guān)聯(lián)的組件進行操作,所以組件就定義了一個實體所應(yīng)該具有的行為。 比如,如果實體對象只有Position組件,沒有Velocity組件,那么這個對象是靜止不動的,系統(tǒng)就不會對這個實體的Position組件進行操作了。當(dāng)這個實體添加elocity組件后,系統(tǒng)就會使用Velocity組件來對物體進行移動。這樣的行為可以使用被標(biāo)記的組件來進行,被標(biāo)記的組件能夠重復(fù)的使用在不同的上下文中。對一個實體,增加一個空的Player組件,將會為這個實體打上了Player的標(biāo)簽,那么PlayerControl系統(tǒng),就會尋找?guī)в羞@個標(biāo)簽的所有組件,然后使用Input中的數(shù)據(jù),進行操作。 例如:

  • Movement (Position, Velocity)

  • Gravity (Velocity)

  • Render (Position, Sprite)

  • PlayerControl (Input, Player)

  • BotControl (Input, AI)

原文鏈接:https://connect.unity.com/p/li-jie-dots-ecs-bian-cheng-si-xiang-ji-chu-ru-men?app=true

歡迎戳上方原文鏈接,下載Unity官方技術(shù)社區(qū)app,在線技術(shù)答疑,發(fā)現(xiàn)更多資源干貨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容