0

我想从我的游戏主菜单中统一禁用所有音频源,并通过单击一个按钮使其影响游戏中的所有场景。而且我还想通过单击另一个按钮(静音按钮和取消静音按钮)来启用它。我已经设法用 AudioListener.pause 函数完成了这一点。但是当我使用 !AudioListener.pause 播放声音时,它的作用就像是恢复声音并播放所有暂停的声音,从而产生混乱的混合声音。我该怎么办?

4

2 回答 2

4

如果您只想使所有内容静音,您可以尝试修改AuidoListener.volume主摄像机对象上的 ,使其不输出在场景中拾取的任何声音。

您甚至不必引用 AudioListener 组件,因为AudioListener.volume它是该类的静态属性。要取消/静音,您只需引用类名本身并执行以下操作:

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

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

如需进一步参考,请查看有关 AudioListener 组件的 Unity 文档。

AudioListener Unity 文档

或者,您可以尝试通过设置将所有 AudioSourceAudioSource.volume = 0静音,并通过设置为 取消静音= 1

但正如@derHugo 指出的那样,这不是一个好主意,因为它更费力/效率更低,在这种特殊情况下,完全静音 AudioListener 组件会更容易。

如果您只想静音一组特定的声音而不是全部静音,这将是一个可行的选择。当然,您需要保存源在静音之前的音量以便稍后重新应用它,并且您需要直接引用所有这些 AudioSource。你可以这样做:

//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;
    }
}

当然,您可以随时在此处查看有关 AudioSource 组件的 Unity 文档: AudioSource Unity Docs

我希望这有帮助!

//编辑:我将解决方案切换为首先呈现更好的解决方案并添加了一些代码示例。

于 2019-01-24T15:17:45.723 回答
1

我认为正确的方法是暂停音频系统。

 public void ToggleSound()
 {
     toggle = !toggle;

     AudioListener.pause = toggle; 
 }

Unity 文档 - https://docs.unity3d.com/ScriptReference/AudioListener-pause.html

于 2021-06-23T04:33:47.500 回答