【问题标题】:Is it possible to have "update(_ currentTime: TimeInterval)" in SCNScene or SCNNode the same way as SKScene?是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用“update(_ currentTime: TimeInterval)”?
【发布时间】:2017-06-24 12:03:48
【问题描述】:

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

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

现在我有一个符合 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 更新函数调用自定义添加的更新函数?

谢谢

【问题讨论】:

    标签: swift sprite-kit scenekit skscene scnscene


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2021-06-30
    • 2016-10-11
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多