SceneKit:位置音频不起作用

时间:2018-05-28 13:06:15

标签: swift audio scenekit

每次我的一个角色移动时,我都试图让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。

这在大多数时候都有效。不幸的是,如果节点从播放器开始太远,脚步音频将不会开始播放,当它们实际接近时,将听不到声音。我做错了什么?

1 个答案:

答案 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 }