主题
我的问题是关于在结合 Apple 的框架时更新周期的划分,以便尊重该主题的典型模式和良好实践,因为大多数文档和示例代码还没有适应 Swift(或者至少我可以)在任何地方都找不到)。
在 GameplayKit 中有很多方法可以管理更新周期,我不太确定什么是组合所有内容的好方法。
元素
首先也是最重要的:实体/组件中的每个类(GKComponent
和 GKEntity
(子)类)都有一个 update()
您可以覆盖以执行每帧更新的方法。这必须来自当前 GKScene
的更新周期。/SKScene
.
然后你有 GKComponentSystem
可以用来启动 update()
已添加到给定类型的每个组件的方法。我明白了,这很方便。
但我也想使用状态机系统,它也有自己的更新周期......结合所有让我感到困惑的东西。
我的情况
在我有 GKEntity
的子类的情况下带有 GKStateMachine
的实例在初始化时创建。状态机有几个状态(目前:“Spawn”、“Normal”、“Stunned”和“Death”。
现在,我正在用我的 GKEntity
制作一个大的“千篇一律”。子类并创建它将在初始化期间使用的所有组件。但它变得非常不切实际。例如,我有一个 MovementComponent
,它是 GKAgent2D
的子类.我创建了一个管理实体创建的单例,所以在创建实例之后,if 循环遍历所有实体的组件并将它们添加到相关的 GKComponentSystems
.单例有一个它自己的 update() 方法,更新将调用传递给 GKComponentSystems
.我使用的一些组件不需要每帧更新,所以没有 GKComponentSystem
已为它们创建,我根据需要手动更新它们。
如果我回到我的实体,因为我一次创建所有内容并使用 GKComponentSystems
要更新组件,我的组件的更新方法加载了 guard
和 if-let
声明,因为我需要访问实体的状态机,检查它是否是实体可以移动的状态(正常状态)并执行其操作或转义函数。这在我看来效率不高:移动组件在生成、眩晕或死亡时不需要更新。
最重要的是,它使我使用了 GKStateMachine
完全矫枉过正,因为我的更新方法是空的:组件由 GKComponentSystem
更新反正。
我的想法
GKComponentSystems
完全而简单地遍历我所有的实体(如果需要,可能在某个时候将它们分类到不同的集合中)并调用它们的 update()
方法。将更新发送到状态机,状态机将更新该状态中涉及的组件。 GKComponentSystems
并使用状态机来处理组件,例如通过添加和删除 MovementComponent
从组件系统进入和退出正常状态时。 选项 1 很简单,但从长远来看,当我的结构变得更复杂时可能会导致问题,因为某些组件可能需要先于其他组件更新。让每个实体更新自己的组件会分散更新过程。
选项 2 在某种程度上也会让人感到困惑,但我最关心的是组件的创建/删除。我只能将它们从
GKComponentSystems
中取出吗?还是我将它们完全带出实体?最有效的方法是什么?实际问题
我的哪个选项是最好的?有没有更好的方法呢。
最佳答案
如果您使用 GKComponentSystem
执行更新,然后我会去。我认为一个组件应该每帧只更新一次。
从您的问题中不清楚您需要对 StateMachines 做什么,但没有理由不让它们直接参与您的 GKEntity
。或包含在 GKComponent
中像演示机器人 IntelligenceComponent .
关于sprite-kit - GKEntity/组件更新周期最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41665333/