使用fileNamed初始化SKAudioNode会返回nil



这是我第一次使用SKAudioNode。首先,我在GameScene类的顶部声明了一个属性:

var backgroundMusic: SKAudioNode!

现在我添加了一个辅助方法:

func playBackgroundMusic(name: String) {
    if backgroundMusic != nil {
        backgroundMusic.removeFromParent()
    }
    backgroundMusic = SKAudioNode(fileNamed: name)
    backgroundMusic.autoplayLooped = true
    addChild(backgroundMusic)
}

现在我把这种方法称为:

playBackgroundMusic("ABC.caf")

它在这条线上抛出了一个致命错误:

backgroundMusic.autoplayLooped = true

正在说:在展开可选值时意外发现nil。

我确实确保了以下

  • ABC.caf在我的项目中,列在副本捆绑包资源中
  • 它拼写正确

现在,我还应该在哪里检查错误?

编辑:

以下是我的配置信息:

  • Xcode 7.3
  • 带有iOS 9.3.2的iPhone
  • iOS 9.3模拟器

设备和模拟器都不工作。

第2版:

我将代码更改为以下代码:

func playBackgroundMusic(name: String) {
    if backgroundMusic != nil {
        backgroundMusic.removeFromParent()
    }
    let temp = SKAudioNode(fileNamed: name)
    temp.autoplayLooped = true
    backgroundMusic = temp
    //backgroundMusic = SKAudioNode(fileNamed: "SpaceGame.caf")
    //backgroundMusic.autoplayLooped = true
    addChild(backgroundMusic)
}

现在我的应用程序不再崩溃,但它没有声音。有什么想法吗?

附言:在我上次编辑这个问题几分钟后,我试着用替换这个方法中的所有内容

runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))

仍然没有声音。也许是声音文件有问题?

我刚刚遇到这个问题。显然,它现在只适用于局部变量。以下代码有效。

var background:SKAudioNode!
override func didMoveToView(view: SKView) {
    let bg = SKAudioNode(fileNamed: "bg.mp3")
    addChild(bg)
    background = bg
}

我用上面EDIT2中的代码修复了这个问题:

func playBackgroundMusic(name: String) {
    if backgroundMusic != nil {
        backgroundMusic.removeFromParent()
    }
    let temp = SKAudioNode(fileNamed: name)
    temp.autoplayLooped = true
    backgroundMusic = temp
    //backgroundMusic = SKAudioNode(fileNamed: "SpaceGame.caf")
    //backgroundMusic.autoplayLooped = true
    //addChild(backgroundMusic)
    runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))
}

对于没有声音的部分,只需确保iPhone上的侧开关没有处于红色。

我在SKAudioNode(fileNamed:)上遇到了类似的问题,从自动完成和我遇到的问题来看,有两个不同的初始化程序具有相同的参数签名,一个返回SKAudioNode,一个则返回SKNode,但我不知怎的弄错了。我改为使用SKAudioNode(url:)(使用Bundle.main.url(forResource:withExtension:)获取URL),一切都按预期进行。

已经有几年了,但这次我发现构造函数SKAudioNode()加载声音需要一些时间,无论它有多大。即使是50kByte的小声音文件也需要0.25秒才能加载。在最初使用之后,所有后续的声音加载只需要该时间的一小部分。我猜SpriteKit会对应用程序文件中的所有声音进行缓存。

因此,为了解决第一个延迟声音的问题:像我在菜单上一样播放它们——音量为零,长度为零。

我的实验表明,预播放20个声音文件也需要0.25秒我的Xcode 11模拟器来初始化。所以我再次猜测,预先播放一个(!)声音告诉iOS将所有声音文件预先加载到内存中。

最新更新