ECS框架文档翻译一 Entities

以下文档均来源于ECS官网:

https://docs.unity3d.com/Packages/[email protected]/manual/ecs_entities.html

Entities 实体

实体是ECS(实体组件系统)体系结构的三个主要元素之一。它们代表游戏或程序中的单个“物体”。一个实体(E)既没有行为也没有数据,它只是将一系列相关联的数据(来源于Compnents)串联在一起。系统(Systems)提供行为。组件( Components)存储数据。

实体本质上是一个ID。您可以将其视为一个超级轻量级​​GameObject,默认情况下甚至没有名称。实体ID是固定的,它们是存储对另一个组件或实体的引用的唯一稳定方式。

EntityManager 负责管理World中的所有实体。 EntityManager维护实体列表并组织与实体关联的数据以获得最佳性能。

虽然实体没有类型,但实体依然进行分组,根据是使用与之相关联的多个数据组件(C)的类型。在创建实体并向其添加组件时,EntityManager会跟踪现有实体上组件的唯一组合。这种独特的组合称为EntityArchetype (实体原型)。在向实体添加组件时,EntityManager会创建EntityArchetype结构。您可以使用现有的EntityArchetypes来创建符合该原型的新实体,也可以提前创建EntityArchetype,后续再使用它来创建实体。

创建实体

创建实体的最简单方法是使用Unity编辑器。您可以设置放置在场景中的游戏对象和要在运行时转换为实体的预制件。若是要根据程序动态生成,您可以创建一个实体spawning (生成)系统,用于在Job中创建多个实体。最后,您可以使用EntityManager.CreateEntity函数来创建实体。

使用EntityManager创建实体
使用 EntityManager.CreateEntity函数之一来创建实体。实体将被创建在与EntityManager相同的World中。

您可以通过以下方式逐个创建实体:

  • EntityManager.CreateEntity(ComponentType[]),使用组件数组来创建实体。
  • EntityManager.CreateEntity(EntityArchetype),使用实体原型来实体。
  • EntityManager.Instantiate(Entity),复制现有实体(包括其当前数据)
  • 创建一个没有组件的实体,然后向其中添加组件。 (可以立即添加组件,也可以在需要时再添加)

您也可以一次创建多个实体:

  • 使用EntityManager.CreateEntity(EntityArchetype, NativeArray)将具有相同原型的新实体填充到NativeArray。
  • 使用EntityManager.Instantiate(Entity, NativeArray)向NativeArray填充现有实体的副本,包括其当前数据。
  • 使用EntityManager.CreateChunk(EntityArchetype, NativeArray, Int32)根据指定的实体原型,指定的个数,以构成一个实体组(ArchetypeChunk)的形式添加到NativeArray。

添加和删​​除组件

当实体创建之后,你还可以增加或者删除组件,当你这么做的时候,该实体的原型(EntityArchetype)将发生变化,因为
EntityManager必须将修改后的数据(那些关联的组件)移动到一个新的内存内中,并将原先的组件数组压紧。
{译者注:假设实体E1,添加了组件C1、C2,那么必然存在一个实体原型EA1,此时,EA1可能被实例化了很多,也就是具有很多个EA1的拷贝体,他们的所有组件被存放再一起[[C1、C2]、[C1、C2]、[C1、C2]],假设前一组[C1、C2]属于当前的E1,此时,若修改E1,比如增加C3,那么EA1已经不能匹配现有结构,此时只能再分配(或者查找已经存在的)一个原型EA2,它们将被分配到类似[[C1、C2、C3],[C1、C2、C3]]这样的结构中,因此原先的那组[C1、C2]的数据需要被拷贝到新结构,且从原结构中删除}

实体的更改将导致内部组件、原型等结构的更改,即添加或删除组件的操作,将更改SharedComponentData(共享的组件数据,如前述的[C1、C2])的值,这些操作无法在Job内部完成,包括销毁实体操作。因为这些操作可能会使Job正在处理的数据无效。然而,你可以添加EntityCommandBuffer 命令,以在此Job完成后,进行这些类型的更改。

EntityManager提供了从单个实体以及NativeArray中的所有实体中删除组件的功能。有关更多信息,请参阅 Components 。

实体遍历
在所有组件匹配的实体间遍历,是ECS体系结构的核心。请参阅 Accessing entity Data.

你可能感兴趣的:(Unity中的ECS编程)