是否可以像 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:)
,是插入游戏循环逻辑的正确位置。
关于您的问题:SCNScene
和 SCNNode
都没有自己的更新方法。如果您同时使用 SceneKit 和 SpriteKit,则如上所述,为游戏循环逻辑留一个位置就足够了(但不是必需的),因此您的示例看起来是正确的。
确切地说,是有区别的,尽管渲染循环方法看起来很相似:
在 SpriteKit scene 中调用渲染循环:SKSceneDelegate
's update(_:)
在 SceneKit view(或其他 SCNSceneRenderer
)调用渲染循环:SCNSceneRendererDelegate
's renderer(_: updateAtTime:)
虽然在 SpriteKit 视图中有 SKViewDelegate
的 view(_:shouldRenderAtTime:)
如果应该调用渲染循环,则必须返回 true。 SKScene
的委托只是为了避免 SKScene
的子类化而存在。
如果您希望更精确地控制更新逻辑,我建议您使用独立于 SceneKit/SpriteKit 的 GameplayKit,并允许轻松进行 per-entity/per-component 更新以及实体/组件重用和其他好处。
【讨论】:
这正是我需要的GameplayKit谢谢以上是关于是否可以像 SKScene 一样在 SCNScene 或 SCNNode 中使用“update(_ currentTime: TimeInterval)”?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 SKScene 数组实现 iCarousel?
在 SKScene 上运行 SKTransition 是不是会破坏源 SKScene?