如何在 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?

从另一个文件中的 SKScene 中删除 UIView

如何从 Swift SpriteKit 中的另一个 SKScene 访问变量

如何将动作从 SKScene 组件传播到 UIViewController

swift2 SKScene 类的对象如何将大小作为参数?