Utilizando o Mixer da Unity


Em jogos, é comum termos sempre muitos arquivos de áudio sendo executados ao mesmo tempo,alguns deles são efeitos sonoros (passos, ataques, inimigos, ambiente, etc…), já outros compõem a trilha sonora.
Com tantos objetos de áudio dentro de uma cena, como controlamos o volume do jogo de forma centralizada? Pense em uma tela de configurações onde temos dois sliders, um para controlar o volume da música do jogo e outro para ajustar os efeitos sonoros.

Para executarmos um arquivo de áudio dentro de uma cena na Unity, precisamos de algum objeto com o componente Audio Source. E cada componente desses tem seu próprio controle de volume.


Se cada Audio source tem seu próprio volume, será que precisamos manter uma lista de todos esses componentes para que, quando quisermos mudar o volume da música, mudarmos todos ao mesmo tempo?
Pensando nesse caso da música, temos outro problema para resolver. Há dois grandes grupos de arquivos. Os que fazem parte da música e os que são efeitos sonoros. Como controlamos cada grupo separadamente?
Pensando nesses problemas que a Unity criou o próprio áudio mixer dentro da engine. Estes mixers nos ajudam a agrupar os componentes de áudio e aplicar efeitos a todos eles de uma só vez, como um painel de controle.
Se abrirmos a janela Audio Mixer, podemos criar quantos mixers quisermos clicando no "+" ao lado da palavra “mixers”.

Todo novo mixer que criamos vem com um grupo chamado master, onde podemos adicionar efeitos e alterar o volume de todo áudio que passar por esse grupo.
Além do grupo master, podemos criar outros clicando no botão "+" ao lado da palavra “Groups”. Como o próprio nome indica, com esses grupos podemos agrupar os áudios e aplicar efeitos diretamente em um desses grupos.

Como fazemos para que um Audio Source faça parte de um desses grupos?
Todo Audio Source possui uma propriedade chamada saída - Output - e ela controla por qual grupo o áudio deve passar antes de ser executado. Quando o som passa por esses grupos, ele recebe todos os efeitos que colocamos naquele grupo.

Veja que todos os grupos que criamos, por padrão, vem com um efeito do tipo Attenuation que controla justamente o volume de saída dos áudios.

Agora, com os grupos separados. Como faremos os sliders da tela de configuração controlarem o volume cada grupo?
Se selecionarmos um grupo, veremos no inspetor as propriedades que podemos alterar nele. A princípio, todas essas propriedades estão encapsuladas e não conseguiremos vê-las dentro do código.

Para isso, vamos clicar com o botão direito em cima da propriedade "volume" no inspetor da Unity e selecionar a opção “Expose ‘volume(of Musica)’ to script”.

Uma vez que a variável foi exposta para o código, ela fica visível na aba "exposed parameters" - parâmetros expostos - no canto direito da janela do audio mixer, é aqui que podemos renomear esses parâmetros.

Agora, criaremos um script que recebe um mixer e o nome do parâmetro que queremos alterar para que possamos usar essas informações e ajustar o som do jogo de acordo nosso slider.
Para isso, vamos criar uma função MudarVolume
que recebe como parâmetro um valor do tipo float. Sabemos que esse valor está entre 0 e 1, uma vez que quem vai chamar esse método é o próprio componente Slider. Assim, calcularemos o volume desejado utilizando a função Mathf.Lerp
e passar o valor calculado para o mixer utilizando o método SetFloat
dele.
public class MixerVolume : MonoBehaviour {
[SerializeField]
private AudioMixer mixer;
[SerializeField]
private string parametro;
public void MudarVolume(float config)
{
var volume = Mathf.Lerp(-60, 0, config);
this.mixer.SetFloat(parametro, volume);
}
}

Como falamos, utilizaremos o componente Slider para chamar o método MudarVolume
e faremos isso utilizando o evento "On Value Changed" - Quando o valor mudar - do próprio componente Slider.
Para adicionarmos uma "resposta" a um evento podemos clicar no “+” logo abaixo dessa propriedade. Com isso, podemos fazer com que esse evento chame o método “mudarVolume”.

Fazendo isso para os dois Sliders,temos cada um deles controlando um grupo diferente o volume da música e dos efeitos sonoros separadamente.
Você conhecia os mixers de áudio da Unity? Já tinha utilizado em algum projeto? Como você costuma separar os grupos do seu programa?
Aproveita e passa lá na Alura para conferir os cursos de Unity que temos!