我正在开发一款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更新函数调用自定义添加的更新函数吗?
由于
答案 0 :(得分:1)
SCNView
,符合SCNSceneRendererDelegate
调用已分配代理的renderer(_: updateAtTime:)
,并且它是插入游戏循环逻辑的正确位置。
关于您的问题:SCNScene
和SCNNode
都没有自己的更新方法。如果你同时使用SceneKit和SpriteKit,如上所述,为游戏循环逻辑设置一个位置就足够了(但不是必须的),所以你的例子看起来是正确的。
准确地说,虽然渲染循环方法看起来很相似但存在差异:
SKSceneDelegate
' s update(_:)
SCNSceneRenderer
)调用渲染循环:SCNSceneRendererDelegate
' s renderer(_: updateAtTime:)
在SpriteKit视图中有SKViewDelegate
' s view(_:shouldRenderAtTime:)
,如果应该调用render循环,它必须返回true。 SKScene
的委托只是为了避免SKScene
的子类化而存在。
如果您希望更精确地控制更新逻辑,我建议使用独立于SceneKit / SpriteKit的GameplayKit,并允许轻松per-entity/per-component更新以及实体/组件重用和其他好东西