SceneKit presentScene(_withTransition:incomingPointOfView completionHandler)与动态加载的SCNScene崩溃

时间:2015-12-27 15:56:59

标签: crash scenekit

我正在尝试从一个场景转换到另一个场景,但是当我打电话给presentScene时会发生崩溃! 场景不存储在类中或引用,它们直接加载到presentScene调用中。

Xcode崩溃的屏幕截图: crash screencap

我的简单小项目在这里:https://dl.dropboxusercontent.com/u/6979623/SceneKitTransitionTest.zip

MKScene只是SCNScene的一个子类,因为我想知道一个场景何时被删除以确定它是什么。

self.gameView!.scene = MKScene(named:"art.scnassets/scene1.scn")

然后我打电话给

let scnView:SCNView = self.gameView! as SCNView
let skTransition:SKTransition = SKTransition.crossFadeWithDuration(1.0)
skTransition.pausesIncomingScene = false
skTransition.pausesOutgoingScene = false
self.sceneToggler = !self.sceneToggler
// transition
scnView.presentScene((self.sceneToggler ? MKScene(named:"art.scnassets/scene1.scn")! : MKScene(named:"art.scnassets/scene2.scn")!), withTransition:skTransition, incomingPointOfView:nil, completionHandler:nil)

如果我在课堂上保留对场景的引用,那么它有效 - 但这不是我想要的。我只是想转换到另一个场景并将当前场景留下来。

为什么会崩溃? 这似乎只是一个简单的任务......

2 个答案:

答案 0 :(得分:4)

这是SceneKit中的一个错误。解决方法:在调用“presentScene”之前保留对传出场景的引用,并在该调用之后释放它。

答案 1 :(得分:3)

我能够通过一个更简单的项目重现你的崩溃。它不使用MKScene,也不使用通知来触发转换。它在第二次加载尝试时崩溃。

我已经在https://bugreport.apple.com以rdar:// 24012973提交了这个文件,您希望我与您的项目一起提交。

这是我简化的ViewController.swift。在SCNScene属性(第25/29行)或即时加载(第24/28行)之间切换可在正确和崩溃行为之间切换。也就是说,

        nextScene = SCNScene(named:"art.scnassets/scene2.scn")!

失败了,

        nextScene = scene2!

作品。

//  ViewController.swift
import Cocoa
import SceneKit
import SpriteKit

class ViewController: NSViewController {

@IBOutlet weak var sceneView: SCNView!
private var sceneToggler:Bool = false
private var scene1: SCNScene? = SCNScene(named:"art.scnassets/scene1.scn")
private var scene2: SCNScene? = SCNScene(named:"art.scnassets/scene2.scn")

private func nextSceneToLoad() -> SCNScene {
    let nextScene: SCNScene

    if (sceneToggler) {
        //nextScene = SCNScene(named:"art.scnassets/scene1.scn")!
        nextScene = scene1!
        print ("scene1")
    }
    else {
        nextScene = SCNScene(named:"art.scnassets/scene2.scn")!
        //nextScene = scene2!
        print ("scene2")
    }
    print (nextScene)
    sceneToggler = !sceneToggler
    return nextScene
}

override func mouseUp(theEvent: NSEvent) {

    let skTransition:SKTransition = SKTransition.fadeWithDuration(5.0)
    skTransition.pausesIncomingScene = false
    skTransition.pausesOutgoingScene = false
    sceneView.presentScene(nextSceneToLoad(),
        withTransition:skTransition,
        incomingPointOfView:nil, completionHandler:nil)


    super.mouseUp(theEvent)
}
}