每次我的一个角色移动时,我都试图让SceneKit发出一个脚步声。当它们靠近(对播放器)时,音频应该会增加音量。
这是我设置音频源的方式:
private lazy var stepAudioSource:SCNAudioSource = {
let tempAudioSource = SCNAudioSource(fileNamed: "art.scnassets/Audio/step_enemy.wav")!
tempAudioSource.volume = 0.3
tempAudioSource.rate = 0.1
tempAudioSource.loops = true
tempAudioSource.shouldStream = false
tempAudioSource.isPositional = true
return tempAudioSource
}()
为了播放音频,我尝试使用playAudioSource,给动作一个键,并在每次角色停止时尝试删除它。不幸的是,即使删除动作似乎也没有停止音频播放,所以我这样做了:
private var isWalking:Bool = false {
didSet{
if oldValue != isWalking {
if isWalking{
addAnimation(runAnimation, forKey: "run")
let sfxPlayer = SCNAudioPlayer(source: stepAudioSource)
characterNode.addAudioPlayer(sfxPlayer)
}else{
removeAnimation(forKey: "run", blendOutDuration: 0.2)
removeAllAudioPlayers()
}
}
}
}
音频文件是单声道的,因为我发现定位音频不适用于双声道音频。 shouldStream属性设置为false。
这在大多数时候都有效。不幸的是,如果节点从播放器开始太远,脚步音频将不会开始播放,当它们实际接近时,将听不到声音。我做错了什么?
答案 0 :(得分:1)
尝试这种方式:
let tempAudioSource = SCNAudioSource(fileNamed: "art.scnassets/Audio/step_enemy.wav")!
tempAudioSource.volume = 0.3
tempAudioSource.rate = 0.1
tempAudioSource.loops = true
tempAudioSource.isPositional = true
tempAudioSource.shouldStream = false
tempAudioSource.load() //loads audio data and prepares it for playing...
let player = SCNAudioPlayer(source: tempAudioSource)
whatEverNode.addAudioPlayer(player)
并且不要忘记audio listener
节点 - 表示侦听器在场景中的位置以用于定位音频效果的节点。
var audioListener: SCNNode? { get set }