Neste tutorial, vou mostrar como reproduzir um arquivo de áudio no Unity e, mais importante, como resolvi um problema relacionado à sobreposição de áudio a partir de um Audio Source.
A versão em vídeo deste tutorial não está disponível atualmente neste idioma.
Transcrição do vídeo
Olá a todos! Neste tutorial, vou mostrar como reproduzir um arquivo de áudio no Unity e, mais importante, como resolvi um problema relacionado à sobreposição de áudio a partir de um Audio Source. Antes de prosseguir, observe que a solução apresentada no vídeo é apenas a que eu adotei para esse problema, mas provavelmente existem outras soluções, possivelmente até melhores. Portanto, não considere as informações apresentadas aqui como a abordagem definitiva.
O tutorial foi criado usando Unity 2022. Especificamente, quero reproduzir um arquivo de áudio de passos, retirado do primeiro jogo Prince of Persia, de Jordan Mechner, que foi minha primeira experiência com jogos no PC, quando o personagem se move na cena. Isso pode parecer uma tarefa simples, mas como veremos, há um pequeno desafio envolvido.
Para reproduzir o áudio de passos, o primeiro passo é adicionar um objeto Audio Source ao personagem. Dentro desse objeto, vamos definir o arquivo de áudio específico a ser reproduzido e configurar outras propriedades de reprodução.
Um Audio Source é um componente que precisa ser adicionado a um objeto dentro da cena. Pode ser o personagem, uma porta, uma bola ou até mesmo um objeto invisível, útil para reproduzir um áudio quando o personagem entra em uma sala específica ou se aproxima de determinado item.
Para que o áudio seja ouvido pela Main Camera, a Camera precisa ter um componente Audio Listener ativo. Em novos projetos no Unity, a Main Camera geralmente já vem com um Audio Listener ativo por padrão, pois se presume que o usuário desejará ouvir os arquivos de áudio. Caso o Audio Listener padrão esteja ausente, ele pode ser adicionado pelo Inspector do objeto Main Camera.

No meu caso, o arquivo de áudio precisa estar vinculado ao personagem.
Dentro do meu projeto, existe um objeto Player que é o objeto pai da Main Camera. O script de movimentação está associado ao objeto Player, enquanto a câmera possui um script que permite olhar ao redor. Portanto, vou adicionar um componente AudioSource ao objeto Player.

Ao acessar a aba do componente recém-criado, você verá imediatamente o campo AudioClip, que inicialmente está definido como None.
Também há uma caixa de seleção chamada Play on Awake, marcada por padrão. Essa opção reproduz o áudio quando o jogo inicia, o que pode ser útil em alguns cenários. No entanto, não é necessário para o nosso caso, então vou desmarcá-la.

Importar um clipe de áudio para o projeto é bastante simples. Basta arrastar o arquivo de áudio de uma janela do File Browser para a aba Project ou selecioná-lo no seu disco através da janela Assets - Import New Asset.

O Unity é compatível com vários formatos de áudio, como mp3, e exibirá um ícone de nota musical ao lado do elemento correspondente dentro do Project.
Como você pode ver, meu projeto já contém vários arquivos de áudio destinados a serem reproduzidos em momentos diferentes. Entre esses arquivos, o que nos interessa especificamente é PoP---walk.
Para continuar, primeiro seleciono o Player na Hierarchy.
Em seguida, clico e mantenho pressionado o botão do mouse sobre o asset PoP---walk na aba Project.

Por fim, arrasto esse elemento para o campo AudioClip do componente AudioSource associado ao Player.
Como mencionado anteriormente, o som deve ser reproduzido quando o personagem se mover.
Para isso, vou abrir o script responsável pela movimentação do personagem e inserir o código necessário.
Primeiro, crio uma variável do tipo AudioSource e a inicializo dentro da função Start, associando-a ao componente AudioSource do Player.
Para isso, escrevo o seguinte código:
private AudioSource playerAudioSource;
e, dentro da função Start:
playerAudioSource = GetComponent();
Também preciso criar uma variável do tipo AudioClip para associar ao arquivo de áudio que deve ser reproduzido. Vou chamar essa variável de myAudioClip e usar o atributo SerializeField, pois quero que ela fique visível no Inspector.
Depois de salvar o arquivo do script, o próximo passo será arrastar o asset PoP---Walk para o campo myAudioClip do script no Inspector.
Logo após a definição de playerAudioSource, escrevo a seguinte linha de código:
[SerializeField] private AudioClip myAudioClip;

Após salvar o script, retorno ao Unity Editor e arrasto o asset PoP---Walk para o campo myAudioClip do script, conforme descrito anteriormente.

Neste momento, o áudio ainda não está sendo reproduzido.
Dentro da função Update do script, há algumas instruções para detectar as teclas pressionadas pelo usuário, que controlam a movimentação do personagem.
Especificamente, quando o usuário move o personagem, o valor de Input.GetAxis para Horizontal e Vertical, que renomeei para x e y por conveniência, pode ser -1 ou 1, dependendo da direção.
Nesse caso, eu poderia escrever o seguinte código:
if ((Mathf.Abs(x) == 1) || (Mathf.Abs(z) == 1))
playerAudioSource.PlayOneShot(myAudioClip);

e tentar executar o jogo. No entanto, isso seria um grande erro, porque o Unity reproduziria o arquivo de áudio a CADA FRAME DO JOGO.
O resultado não melhora se simplesmente movermos a função PlayOneShot para dentro de uma Coroutine e adicionarmos um comando de atraso de um segundo, usando yield return new WaitForSeconds(1). O problema continua sendo que a função Update chamará a Coroutine a cada frame, levando novamente ao mesmo erro.
Portanto, a Coroutine não é necessária. Em vez disso, precisamos implementar uma verificação simples no AudioSource: reproduzir o áudio somente se o AudioSource NÃO estiver já reproduzindo.
Isso pode ser feito dentro da função Update, escrevendo o seguinte código dentro do bloco if que verifica os valores de x e y:
if (!(playerAudioSource.isPlaying))
playerAudioSource.PlayOneShot(myAudioClip);

Agora podemos salvar o script, iniciar o jogo e observar, ou melhor, ouvir o resultado.
Antes de concluir este tutorial, gostaria de compartilhar um pensamento: o campo AudioClip do componente AudioSource pode, naturalmente, ser modificado via script.
Isso significa que você pode usar esse AudioSource para reproduzir um som padrão de passos, mas também substituir o clipe de áudio durante o jogo por outro, caso o personagem esteja andando sobre cascalho, na beira do mar ou em outras superfícies, que podem ser identificadas usando Colliders.
Além disso, se o seu personagem puder voar, você pode desativar o AudioSource para que nenhum som seja reproduzido.
Bem, isso é tudo para este tutorial. Espero que tenha sido útil. Até breve!