如何在 Swift 中将 SKScene 覆盖在 SCNScene 上?
Posted
技术标签:
【中文标题】如何在 Swift 中将 SKScene 覆盖在 SCNScene 上?【英文标题】:How can I overlay a SKScene over a SCNScene in Swift? 【发布时间】:2016-04-07 15:48:39 【问题描述】:网上有一些overlay教程,都是用的
overlaySKScene
在某个时候。
这在我的项目中是不可能的,因为(我猜)我的视图在任何时候都不使用SCNView
的构造函数(overlaySKScene
是其中的一部分)。
在ViewController的viewDidLoad中,基本上只创建了MainScene:
viewDidLoad()
self.sceneView = MainScene(view: self.view))
...在这里(注意:SCNScene 而不是 SCNView):
class MainScene: SCNScene, SCNPhysicsContactDelegate ...
init(view:UIView)
scnView = view as! SCNView
super.init()
scnView.scene = self; (...)
场景已完美创建,我现在想叠加一个 SKScene。有人知道怎么做吗?
【问题讨论】:
场景和视图是两个不同的东西,self.sceneView 不应该 = MainScene 如果 overlaySKScene 不工作,那是因为您没有将 SpriteKit 导入 MainScene 代码 【参考方案1】:SpriteKit 覆盖在 SceneKit 视图上,而不是在 SceneKit 场景上。这有点令人困惑,因为您在视图上叠加了一个场景。
我看到几个可能的错误来源:
self.sceneView = MainScene(view: self.view))
按照定义返回一个SCNScene
。您将其分配给需要 SCNView
的属性。
线
scnView = view as! SCNView
除非view
返回正确连接的SCNView
实例,否则将崩溃。但是您编写的init
定义需要UIView
。
在某个地方,您需要将您的视图设为SCNView
。该视图,因为它符合SCNSceneRenderer
协议,将有一个overlaySKScene
属性(overlaySKScene
来自该协议,而不是来自SCNView
)。您可以在此处分配 SKScene
实例。
如果你这样做了,那么你的代码看起来像
scnView.scene = self
scnView.overlaySKScene = theSKScene
我有一个SKScene
覆盖在SCNView
https://github.com/halmueller/ImmersiveInterfaces/tree/master/Tracking%20Overlay 上的简单示例
另见How do I create a HUD on top of my Scenekit.scene。
【讨论】:
谢谢你的好例子!!但是如何在场景中添加多个叠加层?在提供的示例中,仅添加了一个叠加层。如何为多个文本和多个节点重用提供的示例(github.com/halmueller/ImmersiveInterfaces/tree/master/…)中提供的相同 InformationOverlayScene? 叠加场景可以任意复杂。如果您认为您需要多个场景,那就值得提出自己的问题。以上是关于如何在 Swift 中将 SKScene 覆盖在 SCNScene 上?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift 正确切换 SpriteKit 中的 SKScene?
如何在 Swift Playgrounds 中使用带有纹理的 SKNode 设置 SKScene?
如何从 Swift SpriteKit 中的另一个 SKScene 访问变量