2 votes

SceneKit : l'audio positionnel ne fonctionne pas

J'essaie de faire en sorte que SceneKit joue un son de pas à chaque fois qu'un de mes personnages se déplace. Au fur et à mesure qu'il se rapproche (du joueur), le volume du son doit augmenter.

Voici comment je configure ma source audio :

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
}()

Pour jouer l'audio, j'ai d'abord essayé d'utiliser playAudioSource, en donnant une clé à l'action et en essayant de la supprimer à chaque fois que le personnage s'arrête. Malheureusement, même la suppression de l'action ne semblait pas arrêter la lecture de l'audio, alors j'ai fait ceci à la place :

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()
            }
        }
    }
}

Les fichiers audio sont mono car j'ai découvert que l'audio positionnel ne fonctionne pas avec l'audio à double canal. La propriété shouldStream est fixée à false.

Cela fonctionne la plupart du temps. Malheureusement, si le nœud commence trop loin du joueur, l'audio des pas ne commencera pas à jouer et lorsqu'il s'approchera, aucun son ne sera entendu. Qu'est-ce qui ne va pas ?

1voto

Gigantic Points 4447

Essayez cette méthode :

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)

Et n'oubliez pas audio listener node - le nœud représentant la position de l'auditeur dans la scène, à utiliser avec les effets audio positionnels.

var audioListener: SCNNode? { get set }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X