本文内容
Open 3D Engine 实体和组件的概述
Open 3D Engine (O3DE) 是一个*实体-组件系统(ECS)*引擎。这意味着它不使用多态系统,即对象之间相互派生(“is-a ”关系),而是使用组合(“has-a ”关系)。一个常见的多态示例是 “一辆汽车是一辆汽车”,而组合示例则是 “一辆汽车具有一辆汽车的组件”。使用组合可以更容易地扩展对象、设计重用,并使基础实现尽可能灵活,从而提高性能和易用性。
实体本身没有任何功能;相反,实体本质上是一个 ID 和一个组件容器。一个实体可以包含任意数量或组合的组件。有些组件允许每个实体只有一个实例,有些则依赖于其他组件才能运行。
O3DE 附带的 Gem 包含各种实现核心引擎功能的组件。在O3DE 编辑器中,您可以在动画、原子和游戏等类别中找到这些组件。作为 O3DE 开发人员,您可以创建新的组件,以扩展现有 Gem 的功能,或实现您自己 Gem 的功能。本节将向您展示如何创建组件。
组件类型
所有 O3DE 组件都源于 AZ::Component
类。此外,O3DE 还定义了一些专为特定用例设计的组件类型。
标准组件
标准组件可在编辑器和运行时环境中实现功能。在某些情况下,它们被称为 “运行时组件 ”或 “游戏组件”,以区别于专门的 “编辑器 ”和 “系统 ”组件。
编辑器组件
编辑器组件提供特定功能,以满足编辑器环境的需要。它们只有在编辑模式下使用编辑器时才会激活。它们通常与运行时组件配对,后者可以在运行时代表编辑器组件,在运行时环境中提供相关但更简单或更精简的功能。编辑器组件类包含一个可以覆盖的方法,以便于从编辑器组件为其所属实体创建运行时组件。有关编辑器组件的更多信息,请参阅 编辑器组件。
系统组件
**系统组件是长期存在的单件,它控制引擎内的行为,而不是提供编辑器或运行时行为。因此,系统组件是在引擎中注册的,而不是添加到单个实体中。有关系统组件的更多信息,请参阅 系统组件。
组件之间的通信
在 O3DE 中,您可以使用 ** 事件总线(EBus)** 消息传递系统在组件之间进行通信,而不是持有对其他实体或其组件的引用。
组件依赖
组件可以依赖于服务。这些服务与 EBus 通常是一对一的关系。如果一个组件声明它依赖(需要)一项服务,那么使用该组件的任何实体也必须包含一个提供所需服务的组件。即使在编辑过程中,实体也不能处于缺少一个组件依赖关系的状态。在 O3DE 的编辑工具中,这意味着缺少依赖关系的组件实际上会从实体中移除,并存储在一个临时列表中。当组件的所有依赖关系都可用时,组件就会恢复到实体中。
组件总是按其依赖关系的顺序被激活。因此,当一个组件被激活时,它总是可以假定它所需要的服务是可用的。
组件生命周期
组件的生命周期非常简单。初始化后,组件的激活和停用遵循所有者实体的激活和停用生命周期。
Init()
– (可选)Init()
函数会为每个拥有组件的实体调用一次。它允许组件初始化其内部状态。虽然Init()
函数初始化了组件,但在系统调用组件的Activate()
函数之前,组件并没有激活。Activate()
– (必填)当一个实体被激活时,它会调用其所有组件的Activate()
,前提是该组件依赖的所有服务和组件都存在并处于激活状态。要了解如何指定这些依赖关系,请参阅 定义和使用组件服务。通常在Activate()
函数中,组件会执行设置程序、连接到 EBus 并分配资源或请求资产。Deactivate()
– (必填)停用实体时,实体会调用其所有组件的Deactivate()
函数。在Deactivate()
函数中,组件应释放所有资源并断开与所有 EBus 的连接。停用的顺序与激活相反,因此你的组件会先于它所依赖的组件停用。停用后,组件应完全处于休眠状态,其状态应与调用Init()
后的状态大致相同。
组件的其余 API 操作应由其实现的 EBus 确定。