当节点被取消初始化时,SCNAction.playAudio会导致崩溃

mau*_*ris 5 ios scenekit swift

我们SCNAction.playAudio在游戏中使用声明指出了崩溃的原因.如果playAudio在我们的游戏中调用任何语句,SCNScene/SCNView的取消初始化将随后随机触发此崩溃:

在此输入图像描述

我们如何播放音频:

func playAudioSource(from node: SCNNode, source audioSource: SCNAudioSource) {
    node.runAction(SCNAction.playAudio(audioSource, waitForCompletion: false))
}
Run Code Online (Sandbox Code Playgroud)

它显示了EXC_BAD_ACCESS存在CPP3DAudioEngine::RemoveContext.我们正在使用SceneKit和Swift 3开发iOS 10.3.

Ale*_*ano 5

您应该提供更多代码以更好地了解游戏中发生的情况,但您肯定可以通过以下方式纠正您的功能:

func playAudioSource(from node: SCNNode, source audioSource: SCNAudioSource) {
    if let _ = node.parent, node.action(forKey: "playAudio") == nil {
        node.runAction(SCNAction.playAudio(audioSource, waitForCompletion: false),forKey:"playAudio")
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以防止在已经启动或执行的操作时启动操作,并检查您的节点是否已经连接到它的父节点(这可能很有用,它取决于您启动此代码的位置..)

  • 尝试添加更多代码,尤其是启动此playAudioSource的部分,确切地说,这是因为CPP3DAudioEngine仅在特定情况下removeContext. (2认同)