实体
实体是实体组件系统体系结构的三个主要元素之一。它们代表游戏或程序中的个人“事物”。一个实体既没有行为也没有数据; 相反,它识别哪些数据属于一起。系统提供行为,组件存储数据。
实体本质上是一个ID。您可以将其视为一个超级轻量级GameObject,默认情况下甚至没有名称。实体ID是稳定的。它们是存储对另一个组件或实体的引用的唯一稳定方式。
一个EntityManager管理一个世界中的所有实体。EntityManager维护实体列表并组织与实体关联的数据以获得最佳性能。
虽然实体没有类型,但实体组可以根据与它们相关联的数据组件的类型进行分类。在创建实体并向其添加组件时,EntityManager会跟踪现有实体上组件的唯一组合。这种独特的组合称为原型。在向实体添加组件时,EntityManager会创建EntityArchetype结构。您可以使用现有的EntityArchetypes来创建符合该原型的新实体。您还可以提前创建EntityArchetype并使用它来创建实体。
创建实体
创建实体的最简单方法是使用Unity编辑器。您可以设置放置在场景中的游戏对象和要在运行时转换为实体的预制件。对于游戏或程序的更多动态部分,您可以创建在作业中创建多个实体的衍生系统。最后,您可以使用EntityManager.CreateEntity函数之一一次创建一个实体。
使用EntityManager创建实体
使用EntityManager.CreateEntity函数之一来创建实体。实体在与EntityManager相同的World中创建。
您可以通过以下方式逐个创建实体:
- 使用ComponentType对象数组创建包含组件的实体。
- 使用EntityArchetype创建包含组件的实体。
- 使用Instantiate复制现有实体(包括其当前数据)
- 创建一个没有组件的实体,然后向其中添加组件。(您可以立即添加组件,也可以添加其他组件。)
您也可以一次创建多个实体:
- 使用CreateEntity使用具有相同原型的新实体填充NativeArray 。
- 使用Instantiate向NativeArray填充现有实体的副本,包括其当前数据。
- 使用CreateChunk显式创建使用给定原型填充指定数量的实体的块。
添加和删除组件
创建实体后,可以添加或删除组件执行此操作时,受影响实体的原型会发生变化,EntityManager必须将更改的数据移动到新的内存块,并在原始块中压缩组件数组。
导致结构更改的实体的更改(即添加或删除更改SharedComponentData的值的组件以及销毁实体)无法在Job内部完成,因为这些操作可能会使Job正在处理的数据无效。而是添加命令以对EntityCommandBuffer进行这些类型的更改,并在Job完成后执行此命令缓冲区。
EntityManager提供了从单个实体以及NativeArray中的所有实体中删除组件的功能。有关更多信息,请参阅组件
迭代实体
迭代具有匹配组件集的所有实体,是ECS体系结构的核心。请参阅访问实体数据。