如何在我的 Scenekit.scene 之上创建 HUD

Posted

技术标签:

【中文标题】如何在我的 Scenekit.scene 之上创建 HUD【英文标题】:How do I create a HUD on top of my Scenekit.scene 【发布时间】:2014-08-16 15:18:12 【问题描述】:

我正在试验 Swift 和 Scenekit。 构建 Mac OS X 应用程序。 让 3d 场景工作似乎很容易。 但是没有某种 2D 高分、雷达显示、速度指示器等的场景是什么? 我希望 SpriteKit 场景能够无缝集成到 SceneView 中,但我发现文档对此不太清楚..

我能想到的最明显也是唯一的方法是将 SKView 放在 SceneView 上并分别渲染。 但是有没有更优雅的方式呢?

【问题讨论】:

查看 WWDC 14 的示例代码。它在 Scene Kit 之上使用 Sprite Kit 显示 HUD。 【参考方案1】:

试试

scnView.overlaySKScene = aSKScene;

(参见 SCNSceneRenderer.h) 这是推荐的方式。另一种方法是支持 SCNView 层并添加子视图或层(但这效率较低)。

【讨论】:

+1 :) 您可以在the docs 和Bananas 和Vehicle 示例代码项目中找到更多信息。 SK 叠加的另一个好处是您可以使您的 HUD 跨平台,而不是在 ios 上使用 UIKit 和在 OS X 上使用 AppKit。 我查看了 Bananas 示例项目。它无法运行。你能在 10.9.3 上运行代码吗? swift 是否有等效的“overlaySKScene”? SceneKit/SpriteKit 集成是 10.10 的功能,您在 Bananas 中看到的其他一些功能也是如此。不过,该项目确实有一个 iOS 目标,因此您也可以尝试在 iOS 8 测试版设备上运行它。【参考方案2】:

要创建 HUD,请执行以下操作:

// SKContainerOverlay is a class which inherits from SKScene

    SKContainerOverlay *skContainerOverlay = [[SKContainerOverlay alloc] initWithSize:self.sceneView.bounds.size];
    self.sceneView.overlaySKScene = skContainerOverlay;
    self.sceneView.overlaySKScene.hidden = NO;
    self.sceneView.overlaySKScene.scaleMode = SKSceneScaleModeResizeFill; // Make sure SKScene bounds are the same as our SCNScene
    self.sceneView.overlaySKScene.userInteractionEnabled = YES;

您可以在自定义 SKContainerOverlay 类中创建所有 SKLabelNode 对象。

【讨论】:

感谢您提供真实的答案,而不是指向文档或示例应用程序。【参考方案3】:

正如上面@Toyos所说,你可以使用

scnView.overlaySKScene = aSKScene

在您的 SCNView 上叠加 SKScene。

但是,当我在 Swift 中尝试此操作时,我发现 overlaySKScene 属性只有在包含 import SpriteKit 语句时才可见。

【讨论】:

【参考方案4】:

正如@Toyos 回答的那样,使用scnView.overlaySKScene 很简单。如果你想要一个例子,你可以在他们的Bananas demo 中查看 Apple 是如何做到的。

【讨论】:

以上是关于如何在我的 Scenekit.scene 之上创建 HUD的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UI 元素保留在 UIViewController 及其呈现的 ViewController 之上?

如何在离子中将图像叠加在另一个图像之上

如何让PopupWindow显示在Dialog之上,我说的之上是指上层

将 Storyboard 的视图置于所有其他视图之上

如何在 UITableViewController 之上添加 UIView [关闭]

如何在颤振应用程序之上覆盖小部件?