我正在使用SceneKit构建一个3D游戏场景,我希望像#" hud"在顶部,为了使其工作,我使用子视图和overlaySKScene
构建了我的ViewController,如下所示:
class ViewController:UIViewController {
var sceneView: SCNView!
var mainScene = MainScene() // <- SCNScene
var spriteScene: OverlayScene! // <- SKScene
override func viewDidLoad() {
super.viewDidLoad()
self.sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
self.sceneView.scene = mainScene
self.sceneView.backgroundColor = UIColor.clear
self.view.addSubview(self.sceneView)
self.spriteScene = OverlayScene(size: self.view.bounds.size)
self.sceneView.overlaySKScene = self.spriteScene
}
}
我有一些关于如何以正确的方式做到这一点的问题,因为我遇到了一些看似不寻常的事情。
首先,让我说我需要做一个segue,我似乎并不清楚如何实际观察{{1}中某个SpriteKit节点上的点击然后更改主父ViewController的控制器。我还没有找到任何描述类似情况的在线资源。
以下是OverlayScene
的精简版:
OverlayScene
答案 0 :(得分:1)
我没有直接回答你的两个问题,而是我会处理你的大问题,即你想在游戏中使用HUD。用户界面。我从来没有做过Scenekit
游戏,但是我做了Spritekit
游戏,HUD是一个聪明的把戏。让我解释一下。
想象一下,你站在镜头后面,透过镜头观察相机的样子。你看到它前面的场景。现在拿一张纸,在中间切出一个长方形的盒子,然后画上剩下的周边。将这张纸贴在相机前面并仔细观察。你仍然可以看到场景(现在稍微小一点),但现在你也看到了带有图纸的纸张。这就是HUD如何为游戏工作。
我做了一些搜索,SpriteKit
和SceneKit
都有camera
。在sceneKit中,您可以创建一个camera node
并将场景的视点设置为该摄像机。这表示观看场景的玩家。
我不确定它是否在SceneKit
中以相同的方式工作,但在SpriteKit
中,您可以将节点添加到将锁定到位的相机中。这些成为你的HUD元素(按钮,分数等)。由于这些都是camera
的子节点,因此当您移动相机时它们会移动,因此感觉它们是静态HUD。这就是你如何实现HUD。阅读SceneKit
相机的文档,因为这有助于您了解如何实现相同的效果。
我曾经也想过按照你现在的方式去做这件事,并且将SceneKit
和SpriteKit
混合在一起非常痛苦,所以我会谨慎对待它。
此外,虽然您可以混合使用Interface Builder和SpriteKit
,但我会谨慎对待它。它基本上毁了我的第一场比赛变成了一个混乱的车。如果您决定使用Interface Builder,请尝试将其限制为菜单屏幕和选项屏幕。但是,我发现以编程方式创建所有内容可以让您获得更顺畅,更清晰,无错误的体验。
希望这有帮助!
答案 1 :(得分:0)
我找到了一个可以解决我的问题的解决方案,可能会遇到同样的问题(我认为很多例子可能会以我的方式展示叠加场景作为子视图添加。
首先,我tapHandler
中的viewController
需要将属性cancelsTouchesInView
设置为false。这将允许底层视图接收手势。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
tapGesture.cancelsTouchesInView = false
sceneView.addGestureRecognizer(tapGesture)
所有子视图都没有发生这种情况的原因是因为我依赖的视图大小占框架的100%,覆盖了底层的视图,而不仅仅是让视图占据较小的屏幕区域,就像按钮或记分板,如示例文档中所示。