Entities
Entities在ECS中,表示遊戲或者應用中一個具體的實體。實體既沒有行為也沒有資料,它隻是一個辨別(可能就是個整數),表示将哪些資料(元件)組織到一起。System提供行為,Component存儲資料。
Entity其實是個ID,你可以認為它是個超級輕量化的,甚至連name都沒有的GameObject。Entity IDs是固定的,這樣才可以用它在元件或者實體間建立引用關系。
EntityManager類管理World中的所有實體,持有一個實體清單,并且以極高的效率組織實體和資料。
雖然實體沒有類型,但是可以根據它上面的資料元件來進行分類。當你建立實體并向其添加元件時,EntityManager會建立以個Entityarchetype結構體。可以使用已經有的原型來建立新的實體。也可以先建立原型,再根據原型建立實體(實際上推薦這樣)。
Create Entities
建立實體
在編輯器中建立entity是最簡單的方式,可以在場景中建立GameObject或者建立一個運作時轉換成entity的prefab。此外,還可以建立一個生成系統(spawning system)在Job中建立多個enitties。最後,還可以調用EntityManager.CreateEntity接口建立。
Creating Entities with an EntityManager
選擇合适的EntityManager.CreateEntity()版本建立Entities,Entities将被與EntityManager在同一個World中。
按照以下方式建立:
- 以ComponentType數組作為參數建立Entity
- 以EntityArchetype作為參數建立Entity
- 利用現有的Entity,調用Instantiate執行個體化同樣的Entity
- 建立空的Entity,然後為其添加元件(可以立即添加,也可以在需要時添加(事實上不推薦動态添加,删除))。
可以一次建立多個Entities:
- 使用Create Entity,建立共享archetype的Entity的數組(NativeArray)。
- 使用Instantiate建立(克隆)Entity數組(Native Array)。
- 使用Create Chunk建立記憶體塊,并在其上建立指定archetype和數量的Entities。
Adding and Removing Components
Entity建立出來後,可以為其添加或者删除元件。該類操作同時改變了Entity的Archetype,并且Entity Manger會将該資料改變的Entity移動到新的Archetype對應的記憶體塊中,同時重新組織原有Archetype記憶體塊内的資料,保持緊密布局(通常是将最後一個Entity元件,移動到空出來的元件位置)。
Entity的改變,導緻記憶體結構改變,這些改變包括,添加删除Component,改變SharedCompoentData的值,以及删除entity,同時這些操作不能再Job内執行,因為這會使Job正在操作的資料無效。如果要再Job中進行該類操作,必須添加相應的commands到EntityCommandBuffer中,并再Job完成後執行。
Entity Manger提供方法移除一個Entity的Component,同時提供方法移除Native Array中的所有Entities的指定元件。
Iterating entities
周遊所有比對元件集合的entities,是ECS的核心架構,後面再說。
Worlds
一個World(世界)包含一個Entity Manger和一系列的ComponentSystems,可以在該World中建立需要的對象。通常建議建立2個World,一個是模拟(邏輯)World,和一個渲染World。
遊戲執行時,ECS預設會建立一個World,并建立所有的有效的ComponentSystem。也可以禁止自動建立World,而根據你自己的代碼配置建立你的World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD禁止自動建立World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_EDITOR_WORLD禁止自動建立編輯器World。
#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP禁止自動建立以上2種World。
- Default World creation code (see file: Packages/com.unity.entities/Unity.Entities.Hybrid/Injection/DefaultWorldInitialization.cs)
- Automatic bootstrap entry point (see file: Packages/com.unity.entities/Unity.Entities.Hybrid/Injection/AutomaticWorldBootstrap.cs)