askvity

How Do I Have Two Audio Sources on One Object in Unity?

Published in Unity Audio Setup 4 mins read

To have two or more audio sources on a single GameObject in Unity, you can easily achieve this by adding multiple Audio Source components directly to that GameObject in the Unity Inspector. Once added, you can manage their playback via a script.

Attaching Multiple Audio Sources

In the Unity Editor, select the GameObject you want to add the audio sources to. In the Inspector window for that object, click the "Add Component" button and search for "Audio Source". You can add multiple instances of the "Audio Source" component to the same GameObject this way.

  • Select your GameObject.
  • In the Inspector, click Add Component.
  • Search for "Audio Source" and select it.
  • Repeat the process to add a second, third, or more Audio Source components.

Each added Audio Source component will appear in the Inspector, allowing you to configure its individual settings, such as the AudioClip, volume, pitch, spatial blend, etc.

Playing Multiple Audio Sources Simultaneously

Once you have multiple Audio Sources attached to the GameObject, you need a way to trigger their playback. A common and efficient method for playing sounds that might overlap or occur frequently, like sound effects, is using the PlayOneShot() method from within a script.

According to the reference: "You can attach several Audio Sources to the same GameObject in the Inspector, and get them to play at the same time by calling PlayOneShot(); in a script."

The reference also mentions, "You need the Audio Source attached to your main GameObject and then attach a script to the Audio Source." While you can attach scripts to specific components, it's more typical and often cleaner practice in Unity to attach the control script directly to the GameObject that holds all the components you need to manage.

Here's how you might use PlayOneShot() in a script attached to your GameObject:

  1. Get References: In your script, get references to the Audio Source components. You can do this by making public variables in your script and assigning the Audio Sources from the Inspector, or by using GetComponents<AudioSource>().
  2. Call PlayOneShot(): Use the PlayOneShot() method on one of the Audio Source components, passing the AudioClip you want to play as an argument.

Example Script Snippet

using UnityEngine;

public class PlayMultipleSounds : MonoBehaviour
{
    // Assign your AudioClips in the Inspector
    public AudioClip soundEffect1;
    public AudioClip soundEffect2;

    // Assign one of the Audio Source components from the GameObject
    // PlayOneShot is typically called on one source
    private AudioSource audioSource;

    void Start()
    {
        // Get the Audio Source component attached to this GameObject
        // If you have multiple, you might need to get specific ones
        // For PlayOneShot, you often use one source for multiple clips
        audioSource = GetComponent<AudioSource>();

        if (audioSource == null)
        {
            Debug.LogError("AudioSource component missing!");
        }
    }

    // Call this function when you want to play soundEffect1
    public void PlaySound1()
    {
        if (audioSource != null && soundEffect1 != null)
        {
            // Play soundEffect1 using the attached audioSource without interrupting
            audioSource.PlayOneShot(soundEffect1);
        }
    }

    // Call this function when you want to play soundEffect2
    public void PlaySound2()
    {
        if (audioSource != null && soundEffect2 != null)
        {
            // Play soundEffect2 using the attached audioSource without interrupting
            audioSource.PlayOneShot(soundEffect2);
        }
    }

    // If you needed to play two specific clips simultaneously using two *different*
    // AudioSource components (e.g., for specific volume/pitch setups),
    // you would need references to both sources.
    // Example (assuming you have two AudioSources and reference them):
    public AudioSource sourceForSound1;
    public AudioSource sourceForSound2;
    public void PlayTwoSpecificSounds()
    {
         if (sourceForSound1 != null && soundEffect1 != null)
         {
             sourceForSound1.PlayOneShot(soundEffect1);
         }
          if (sourceForSound2 != null && soundEffect2 != null)
         {
             sourceForSound2.PlayOneShot(soundEffect2);
         }
    }
}

How PlayOneShot Works

The PlayOneShot(AudioClip clip) method plays the given AudioClip through the AudioSource it's called on, but it doesn't stop any currently playing clip on that same AudioSource. This allows multiple sounds triggered by PlayOneShot to overlap and play concurrently through a single AudioSource instance.

Alternatively, you could get references to both specific Audio Source components and call audioSource1.Play() and audioSource2.Play() simultaneously, provided each source has its AudioClip assigned in the Inspector or via script. However, PlayOneShot is generally preferred for overlapping short sound effects.

By combining multiple Audio Source components on one GameObject with scripting methods like PlayOneShot(), you gain flexible control over playing multiple sounds from a single entity in your Unity project.

Related Articles