Engenharia Insper / Laboratório de Realidade Virtual e Jogos Digitais

Controle de audio.

Normalização de áudio:

Pode ser feita como diversos programas, ou pode ser feita com python de uma maneira bem simples.

Explicação sobre normalização e como fazer no audacity, programa opensource de edição de áudio. How to normalize audio in Audacity 

python

from pydub import AudioSegment, effects  
rawsound = AudioSegment.from_file(
"./input.m4a", "m4a")  
normalizedsound = effects.normalize(rawsound)  
normalizedsound.export(
"./output.wav", format="wav")

How to normalize the volume of an audio file in python? 

Ajustes de áudio

Com os áudios que você irá utilizar em seu jogo carregados, é bom se manter organizado, então crie uma pasta Audio, e dentro dela uma pasta específica para a música e outra específica para os efeitos.

Caso a música não faça parte do ambiente, é interessante colocar o Audio Source na câmera do jogador.

Perceba que o componente áudio source tem um "Output" que agora está vazio.

Abra o controle de áudio da Unity em Window > Audio AudioMixer

Crie um Mixer e o chame de Master. (Esse é o padrão de mixagens)

Agora temos um Mixer Master, e em Grupos temos Master também, vamos criar outros dois subgrupos: Áudio e SFX clicando no ícone + à direita de Groups e ajustando a “Hierarquia” como abaixo.

Feito isso vamos Selecionar o Grupo Music em nosso audio source para a música.

Para os efeitos sonoros faremos o mesmo processo mas selecionando o Grupo SFX e Criando o áudio source onde ele será executado.

Feito isso vamos criar um menu para configurar os volumes do nosso jogo

Vou utilizar três sliders, um para a música, um para o SFX e um para o master.

Para acessar via código os parâmetros, que iremos utilizar precisamos optar por expor eles, selecione cada um dos grupos, e pelo inspector clique com o botão direito em volume e selecione Expose ____ to script

Feito isso precisamos nomear nossos parâmetros expostos.

E agora criar um Script AudioControll

using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class AudioControll : MonoBehaviour
{
   
// Referência aos Sliders e AudioMixer para conseguir definir pelo Inspector.
   
public Slider masterSlider;
   
public Slider sfxSlider;
   
public Slider musicSlider;

   
public AudioMixer master;

   
float outMaster;
   
float outSFX;
   
float outAudio;
   
 
// Inicializo os sliders nos limites dem db do mixer e já com os valores que estão salvos no mixer
   
void Start()
   {
       master.GetFloat(
"masterVolume", out outMaster);
       masterSlider.minValue =
-80.0f;
       masterSlider.maxValue =
20.0f;
       masterSlider.
value = outMaster;
       
//Registro o evento de mudança de slider.
       masterSlider.onValueChanged.AddListener(
delegate { SliderChanged(masterSlider); });
       
       master.GetFloat(
"sfxVolume", out outSFX);
       sfxSlider.minValue =
-80.0f;
       sfxSlider.maxValue =
20.0f;
       sfxSlider.
value = outSFX;
       
//Registro o evento de mudança de slider.
       sfxSlider.onValueChanged.AddListener(
delegate { SliderChanged(sfxSlider); });


       master.GetFloat(
"musicVolume", out outAudio);
       musicSlider.minValue =
-80.0f;
       musicSlider.maxValue =
20.0f;
       musicSlider.
value = outAudio;
       
//Registro o evento de mudança de slider.
       musicSlider.onValueChanged.AddListener(
delegate { SliderChanged(musicSlider); });
   }

   /
/ Método responsável por alterar os volumes no AudioMixer de acordo com slider que foi modificado.
    public void SliderChanged(Slider slider)
   {
       
if(slider == masterSlider)
       {
           master.SetFloat(
"masterVolume", slider.value);
       }
       
else if(slider == sfxSlider)
       {
           master.SetFloat(
"sfxVolume", slider.value);
       }
       
else if(slider == musicSlider)
       {
           master.SetFloat(
"musicVolume", slider.value);
       }
   }
}

Não esqueça de popular as referências públicas no inspector!