代码之家  ›  专栏  ›  技术社区  ›  Uplink001

SceneKit:定位音频不起作用

  •  2
  • Uplink001  · 技术社区  · 6 年前

    我试图让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 回复  |  直到 6 年前
        1
  •  1
  •   Andy Jazz    6 年前

    试着这样做:

    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 }