停止Unity中每个场景中的所有AudioSources

时间:2019-01-24 13:51:57

标签: unity3d game-engine unityscript game-development

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

有关更多信息,请查阅有关AudioListener组件的Unity文档。

AudioListener Unity Docs

或者,您可以尝试通过设置AudioSource.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

我希望这会有所帮助!

// Edit:我将解决方案切换为首先提出更好的解决方案,并添加了一些代码示例。

答案 1 :(得分:1)

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

 public void ToggleSound()
 {
     toggle = !toggle;

     AudioListener.pause = toggle; 
 }

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