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 ?