自定义 SKScene 未在 AR 中显示
Custom SKScene is not displaying in AR
我已经通过 SpriteKit 创建了 SKScene,并像 2D 应用程序一样对其进行了测试。这是我的 viewController。一切正常。
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size: CGSize(width: 2560, height: 2560))
scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
scene.scaleMode = .aspectFit
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.presentScene(scene)
}
}
SKScene(GameScene)比较简单,它的结构:SKScene - SKNode - SKTileMapNode。
我的目标是在表面的 AR 中显示这个场景。在 AR 应用程序中,我遇到了一个问题,即我的自定义 SKScene 没有显示,它只是空白屏幕。 custom SKScene I decided to check default SKScene: I created static Grid (Map) in .sks file and loaded it instead of my dynamic custom SKScene. It displays perfectly. static SKScene from .sks
这是我加载场景的代码。
func addField(_ hitResult: ARHitTestResult, _ grid: Grid) {
let gameScene = SKScene(fileNamed: "Scene") // Static .sks (OK)
// let gameScene = GameScene(size: CGSize(width: 2560, height: 2560)) // Custom SKScene (Nope)
// gameScene.anchorPoint = CGPoint(x: 0.5, y: 0.5) // Custom SKScene (Nope)
// gameScene.scaleMode = .aspectFit // Custom SKScene (Nope)
let plane = SCNPlane(width: 0.5, height: 0.5)
plane.firstMaterial?.diffuse.contents = gameScene
plane.firstMaterial?.isDoubleSided = true
let paintingNode = SCNNode(geometry: plane)
paintingNode.transform = SCNMatrix4(hitResult.anchor!.transform)
paintingNode.eulerAngles = SCNVector3(paintingNode.eulerAngles.x + (-Float.pi / 2), paintingNode.eulerAngles.y, paintingNode.eulerAngles.z)
paintingNode.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
sceneView.scene.rootNode.addChildNode(paintingNode)
grid.removeFromParentNode()
}
所以我不明白为什么我的 GameScene 没有显示。可能问题出在 CGSize 中,我试图将其更改为 view.bounds.size 但没有帮助。我只是不知道我还能在这里放什么。如果您需要更多代码,请询问。谢谢!
更新:我尝试将自定义 class 附加到 sks 文件,但它没有启动,所以没有效果。
解决方案: didMove 未在 AR 中启动,因此您需要手动将 SKScene 附加到父节点。
我已经通过 SpriteKit 创建了 SKScene,并像 2D 应用程序一样对其进行了测试。这是我的 viewController。一切正常。
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size: CGSize(width: 2560, height: 2560))
scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
scene.scaleMode = .aspectFit
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.presentScene(scene)
}
}
SKScene(GameScene)比较简单,它的结构:SKScene - SKNode - SKTileMapNode。
我的目标是在表面的 AR 中显示这个场景。在 AR 应用程序中,我遇到了一个问题,即我的自定义 SKScene 没有显示,它只是空白屏幕。 custom SKScene I decided to check default SKScene: I created static Grid (Map) in .sks file and loaded it instead of my dynamic custom SKScene. It displays perfectly. static SKScene from .sks
这是我加载场景的代码。
func addField(_ hitResult: ARHitTestResult, _ grid: Grid) {
let gameScene = SKScene(fileNamed: "Scene") // Static .sks (OK)
// let gameScene = GameScene(size: CGSize(width: 2560, height: 2560)) // Custom SKScene (Nope)
// gameScene.anchorPoint = CGPoint(x: 0.5, y: 0.5) // Custom SKScene (Nope)
// gameScene.scaleMode = .aspectFit // Custom SKScene (Nope)
let plane = SCNPlane(width: 0.5, height: 0.5)
plane.firstMaterial?.diffuse.contents = gameScene
plane.firstMaterial?.isDoubleSided = true
let paintingNode = SCNNode(geometry: plane)
paintingNode.transform = SCNMatrix4(hitResult.anchor!.transform)
paintingNode.eulerAngles = SCNVector3(paintingNode.eulerAngles.x + (-Float.pi / 2), paintingNode.eulerAngles.y, paintingNode.eulerAngles.z)
paintingNode.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
sceneView.scene.rootNode.addChildNode(paintingNode)
grid.removeFromParentNode()
}
所以我不明白为什么我的 GameScene 没有显示。可能问题出在 CGSize 中,我试图将其更改为 view.bounds.size 但没有帮助。我只是不知道我还能在这里放什么。如果您需要更多代码,请询问。谢谢!
更新:我尝试将自定义 class 附加到 sks 文件,但它没有启动,所以没有效果。
解决方案: didMove 未在 AR 中启动,因此您需要手动将 SKScene 附加到父节点。