Quick answer: The most common causes are a missing AudioListener in the scene, no AudioClip assigned to the AudioSource, the AudioSource component being disabled, Play On Awake being unchecked without a manual Play() call, Spatial Blend set to 3D when the listener is too far away, or the AudioMixer group volume b...

Here is how to fix Unity audio not playing. You have an AudioSource component on your GameObject, an AudioClip assigned, and you are calling Play() in your script — but no sound comes out. No errors in the Console, no warnings, just silence. Unity's audio pipeline has multiple stages between "play a sound" and "sound reaches speakers," and a failure at any point in that chain will silently produce nothing. Here is how to trace the problem and fix it.

The Symptom

You call audioSource.Play() or rely on Play On Awake, but no sound is audible during Play mode. The AudioSource component may show its progress bar moving (indicating it thinks it is playing), or it may not animate at all. In some cases, the sound plays in the Scene view when you click the preview button in the Inspector but produces nothing in the Game view. In other cases, the sound works fine for a while and then stops working after a scene change or camera switch.

The issue may be universal (no sound at all from any source) or specific to a single AudioSource. Universal silence points to an AudioListener or global audio setting issue. Per-source silence points to a configuration problem on that specific AudioSource.

What Causes This

Unity's audio playback requires a complete pipeline: an AudioClip loaded into an AudioSource, the AudioSource enabled and playing, an AudioMixer path with non-zero volume (if routed through a mixer), and an active AudioListener in the scene to receive the sound. Breaking any link in this chain produces silence without an error.

The Fix

Step 1: Verify the AudioListener and basic AudioSource setup. Confirm that your scene has exactly one active AudioListener and that the AudioSource has a clip, is enabled, and has its volume above zero. Use this diagnostic script to check the entire audio pipeline at startup:

using UnityEngine;

public class AudioPipelineDebugger : MonoBehaviour
{
    void Start()
    {
        // Check AudioListeners
        AudioListener[] listeners = FindObjectsByType<AudioListener>(FindObjectsSortMode.None);
        if (listeners.Length == 0)
        {
            Debug.LogError("No AudioListener found in scene! No audio will be heard.");
        }
        else if (listeners.Length > 1)
        {
            Debug.LogWarning($"Found {listeners.Length} AudioListeners. Only one should be active.");
            foreach (AudioListener listener in listeners)
            {
                Debug.LogWarning($"  AudioListener on: {listener.gameObject.name}", listener.gameObject);
            }
        }
        else
        {
            Debug.Log($"AudioListener found on: {listeners[0].gameObject.name}");
        }

        // Check global audio volume
        if (AudioListener.volume <= 0f)
        {
            Debug.LogError($"AudioListener.volume is {AudioListener.volume}. No audio will be heard.");
        }

        if (AudioListener.pause)
        {
            Debug.LogError("AudioListener.pause is true. All audio is paused.");
        }
    }

    /// Call this to diagnose a specific AudioSource
    public static void DiagnoseAudioSource(AudioSource source)
    {
        if (source == null)
        {
            Debug.LogError("AudioSource reference is null.");
            return;
        }

        if (!source.enabled)
            Debug.LogError($"AudioSource '{source.name}' is disabled.");
        if (!source.gameObject.activeInHierarchy)
            Debug.LogError($"GameObject '{source.name}' is inactive.");
        if (source.clip == null)
            Debug.LogError($"AudioSource '{source.name}' has no AudioClip assigned.");
        if (source.volume <= 0f)
            Debug.LogWarning($"AudioSource '{source.name}' volume is {source.volume}.");
        if (source.mute)
            Debug.LogWarning($"AudioSource '{source.name}' is muted.");

        Debug.Log($"AudioSource '{source.name}' - Clip: {source.clip?.name}, "
            + $"Volume: {source.volume}, SpatialBlend: {source.spatialBlend}, "
            + $"PlayOnAwake: {source.playOnAwake}, IsPlaying: {source.isPlaying}");
    }
}

Step 2: Fix Spatial Blend and 3D distance attenuation. If your sound should be heard regardless of camera position (music, UI sounds, ambience), set Spatial Blend to 0 (2D). If you need 3D spatialization, make sure the Max Distance on the AudioSource is large enough that the AudioListener can hear it from wherever the camera might be. You can visualize the attenuation range using gizmos:

using UnityEngine;

