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)