怎样清空Three中已添加过的声音

怎样清空Three中已添加过的声音

我在页面中多次执行这个方法,就会有多个声音播放,怎样清空Three中已添加过的声音?希望可以通过邮件告诉我,谢谢。937681195@qq.com


 function onlySound() {
        const listener = new THREE.AudioListener();
        // 创建一个全局 audio 源
        const sound = new THREE.Audio(listener);
        // 加载一个 sound 并将其设置为 Audio 对象的缓冲区
        const audioLoader = new THREE.AudioLoader();
        audioLoader.load(mp3, function (buffer) {
            sound.setBuffer(buffer);
            sound.setLoop(true);
            sound.setVolume(0.5);
            sound.play();
        });
    }

参考GPT和自己的思路:

您可以通过调用 stop() 方法来停止正在播放的声音,并调用 disconnect() 方法来断开与音频源的连接,从而清空Three中已添加过的声音。可以按照以下步骤实现:

  1. 在函数 onlySound() 中,将 sound 对象声明成全局变量,以便之后可以访问。
  2. 在调用 onlySound() 函数之前,定义一个新的函数,例如 stopSound(),在其中调用 sound.stop()sound.disconnect() 方法来停止并断开音频源。
  3. 每次调用 onlySound() 函数之前,调用 stopSound() 函数来清空之前添加的声音。

下面是示例代码:

var sound; // 全局变量

function onlySound() {
  const listener = new THREE.AudioListener();
  sound = new THREE.Audio(listener);
  const audioLoader = new THREE.AudioLoader();
  audioLoader.load(mp3, function (buffer) {
    sound.setBuffer(buffer);
    sound.setLoop(true);
    sound.setVolume(0.5);
    sound.play();
  });
}

function stopSound() {
  if (sound) {
    sound.stop();
    sound.disconnect();
  }
}

您可以在需要清空声音时调用 stopSound() 函数,如下所示:

stopSound(); // 清空已添加的声音
onlySound(); // 添加新的声音

要清空在Three中已经添加过的声音,可以尝试按照以下步骤进行操作:

1. 将声音对象添加到一个数组中,例如const sounds = [];

2. 在audioLoader.load方法中,将加载完成的声音对象添加到数组中,例如sounds.push(sound);

3. 在需要清空声音的地方,遍历数组并调用stop方法停止所有声音的播放,例如:

function stopAllSounds() {
  sounds.forEach(sound => {
    sound.stop();
  });
  sounds.length =0; // 清空数组
}

注意,在每次执行onlySound方法时,需要先调用stopAllSounds方法停止之前的所有声音的播放并清空数组,然后再加载新的声音。这样可以避免多次执行onlySound方法导致声音重复播放的问题。