这是我第一次使用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。
我确实确定了以下内容
现在我应该在哪里检查错误?
修改
以下是我的配置信息:
设备和模拟器都不起作用。
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)
}
现在我的应用程序不再崩溃,但它没有声音。有什么想法吗?
P.S。在我上次编辑该问题后的几分钟,我尝试用以下方法替换该方法中的所有内容:
runAction(SKAction.playSoundFileNamed(name, waitForCompletion: false))
仍然没有声音。也许声音文件存在问题?
答案 0 :(得分:12)
我刚遇到这个问题。显然,它现在只适用于局部变量。以下代码有效。
var background:SKAudioNode!
override func didMoveToView(view: SKView) {
let bg = SKAudioNode(fileNamed: "bg.mp3")
addChild(bg)
background = bg
}
答案 1 :(得分:0)
我在SKAudioNode(fileNamed:)
上遇到了类似的问题,从自动完成功能来看,从我遇到的问题来看,好像有两个具有相同参数签名的截然不同的初始化程序,一个返回SKAudioNode
,另一个返回SKNode
,我莫名其妙地弄错了。我改用SKAudioNode(url:)
(使用Bundle.main.url(forResource:withExtension:)
获取URL),一切按预期进行。
答案 2 :(得分:0)
已经有好几年了,但是我发现构造函数SKAudioNode()花费一些时间来加载声音-不管声音多大。甚至一个50 kByte的小声音文件也需要0.25秒来加载。初次使用后,声音的所有后续加载仅花费该时间的一小部分。 我猜想SpriteKit会对应用程序文件中的所有声音进行一些缓存。
因此,要解决第一个延迟声音的问题:像在菜单上一样播放它们-音量为零,长度为零。
我的实验表明-在Xcode 11模拟器中初始化20个声音文件也需要0.25秒的时间来播放。因此,我再次猜测,预播放一个(!)声音会告诉iOS将所有声音文件预加载到内存中。