public class AudioSourceSetup : MonoBehaviour
{
    [Header("Audio Settings")]
    [SerializeField] private AudioClip _clip;
    [SerializeField] private bool _is3D = false;
    [SerializeField] private float _maxDistance = 50f;

    private AudioSource _source;

    void Awake()
    {
        _source = GetComponent<AudioSource>();
        if (_source == null)
            _source = gameObject.AddComponent<AudioSource>();

        _source.clip = _clip;

        if (_is3D)
        {
            // 3D audio: sound attenuates with distance
            _source.spatialBlend = 1.0f;
            _source.minDistance = 1f;
            _source.maxDistance = _maxDistance;
            _source.rolloffMode = AudioRolloffMode.Logarithmic;
        }
        else
        {
            // 2D audio: same volume everywhere, no spatialization.
            // Use this for music, UI clicks, and global ambience.
            _source.spatialBlend = 0f;
        }
    }

    public void PlaySound()
    {
        if (_source.clip == null)
        {
            Debug.LogWarning("Cannot play: no AudioClip assigned.");
            return;
        }

        _source.Play();
    }

    /// Use PlayOneShot for sound effects that may overlap
    /// (e.g., gunshots, footsteps, coin pickups)
    public void PlaySFX(AudioClip clip)
    {
        if (clip == null) return;
        _source.PlayOneShot(clip);
    }

    // Draw the audio range in the Scene view for debugging
    void OnDrawGizmosSelected()
    {
        if (_is3D)
        {
            Gizmos.color = Color.yellow;
            Gizmos.DrawWireSphere(transform.position, _maxDistance);
            Gizmos.color = Color.green;
            Gizmos.DrawWireSphere(transform.position, 1f); // minDistance
        }
    }
}

Step 3: Check AudioMixer routing and volume levels. If your AudioSource is routed through an AudioMixer, every group in the chain must have a volume above -80 dB. Open the Audio Mixer window (Window > Audio > Audio Mixer) and check each group's fader. Also check if a mixer snapshot is overriding volumes. You can verify and control mixer volume from code:

using UnityEngine;
using UnityEngine.Audio;

public class AudioMixerDebugger : MonoBehaviour
{
    [SerializeField] private AudioMixer _mixer;

    // Exposed parameter names from the AudioMixer.
    // Right-click a volume slider in the Mixer and choose
    // "Expose ... to script" to make it accessible.
    [SerializeField] private string _masterVolumeParam = "MasterVolume";
    [SerializeField] private string _sfxVolumeParam = "SFXVolume";
    [SerializeField] private string _musicVolumeParam = "MusicVolume";

    void Start()
    {
        if (_mixer == null)
        {
            Debug.LogError("No AudioMixer assigned.");
            return;
        }

        LogMixerVolume(_masterVolumeParam);
        LogMixerVolume(_sfxVolumeParam);
        LogMixerVolume(_musicVolumeParam);
    }

    private void LogMixerVolume(string paramName)
    {
        if (_mixer.GetFloat(paramName, out float value))
        {
            if (value <= -80f)
                Debug.LogError($"Mixer param '{paramName}' is at {value} dB (silent).");
            else
                Debug.Log($"Mixer param '{paramName}' = {value} dB");
        }
        else
        {
            Debug.LogWarning($"Mixer param '{paramName}' not found. Is it exposed?");
        }
    }

    /// Convert a 0-1 slider value to decibels for the mixer.
    /// AudioMixer uses dB (-80 to 0), not linear 0-1.
    public void SetVolume(string paramName, float linearValue)
    {
        // Convert linear (0..1) to decibels (-80..0)
        float dB = linearValue > 0.0001f
            ? Mathf.Log10(linearValue) * 20f
            : -80f;

        _mixer.SetFloat(paramName, dB);
    }
}

If audio still does not play after checking all three areas, verify that the audio file itself is valid. Import settings can cause issues: check that the AudioClip's Load Type is appropriate (use Decompress On Load for short SFX, Streaming for long music tracks) and that the file format is supported. You can test a clip directly with AudioSource.PlayClipAtPoint(clip, transform.position), which creates a temporary AudioSource and bypasses your existing configuration entirely.

Related Issues

See also: Fix: Unity UI Button Not Responding to Clicks.

See also: Fix: Unity Pink or Magenta Materials (Missing Shader).

No AudioListener means no ears in the scene. Check your camera first.