1

我正在开发一款需要同时使用 SceneKit 和 SpriteKit 的 iOS 游戏,并且想知道渲染/更新循环功能。

我将使用 SpawnController 类来生成不同类型的对象,它们将基于时间间隔。

现在我有一个符合 SCNSceneRendererDelegate 的 GameViewController ,就像这里一样, 我已经对其进行了修改,以便在委托更新函数中调用我的 SpawnController 的自定义更新函数,如下所示:

extension GameViewController: SCNSceneRendererDelegate {
    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        mySpawnController.nextSpawn()
    }
}

我觉得必须有更好的方法来做到这一点,例如将委托添加到 SCNScene 或 SCNNode。

我的问题:

是否可以像 SKScene 一样为 SCNScene 或 SCNNode 提供“update(_ currentTime: TimeInterval)”?或者我应该继续从我的 GameViewController 中的一个 SCNSceneRendererDelegate 更新函数调用自定义添加的更新函数?

谢谢

4

1 回答 1

2

,SCNView符合对分配委托的SCNSceneRendererDelegate调用renderer(_: updateAtTime:),并且是插入游戏循环逻辑的正确位置。

关于您的问题:既SCNScene没有也没有SCNNode自己的更新方法。如果您同时使用 SceneKit 和 SpriteKit,则如上所述,为游戏循环逻辑留一个位置就足够了(但不是必需的),因此您的示例看起来是正确的。

确切地说,虽然渲染循环方法看起来很相似,但还是有区别的:

  • 在 SpriteKit场景中调用渲染循环:SKSceneDelegate'supdate(_:)
  • 在 SceneKit视图(或其他SCNSceneRenderer)调用渲染循环:SCNSceneRendererDelegaterenderer(_: updateAtTime:)

而在 SpriteKit 视图中SKViewDelegateview(_:shouldRenderAtTime:)如果应该调用渲染循环,则必须返回 true。SKScene的委托只是为了避免子类化而存在SKScene

如果您希望更精确地控制更新逻辑,我建议您使用独立于 SceneKit/SpriteKit 的GameplayKit ,它允许轻松地按实体/按组件更新以及实体/组件重用和其他好东西。

于 2017-02-07T14:22:45.137 回答