Остановите все аудиоисточники в каждой сцене в Unity - PullRequest
0 голосов
/ 24 января 2019

Я хочу отключить все аудиоисточники в единстве из главного меню моей игры и заставить его влиять на все сцены в игре, нажимая кнопку. А также я хотел бы включить его, нажав на другую кнопку (кнопка отключения звука и кнопка включения звука). Мне удалось сделать это с помощью функции AudioListener.pause. Но когда я воспроизводю звук с помощью! AudioListener.pause, он действует так, как будто он возобновляет звук и воспроизводит весь звук, который был приостановлен, создавая грязную смесь звуков. Как я могу пойти об этом ??

1 Ответ

0 голосов
/ 24 января 2019

Если вы просто хотите отключить звук , вы можете попытаться изменить AuidoListener.volume на объекте основной камеры, чтобы он просто не выводил звук, который он улавливает в вашей сцене.

Вам даже не нужно иметь ссылку на компонент AudioListener, потому что AudioListener.volume является статическим свойством этого класса. Чтобы отключить / отключить звук, вам нужно просто обратиться к самому имени класса и сделать что-то вроде этого:

public void MuteAllSound()
{
    AudioListener.volume = 0;
}

public void UnMuteAllSound()
{
    AudioListener.volume = 1;
}

Для получения дополнительной информации, пожалуйста, ознакомьтесь с документацией Unity относительно компонента AudioListener.

Документация AudioListener Unity

В качестве альтернативы вы можете попробовать отключить все аудиоисточники, установив AudioSource.volume = 0, и включить их, установив = 1.

Но, как отметил @derHugo, это не будет хорошей идеей, так как это больше усилий / меньше эффективности , и в этом конкретном случае было бы проще просто полностью отключить компонент AudioListener.

Если вы хотите отключить только определенный набор звуков и не все из них, это будет жизнеспособной альтернативой. Конечно, вам нужно будет сохранить громкость источника, прежде чем он будет отключен, чтобы повторно применить его позже, и вам потребуется прямая ссылка на все эти аудиоисточники. Вы можете сделать это примерно так:

//Save the volume value and set it to 0 after
public Dictionary<AudioSource,float> MuteSourcesAndSaveVolumes(List<AudioSource> sourcesToMute)
{
    var sourcesAndVolumes = new Dictionary<AudioSource, float>();
    foreach (var source in sourcesToMute)
    {
        sourcesAndVolumes.Add(source, source.volume);
        source.volume = 0;
    }
    return sourcesAndVolumes;
}

//Re-apply your saved volumes
public void UnMuteAllSources(Dictionary<AudioSource,float> sourcesAndVolumes)
{
    foreach(var x in sourcesAndVolumes)
    {
        x.Key.volume = x.Value;
    }
}

Конечно, вы всегда можете проверить документы Unity относительно компонента AudioSource здесь: Документация AudioSource Unity

Надеюсь, это поможет!

// Редактировать: я переключил решения, чтобы сначала представить лучшее решение, и добавил несколько примеров кода.

...