Voltar para o Blog
Quest Log

AudioSource na Unity: Tocar Som e Efeito por Código

Alto-falante estilizado emitindo ondas sonoras coloridas sobre uma cena de jogo com moedas e um personagem pulando

Unity AudioSource por código: Play vs PlayOneShot, som 2D e 3D com Spatial Blend, variação de pitch para o som não cansar e um mini gerenciador de efeitos.

Ferramenta:UnityC#

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 .wav ou .ogg para 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ê chamar Play() 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.

Curso de Unity
Quer fazer seu primeiro jogo na Unity?

No curso de Unity 6 da CursoGame.Dev você vai do zero ao primeiro jogo, com um desafio prático em cada level e suporte individual no WhatsApp quando travar.

Conhecer o curso de Unity
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

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.