音频播放bug

  • Creator 版本:2.1.3

  • 目标平台: Web

  • 详细报错信息,包含调用堆栈:不报错

  • 重现方式:
    1、准备两个音频,一个拖动到节点上(音频A),一个通过动态加载(音频B)(注意设置成DOM Audio模式)的形式获取(见下面的代码)
    2、然后先播放节点上的音频A,此时正常
    3、然后再播放动态加载的音频B,此时播放的仍然是音频A

  • 出现概率:100%

play (type) {
        const cpt = this.getComponent(cc.AudioSource)
        if (type.startsWith('tts')) {
            // 这里是动态加载的资源,并且加载模式设置为 DOM Audio,
            // 如果设置为 Web Audio 则没有此 bug
            cc.loader.loadRes(type, cc.AudioClip, (err, audioClip) => {
                if (!err && audioClip) {
                    cpt.clip = audioClip
                    cpt.play()
                }
            })
        } else {
            // 这里是 Node 上的 AudioClip,如果先播放了这里的音频
            // 后续再播放上面动态加载的音频则实际播放出来的仍然是当前这个音频
            const audioSrc = this[`${type}Clip`]
            if (audioSrc) {
                cpt.clip = audioSrc
                cpt.play()
            }
        }
    }

可能是你scene延时加载资源的原因,可能cpt.clip = audioSrc这句话执行需要过程,没来得及换就播放之前的了。你可以试试把scene的延时加载资源给去掉,或者不想去的话,也可以在需要更改AudioClip的值的时候把整个AudioSource组件都给remove再add,这样就能换掉AudioClip了

还是提供个demo吧,我这边复现不出你说的情况