7

主题

我的问题是关于在结合 Apple 的框架时更新周期的划分,以便尊重该主题的典型模式和良好实践,因为大多数文档和示例代码还没有适应 Swift(或者至少我可以)在任何地方都找不到)。

在 GameplayKit 中有很多方法可以管理更新周期,我不太确定什么是组合所有内容的好方法。

要素

首先也是最重要的:实体/组件中的每个类(GKComponentGKEntity(子)类)都有一个update()方法,您可以覆盖该方法以执行每帧更新。这必须来自当前GKScene/的更新周期SKScene

然后GKComponentSystem,您可以使用它来update()从已添加到其中的给定类型中启动每个组件的方法。我明白了,这很方便。

但我也想使用状态机系统,它也有自己的更新周期......结合所有让我感到困惑的东西。

我的情况

在我有一个在初始化时创建GKEntity的实例的子类的情况下。GKStateMachine状态机有几个状态(目前:“Spawn”、“Normal”、“Stunned”和“Death”。

状态循环

现在,我正在用我的子类创建一个大的“千篇一律”,GKEntity并创建它将在初始化期间使用的所有组件。但它变得非常不切实际。例如,我有一个MovementComponent,它是 的子类GKAgent2D。我创建了一个管理实体创建的单例,因此在创建实例后,if 循环遍历所有实体的组件并将它们添加到相关的GKComponentSystems. 单例有一个它自己的 update() 方法,更新将调用传递给GKComponentSystems. 我使用的一些组件不需要逐帧更新,因此没有GKComponentSystem为它们创建任何组件,我根据需要手动更新它们。

如果我回到我的实体,因为我一次创建所有内容并用于GKComponentSystems更新组件,我的组件的更新方法加载了guardif-let语句,因为我需要访问实体的状态机,检查它是否是实体可以移动的状态(正常状态)并做它的事情或逃避功能。这在我看来效率不高:移动组件在生成、眩晕或死亡时不需要更新。

最重要的是,GKStateMachine由于我的更新方法是空的,因此我完全使用了过度杀伤力:GKComponentSystem无论如何,组件都会被更新。

我的想法

  1. 完全GKComponentSystems简单地循环遍历我的所有实体(如果需要,可能在某个时候将它们分类到不同的集合中)并调用它们的update()方法。将更新发送到状态机,状态机将更新该状态中涉及的组件。

  2. 保留GKComponentSystems并使用状态机来处理组件,例如MovementComponent 在进入和退出 Normal 状态时在组件系统中添加和删除 。

选项 1很简单,但从长远来看,当我的结构变得更复杂时可能会导致问题,因为某些组件可能需要先于其他组件更新。让每个实体更新自己的组件会分散更新过程。

选项 2在某种程度上也会让人感到困惑,但我最关心的是组件的创建/删除。我是只将它们从GKComponentSystems实体中取出还是完全从实体中取出?最有效的方法是什么?

实际问题

我的哪个选项是最好的?有没有更好的方法呢。

4

1 回答 1

2

如果您GKComponentSystem用于执行更新,那么我会这样做。我认为一个组件应该每帧只更新一次。

从您的问题中不清楚您需要对 StateMachines 做什么,但没有理由不让它们直接参与您的GKEntity或包含在GKComponent类似 DemoBots IntelligenceComponent中。

于 2017-01-15T20:48:39.167 回答