是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用 "update(_ currentTime: TimeInterval)"?

Is it possible to have "update(_ currentTime: TimeInterval)" in SCNScene or SCNNode the same way as SKScene?

我正在开发一款需要同时使用 SceneKit 和 SpriteKit 的 iOS 游戏,我想知道 Render/update 循环功能。

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

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

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

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

我的问题:

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

谢谢

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

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

准确地说,是有区别的,尽管渲染循环方法看起来很像:

  • 在 SpriteKit scene 中调用渲染循环:SKSceneDelegateupdate(_:)
  • 在 SceneKit view(或其他 SCNSceneRenderer)中调用渲染循环:SCNSceneRendererDelegaterenderer(_: updateAtTime:)

虽然在 SpriteKit 视图中有 SKViewDelegateview(_:shouldRenderAtTime:) 如果应该调用渲染循环,它必须 return 为真。 SKScene 的委托只是为了避免 SKScene.

的子类化而存在

如果您希望更精确地控制更新逻辑,我建议您使用 GameplayKit which is independent from SceneKit/SpriteKit and allows easy per-entity/per-component 更新以及 entity/component 重用和其他好东西。