0

在基于组件的游戏引擎中,当涉及到游戏对象/组件之间的关系时,我遇到了麻烦。

在哪里存储关系,以及如何删除它们?

为了简单起见,这里有一个例子。

Gradius 克隆游戏包含 2 种类型的游戏对象:-

  1. 火箭=主体组件+炮塔组件
  2. 浮动炮塔= 炮塔组件(单独)

组件详细信息是:-

  1. 主体组件= 一个物理实体 + 一个图形实体
  2. 炮塔组件= 一个物理实体 + 一个图形实体

Turret Component设计为与Main Body Component有关系(物理约束或所有权)。

要求必须在两个组件之前删除关系。

  • 例如,这种情况下的关系还包含由外部物理库实现的物理约束,例如子弹物理。

这些是一个特定于示例的描述,以防万一......

删除Rocket的步骤必须按照以下顺序:-

  1. 删除约束
  2. 删除主体组件炮塔组件(任何顺序都可以)

删除Main Body Component时也应删除该关系,仅保留Turret Component,因此使其成为Floating turret

关系应该存储在哪里?(一切似乎都很好,但与下一个问题有关。)

  1. 在新的专用游戏对象(新实体)中的新组件内
  2. 在与Rocket相同的实体中的新组件内
  3. 在一个新的管理器系统中,该系统保留了这种特定关系的列表

应该如何删除关系?(两者似乎都是坏主意。)

  1. 创建一个标志来检查Main Body ComponentRocket的即将删除,然后在删除其他组件之前调用一个新的专用系统来删除关系,它必须在每个时间步之前在其他管理器系统之前调用。

  2. 让其他现有经理在要删除主体组件火箭时调用一个新的专用系统

对于有很多类型关系的一般情况,我期望得到答案。(游戏对象或组件之间)

编辑 1:提出的关于在 Rocket 的析构函数中直接创建所有权和添加代码的解决方案非常反对基于组件的设计。

  • 这将使三个组件(包括约束)非常耦合。
  • 此外,组件不应具有非平凡的功能。
    我相信析构函数是其中之一,应该避免。
    (我曾经有一些对象的膨胀析构函数,它破坏了所有良好的模块化。)
4

1 回答 1

0

在您的 Rocket 游戏对象示例中,关系是一种所有权,应保存在 Rocket 中。如果您的游戏引擎架构允许,则可以在删除之前由管理器系统调用的游戏对象中的析构函数删除关系。

编辑: 如果您不希望对象或组件了解它们的所有权或关系,我认为最好的选择是保留一个关系列表(如您所建议的)并引用关系的所有者. 这样你可以先检查列表,看看你的游戏对象(火箭)是否可以被删除,或者它是否有任何关系需要先删除。

于 2016-05-28T21:05:48.567 回答