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

Posted

技术标签:

【中文标题】是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用“update(_ currentTime: TimeInterval)”?【英文标题】:Is it possible to have "update(_ currentTime: TimeInterval)" in SCNScene or SCNNode the same way as SKScene? 【发布时间】: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 更新函数调用自定义添加的更新函数?

谢谢

【问题讨论】:

【参考方案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 更新以及实体/组件重用和其他好处。

【讨论】:

这正是我需要的GameplayKit谢谢

以上是关于是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用“update(_ currentTime: TimeInterval)”?的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 的界面构建器

是否可以使用 SKScene 数组实现 iCarousel?

在 SKScene 上运行 SKTransition 是不是会破坏源 SKScene?

SceneKit中的SKScene

如何在 SKScene 中呈现 UIViewController?

从 SKScene 中删除 iAd