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