本文轉(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)中放置新實體變得越來越困難,尤其是在該實體需要大量不同類型的功能的情況下。 舉個栗子

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

組件可以類比 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)的組件組(即屬于同一實體的組件)進行操作。 拆解角色跳躍邏輯
首先檢測下Input中的keyJump按鍵是否被按下
如果是,那么檢查Collider中是否有接觸地面
如果是,設(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)更多資源干貨!