天天看點

Unity Entity Component System 2 --- Entities 實體

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中。

按照以下方式建立:

  1. 以ComponentType數組作為參數建立Entity
  2. 以EntityArchetype作為參數建立Entity
  3. 利用現有的Entity,調用Instantiate執行個體化同樣的Entity
  4. 建立空的Entity,然後為其添加元件(可以立即添加,也可以在需要時添加(事實上不推薦動态添加,删除))。

可以一次建立多個Entities:

  1. 使用Create Entity,建立共享archetype的Entity的數組(NativeArray)。
  2. 使用Instantiate建立(克隆)Entity數組(Native Array)。
  3. 使用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)