如何在 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 上?的主要内容,如果未能解决你的问题,请参考以下文章