Unity Enitity Component System 参考手册 - 2.2 entity

基于0.11.1-preview 4 版本

2.2 Entities

entity是ECS体系结构的三个主要元素之一。它们代表游戏或应用程序中的各个“事物”。entity既没有行为也没有数据;相反,它标识哪些数据属于一起。系统提供行为,而component存储数据。

entity本质上是一个ID。可以将其视为一个超轻量的GameObject,默认情况下,entity甚至没有名称。entity的ID是稳定不变的;可以使用它们来存储对另一个component或entity的引用。例如,层次结构中的子entity,可能需要引用其父entity。

EntityManager类的管理了游戏世界中所有的entity世界。EntityManager维护entity列表,并组织与entity相关联的数据,以实现最佳性能。

尽管entity没有类型,但是可以按与entity相关联的数据component的类型,对entity进行分组。创建entity并向其中添加component时,EntityManager会跟踪现有entity上component的唯一组合。这种独特的组合称为原型。将component添加到entity时,EntityManager会创建EntityArchetype结构。可以使用现有EntityArchetype来创建符合该原型的新entity。也可以预先创建一个EntityArchetype,然后使用它来创建entity。

2.2.1 Creating entities

创建entity的最简单方法是按传统的编辑GameObject和Prefab的方式,在Unity编辑器中直接编辑。可以让ECS在运行时将放置在Scene和Prefabs中的GameObjects,都转换为entity。对于游戏或应用程序中哪些非预编辑的部分,可以创建用来生成entity的生成系统,在一个job中创建多个entity。最后,可以使用EntityManager.CreateEntity系列函数来一次创建一个entity。

2.2.1.1 Creating entities with an EntityManager

使用EntityManager.CreateEntity函数之一创建一个entity。ECS在与EntityManager相同的世界中创建entity。

可以通过以下方式的创建entity:

  • 使用ComponentType对象数组,创建带有component的entity。
  • 使用EntityArchetype,创建带有component的entity。
  • 克隆现有一个entity,连带着其附带的数据一起克隆
  • 创建一个没有component的entity,然后向其添加component。(可以立即添加component,也可以在需要其他component时添加。)

也可以一次创建多个entity:

  • 使用EnitityManager.CreateEntity()方法,创建使用相同原型的新entity,然后填充到一个原生数组(NativeArray)中 。
  • 使用EnitityManager.Instantiate(Entity srcEntity)方法,克隆现有一个entity,连带着其附带的数据一起克隆,然后填充到一个原生数组。
  • 使用CreateChunk方法,指定待创建的entity的个数,根据给定的chunk 显式创建由指定数量的具有给定原型的entity填充的块。

2.2.2 Adding and removing components

创建entity后,可以添加或删除component。当执行此操作时,受影响entity的原型会更改,并且EntityManager必须将更改后的数据移动到新的内存块中,并将component数组压缩为原始块中。

改变一个entity,将引起结构性的变化(structural change)。这也就是说:会改变SharedComponentData的值的添加或删除component的操作;以及删除entity的操作,不能再在作业内部进行,因为这些操作可能会使作业所处理的数据无效。相反地,可以把这些增删改操作,以命令的形式,添加到一个EntityCommandBuffer中。在作业完成后,执行此命令缓冲区的命令。

EntityManager提供的功能可从单个entity中,或者存储在NativeArray中的所有entity中删除component。