SceneKit: позиционное аудио не будет работать - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь заставить 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 голосов
/ 28 мая 2018

Попробуйте следующим образом:

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 }
...