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)