sprite-kit - GKEntity/组件更新周期最佳实践

标签 sprite-kit swift3 gameplay-kit

主题

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

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

元素

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

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

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

我的情况

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

State cycle

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

如果我回到我的实体,因为我一次创建所有内容并使用 GKComponentSystems要更新组件,我的组件的更新方法加载了 guardif-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/

    相关文章:

    swift - CUI目录 : Invalid Request: requesting subtype without specifying idiom (Where is it coming from and how to fix it? )

    ios - SKSpriteNode 创建一条彩色细线

    ios - SKCropNode 获取裁剪部分作为 SKSpriteNode

    ios - Swift 3 - 没有更多上下文的序列不明确

    ios - GameplayKit-[GKGraph dealloc] : crash on iOS9. 2

    swift - SKAction 每次被调用两次(Swift 3)

    swift - readWithCallback 函数在 swift 3 中不起作用

    ios - 如何在 swift 3.0 中使用 UnSafeRawPointer

    swift - GKShuffledDistribution - 使用上限不会用尽所有可能的值吗?