AudioSource na Unity: Tocar Som e Efeito por Código
Para tocar som na Unity você precisa de três peças: um AudioClip (o arquivo de áudio), um AudioSource (o componente que toca) e um AudioListener (o "ouvido", normalmente na câmera). Por código, a regra prática é: PlayOneShot para efeitos curtos que podem se sobrepor (pulo, tiro, moeda) e Play para música e sons contínuos. Este guia de Unity AudioSource mostra os dois, o som 2D e 3D com Spatial Blend, a variação de pitch que evita o efeito "metralhadora" e um mini gerenciador de efeitos que você reaproveita em qualquer projeto.
Nomes de campos, opções de importação e métodos seguem o manual e a referência de script do Unity 6.3 LTS, conferidos em outubro de 2026.
AudioSource, AudioClip e AudioListener
- AudioClip é o asset de áudio. Arraste um
.wavou.oggpara a janela Project e ele vira um AudioClip, com opções de importação próprias (falo delas mais abaixo). - AudioSource é o componente que toca. Ele fica num GameObject e, se o som for 3D, a posição desse objeto define de onde o som vem. Um objeto pode ter mais de um AudioSource.
- AudioListener é quem ouve. A Main Camera de uma cena nova já vem com um. Deve existir exatamente um ativo na cena.
No Inspector do Audio Source, os campos que você vai usar todo dia: o campo do som (o manual do Unity 6.3 o chama de Audio Generator e ele aceita um AudioClip ou um Audio Random Container), Output (para mandar o som a um grupo do Audio Mixer), Mute, Play On Awake, Loop, Volume, Pitch, Stereo Pan e Spatial Blend, seguidos das configurações de som 3D.
Tocando som pelo Inspector e por código
Pelo Inspector, sem código: crie um objeto Music, adicione Audio Source, coloque a música no campo do som, marque Play On Awake e Loop. Ao entrar em Play, a música começa e repete. Para som ambiente (vento, chuva), mesma coisa.
Por código, para efeitos ligados a eventos. Arquivo PlayerSfx.cs:
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class PlayerSfx : MonoBehaviour
{
[SerializeField] private AudioClip jumpClip;
[SerializeField] private AudioClip landClip;
[SerializeField] private AudioClip[] footstepClips;
[SerializeField, Range(0f, 1f)] private float footstepVolume = 0.6f;
private AudioSource audioSource;
private void Awake()
{
audioSource = GetComponent<AudioSource>();
audioSource.playOnAwake = false;
audioSource.spatialBlend = 0f;
}
public void PlayJump()
{
audioSource.PlayOneShot(jumpClip);
}
public void PlayLand()
{
audioSource.PlayOneShot(landClip, 0.8f);
}
public void PlayFootstep()
{
if (footstepClips.Length == 0)
{
return;
}
AudioClip clip = footstepClips[Random.Range(0, footstepClips.Length)];
audioSource.PlayOneShot(clip, footstepVolume);
}
}
O controlador do jogador chama PlayJump() no momento do pulo. Os passos sorteiam entre vários clips, o jeito mais barato de evitar repetição; chame PlayFootstep por um Animation Event no quadro em que o pé toca o chão.
Play vs PlayOneShot
A diferença que gera mais bug:
Play()toca o clip que está no campo do AudioSource (audioSource.clip). Se você chamarPlay()de novo antes de terminar, o som reinicia: o anterior é cortado. Também respeita Loop, e você pode pausar (Pause), retomar (UnPause) e parar (Stop) aquele som.PlayOneShot(clip, volumeScale)toca um clip por cima do que já está tocando, sem cortar. O segundo parâmetro multiplica o volume do AudioSource. Você não controla cada disparo individualmente:Stop()para tudo que aquele AudioSource está tocando.
Na prática: a arma automática com Play() soa como um único tiro picotado, porque cada disparo corta o anterior. Com PlayOneShot(), cada tiro tem a cauda completa. Já a música com PlayOneShot não tem loop nem como trocar de faixa direito.
Há um terceiro método: AudioSource.PlayClipAtPoint(clip, posicao, volume). Segundo a referência, ele cria um AudioSource temporário naquela posição e o descarta quando o clip termina. É a saída para o som de morte de um inimigo que vai ser destruído no mesmo frame: se o som estivesse no AudioSource do próprio inimigo, morreria junto. O contra é que ele cria e destrói um objeto a cada chamada, e o som sai em 3D.
Som 2D e 3D: Spatial Blend e distância
O Spatial Blend vai de 0 (2D) a 1 (3D):
- 2D (0): mesmo volume em qualquer lugar, sem panorâmica pela posição. Para música, interface, sons do próprio jogador em jogo 2D.
- 3D (1): volume e lado (esquerda ou direita) dependem da posição em relação ao AudioListener. Para inimigos, cachoeira, máquina na fase.
Com som 3D, abra 3D Sound Settings no Inspector:
- Min Distance: até essa distância o som toca no volume máximo.
- Max Distance: a partir dela o som para de diminuir (com rolloff logarítmico ele já está baixo nesse ponto).
- Volume Rolloff: Logarithmic Rolloff (natural, cai rápido perto da fonte), Linear Rolloff (previsível, chega a zero no Max Distance) ou Custom Rolloff (curva desenhada por você).
- Doppler Level: efeito de mudança de pitch com o movimento. Em jogo 2D, deixe em 0 para não ter pitch estranho quando a câmera anda.
- Spread: abertura do som entre os alto-falantes.
Em jogo 2D com câmera ortográfica, um detalhe pega muita gente: o AudioListener está na câmera, que fica em z = -10. Com som 3D e Min Distance pequeno, tudo soa mais baixo do que deveria, porque há 10 unidades de distância só no eixo Z. Aumente o Min Distance, use Linear Rolloff ou mantenha os efeitos em 2D e ajuste o Stereo Pan à mão.
Tocar o som é a parte simples. O que dá trabalho é o conjunto: música que muda com a fase, volume por categoria nas opções, som que não briga com outro, tudo isso amarrado ao resto do jogo sem que cada script vire um emaranhado de referências de áudio. É o tipo de integração que só fica clara quando você monta um jogo inteiro do começo ao fim.
Variação de pitch e volume
Tocar o mesmo clip idêntico vinte vezes por minuto cansa o ouvido. A solução mais barata é sortear pitch e volume a cada disparo, numa faixa pequena. O problema: pitch é do AudioSource, então mudar o pitch afeta também os sons que ainda estão tocando nele. Por isso o gerenciador abaixo usa vários AudioSources, um por disparo, em rodízio. Arquivo SfxManager.cs:
using UnityEngine;
public class SfxManager : MonoBehaviour
{
public static SfxManager Instance { get; private set; }
[SerializeField, Min(1)] private int voices = 12;
[SerializeField] private UnityEngine.Audio.AudioMixerGroup output;
private AudioSource[] sources;
private int next;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
sources = new AudioSource[voices];
for (int i = 0; i < voices; i++)
{
GameObject child = new GameObject($"SfxVoice_{i}");
child.transform.SetParent(transform);
AudioSource source = child.AddComponent<AudioSource>();
source.playOnAwake = false;
source.outputAudioMixerGroup = output;
sources[i] = source;
}
}
public void Play(AudioClip clip, Vector3 position, float volume = 1f,
float pitchVariation = 0.08f, bool spatial = false)
{
if (clip == null)
{
return;
}
AudioSource source = sources[next];
next = (next + 1) % sources.Length;
source.transform.position = position;
source.spatialBlend = spatial ? 1f : 0f;
source.pitch = 1f + Random.Range(-pitchVariation, pitchVariation);
source.volume = volume * Random.Range(0.9f, 1f);
source.clip = clip;
source.Play();
}
}
Uso, de qualquer script: SfxManager.Instance.Play(coinClip, transform.position);. Com 12 vozes, até 12 efeitos tocam ao mesmo tempo; o décimo terceiro reaproveita a voz mais antiga, cortando-a. Para a maioria dos jogos indie isso é inaudível e evita que cem moedas coletadas de uma vez virem uma parede de som. Como cada voz é um AudioSource separado, o som da morte do inimigo sobrevive ao Destroy do inimigo, sem criar objeto novo como o PlayClipAtPoint.
Uma faixa de pitch de mais ou menos 8% (0.92 a 1.08) é sutil e funciona bem para passos, moedas e tiros. Mais que isso começa a soar como outro som. A escolha e a edição dos sons em si estão no post sobre sound design de efeitos sonoros e vozes.
Importação: Load Type e compressão
Selecione um AudioClip na janela Project e veja o Inspector. As opções gerais:
- Force To Mono: mistura canais em um. Para efeitos 3D, mono é o certo (o posicionamento é feito pela Unity). Normalize ajusta o volume nessa mistura.
- Load In Background: carrega o clip de forma assíncrona, sem travar o carregamento da cena.
E as que dependem da plataforma:
- Load Type:
- Decompress On Load: descomprime ao carregar; toca sem custo de CPU, mas ocupa muito mais memória. Para efeitos curtos e frequentes.
- Compressed In Memory: fica comprimido na memória e é decodificado ao tocar. Economiza memória com pequeno custo de CPU. Para efeitos médios e diálogos.
- Streaming: lê do disco enquanto toca, com memória mínima. Para música e ambientes longos.
- Compression Format: PCM (sem compressão, maior qualidade, maior tamanho), ADPCM (compressão fixa de 3,5 vezes, leve na CPU, bom para efeitos com ruído como passos e tiros, menos indicado para música) e Vorbis (compressão com controle de Quality, o melhor para música e falas longas).
- Preload Audio Data: carrega o áudio junto com a cena. Desmarque em músicas grandes que só tocam depois.
Configuração inicial que uso: efeitos curtos em Decompress On Load com ADPCM; música em Streaming com Vorbis. Se você ainda está atrás de sons para testar, o post sobre efeitos sonoros grátis para jogos lista fontes com licença clara.
Erros comuns: som não toca, som cortado e dois AudioListeners
O som não toca. Confira nesta ordem: existe um AudioListener ativo na cena? O botão de mutar áudio da barra do Game view está ligado? O volume do AudioSource ou o AudioListener.volume está em zero? O som é 3D e está longe demais do ouvinte? O objeto foi desativado ou destruído logo depois do Play?
O som corta no meio. Você chamou Play() de novo antes de terminar (troque por PlayOneShot ou use o SfxManager), ou o objeto foi destruído (use o gerenciador ou PlayClipAtPoint), ou todas as vozes do gerenciador estavam ocupadas (aumente voices).
"There are 2 audio listeners in the scene". Você tem duas câmeras com AudioListener, comum quando uma cena carregada de forma aditiva traz a própria câmera, ou quando o jogador tem uma câmera própria. Deixe o componente só na câmera principal e remova dos outros.
Música recomeça ao trocar de cena. O objeto da música é destruído com a cena. Marque-o com DontDestroyOnLoad num objeto que sobrevive entre cenas e garanta que só exista um.
Som com pitch estranho em jogo 2D. Doppler Level ligado num AudioSource 3D com a câmera em movimento. Zere o Doppler.
Próximo passo
Coloque o SfxManager numa cena de teste, toque um efeito de moeda dez vezes seguidas com e sem variação de pitch e compare. Depois ligue a saída do gerenciador a um grupo do Audio Mixer: o próximo passo natural é ter volume separado de música e efeitos, assunto do post sobre o Audio Mixer e controle de volume na Unity.
Perguntas frequentes
Como tocar um som por código na Unity?
Adicione um componente Audio Source ao objeto, crie um campo [SerializeField] private AudioClip no seu script e chame audioSource.PlayOneShot(clip) no momento do evento. Para música ou som contínuo, atribua o clip em audioSource.clip e chame Play.
Qual a diferença entre Play e PlayOneShot na Unity?
Play toca o clip atribuído ao AudioSource e, se chamado de novo, reinicia esse som, cortando o anterior. PlayOneShot toca um clip por cima do que já está tocando, sem cortar, e aceita um multiplicador de volume. Use Play para música e loops, e PlayOneShot para efeitos curtos e repetidos.
Por que o som não toca na Unity?
As causas mais comuns são: não há AudioListener na cena, o botão de mutar áudio do Game view está ligado, o objeto com o AudioSource foi destruído logo depois do Play, o volume está em zero ou o som está em 3D com o ouvinte longe demais. Confira nessa ordem.
O que é Spatial Blend no AudioSource?
É o controle que define o quanto o som é afetado pela posição no espaço. Em 0 o som é 2D, com o mesmo volume em qualquer lugar; em 1 é 3D, com volume e panorâmica dependendo da distância e da direção em relação ao AudioListener.



