是否可以更新(_ currentTime:TimeInterval)"在SCNScene或SCNNode中的方式与SKScene相同?

时间:2017-02-07 09:48:44

标签: swift sprite-kit scenekit skscene scnscene

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

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

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

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

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

我的问题:

是否可以更新(_ currentTime:TimeInterval)" SCNScene或SCNNode的方式与SKScene相同吗? 或者我应该继续从我的GameViewController中的一个SCNSceneRendererDelegate更新函数调用自定义添加的更新函数吗?

由于

1 个答案:

答案 0 :(得分:1)

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

关于您的问题:SCNSceneSCNNode都没有自己的更新方法。如果你同时使用SceneKit和SpriteKit,如上所述,为游戏循环逻辑设置一个位置就足够了(但不是必须的),所以你的例子看起来是正确的。

准确地说,虽然渲染循环方法看起来很相似但存在差异:

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

在SpriteKit视图中有SKViewDelegate' s view(_:shouldRenderAtTime:),如果应该调用render循环,它必须返回true。 SKScene的委托只是为了避免SKScene的子类化而存在。

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