AudioSource, AudioListener e AudioClip descomplicado

Existem diversos componentes na Unity 3D para a manipulação de áudio e vamos discutir alguns deles.

Todo bom jogo que se preze tem arquivos de áudios, seja uma música de fundo, clique de botão ou até mesmo o efeito de um ataque inimigo. Para a nossa felicidade, a Unity 3D possuí vários recursos que vão facilitar a nossa vida na hora de deixar nossos AudioClips mais dinâmicos.

É preciso entender o que são e a finalidade de cada um dos componentes e só daí vai ser possível criar scripts que manipulam seus atributos. Vamos ver os três componentes que vamos utilizar.

  • AudioListener  - Podemos ter apenas um ativo por cena, ele funciona como os “ouvidos” do jogador, captando todo o áudio da cena e reproduzindo na saída de som do Hardware. Encontramos esse componente na Camera;
  • AudioClip - É um arquivo de áudio, seja um .mp3, .wav ou .ogg;
  • AudioSource - Esse é o componente responsável por reproduzir nosso áudio, ele funciona como um MP3 Player, recebe uma fita de música (AudioClip) e tem os botões (método) de reproduzir, pausar e parar.

Uma vez que a gente entendeu esse três componentes, agora vamos criar um C# script chamado de AudioController. Para o nosso exemplo, associamos ele a um GameObject vazio. Vamos inserir o código abaixo no nosso script.

using UnityEngine;

//Requisitamos o componente AudioSource
[RequireComponent(typeof(AudioSource))]
public class AudioController : MonoBehaviour
{
	//Variável que recebe nosso clipe de áudio
	public AudioClip audioClip;

	//Variável de controle para play e stop
	private bool play = false;

	//Variável que gerencia o volume
	private float volume = 1.0f;

	//Variável que acessa nosso componente AudioSource
	private AudioSource audioSource;

	void Start()
	{

		//Obtemos o componente AudioSource e atribuimos a variável
		audioSource = GetComponent<AudioSource>();

		//Definimos o AudioClip na propriedade clip do AudioSource
		audioSource.clip = audioClip;
	}

	void Update()
	{
		//Caso pressione a tecla E
		if (Input.GetKeyDown(KeyCode.E))
		{
			//Chama o método de aumentar o volume & Altera o volume do jogo
			AudioListener.volume = VolumeUp();
		}

		//Caso pressione a tecla Q
		if (Input.GetKeyDown(KeyCode.Q))
		{
			//Chama o método de diminuir o volume & Abaixa o volume do jogo
			AudioListener.volume = VolumeDown();
		}

		//Caso pressione a tecla P
		if (Input.GetKeyDown(KeyCode.P))
		{
			//A variável vai sempre receber a negação do seu valor atual. Se for true, então vira false.
			play = !play;

			//Caso o play for true
			if (play)
				//Chama o método de reproduzir o áudio
				PlayAudio();
			//Caso o play for false
			else
				//Chama o método de parar o áudio
				StopAudio();
		}

	}

	//Método de aumentar volume
	float VolumeUp()
	{
		//Caso o volume seja maior ou igual a 1
		if (volume >= 1)
			//Retorna o valor atual da variável
			return volume;

		//Acrescentamos 0.1 ao valor já existente na variável
		volume += 0.1f;

		//Retornamos um float com o valor do volume
		return volume;
	}

	//Método de diminuir o volume
	float VolumeDown()
	{
		//Caso o volume seja menor ou igual a 0
		if (volume <= 0)
			//Retorna o valor atual da variável
			return volume;

		//Decrementamos 0.1 ao valor já existente na variável
		volume -= 0.1f;

		//Retornamos um float com o valor do volume
		return volume;
	}

	//Método para reproduzir áudio
	void PlayAudio()
	{
		//Reproduzimos o áudio
		audioSource.Play();
	}

	//Método para parar áudio
	void StopAudio()
	{
		//Paramos a execução di áudio
		audioSource.Stop();
	}
}

Okay, há duas coisas que precisamos entender:

  • Não podemos chamar métodos do componente AudioSource sem que um AudioClip esteja de fato atribuído a ele;
  • Devemos acessar a propriedade estática volume do AudioListener e nunca através de uma instância, ex: (new AudioListener().volume).

Agora é só dar play na Unity e pressionar as teclas:

  • Q - Abaixo o volume;
  • E - Aumenta o volume;
  • P - Reproduz/Para o áudio.

Finalizamos mais um conteúdo, até a próxima!