UnityEssentials
Small but useful tools and features for Unity
AudioSourceManager.cs
Go to the documentation of this file.
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine.Audio;
4 
5 namespace UnityEngine
6 {
10  public class AudioSourceManager : MonoBehaviour
11  {
12  [Tooltip("The amount of Audio Sources that will exist in the GameObject where this component lives. If they are missing, they will be created during this component's Awake.")]
13  [SerializeField] private int minimumQuantityOfExistingAudioSources;
14  [HideInInspector] private List<AudioSource> audioSources;
15 
26  public AudioSource PlayClip(AudioClip clip, float volume = 1, bool loop = false, float pitch = 1, float delay = 0f, AudioMixerGroup audioMixerGroup = null)
27  {
28  if (clip == null)
29  {
30  Debug.LogWarning("Trying to play a null clip", this);
31  return null;
32  }
33 
34  AudioSource configuredAudioSource = ConfigureAudioSource(GetFreeAudioSource(), clip, volume, loop, pitch, audioMixerGroup);
35  configuredAudioSource.PlayDelayed(delay);
36  return configuredAudioSource;
37  }
38 
44  public List<AudioSource> StopClip(AudioClip clipInAudioSource)
45  {
46  List<AudioSource> audioSourcesWithClip = GetAudioSources(clipInAudioSource);
47  foreach (AudioSource audioSourceWithClip in audioSourcesWithClip)
48  {
49  audioSourceWithClip.Stop();
50  }
51 
52  return audioSourcesWithClip;
53  }
54 
60  public AudioSource GetAudioSource(int index)
61  {
62  return audioSources[index];
63  }
64 
69  public void StopAllClips(bool fadeOut = false)
70  {
71  foreach (AudioSource audioSource in audioSources)
72  {
73  if (fadeOut)
74  {
75  FadeOutAudioSource(audioSource);
76  }
77  else
78  {
79  audioSource.Stop();
80  }
81  }
82  }
83 
89  public AudioSource GetAudioSource(AudioClip clipInAudioSource)
90  {
91  foreach (AudioSource audioSource in audioSources)
92  {
93  if (audioSource.clip == clipInAudioSource)
94  {
95  if (audioSource.isPlaying)
96  return audioSource;
97  }
98  }
99 
100  //Debug.LogWarning($"No Audio Source playing the clip '{clipInAudioSource.name}' was found ");
101  return null;
102  }
103 
109  public List<AudioSource> GetAudioSources(AudioClip clipInAudioSource)
110  {
111  List<AudioSource> foundAudioSources = new List<AudioSource>();
112  foreach (AudioSource audioSource in this.audioSources)
113  {
114  if (audioSource.clip == clipInAudioSource)
115  {
116  if (audioSource.isPlaying)
117  foundAudioSources.Add(audioSource);
118  }
119  }
120 
121  //if (foundAudioSources.Count <= 0)
122  // Debug.LogWarning($"No Audio Sources playing the clip '{clipInAudioSource.name}' were found ");
123 
124  return foundAudioSources;
125  }
126 
127  private void Awake()
128  {
129  audioSources = new List<AudioSource>();
130 
131  foreach (AudioSource audioSource in GetComponents<AudioSource>())
132  {
133  audioSources.Add(audioSource);
134  audioSource.enabled = true;
135  }
136 
137  for (int i = audioSources.Count; i < minimumQuantityOfExistingAudioSources; i++)
138  AddAudioSource();
139  }
140 
141  private AudioSource GetFreeAudioSource()
142  {
143  foreach (AudioSource audioSource in audioSources)
144  {
145  if (!audioSource.isPlaying)
146  {
147  return audioSource;
148  }
149  }
150 
151  return AddAudioSource();
152  }
153 
154  private AudioSource AddAudioSource()
155  {
156  AudioSource newAudioSource = gameObject.AddComponent<AudioSource>();
157  newAudioSource.playOnAwake = false;
158  audioSources.Add(newAudioSource);
159 
160  return newAudioSource;
161  }
162 
163  private AudioSource ConfigureAudioSource(AudioSource audioSource, AudioClip clip, float volume = 1, bool loop = false, float pitch = 1, AudioMixerGroup audioMixerGroup = null)
164  {
165  audioSource.clip = clip;
166  audioSource.volume = volume;
167  audioSource.outputAudioMixerGroup = audioMixerGroup;
168  audioSource.pitch = pitch;
169  audioSource.loop = loop;
170 
171  return audioSource;
172  }
173 
174  private void FadeOutAudioSource(AudioSource audioSource)
175  {
176  StartCoroutine(LowerVolumeAndStopSounds(audioSource));
177  }
178 
179  private static IEnumerator LowerVolumeAndStopSounds(AudioSource audioSource)
180  {
181  while (audioSource.volume > 0f)
182  {
183  audioSource.volume -= 0.1f;
184  yield return new WaitForSeconds(0.12f);
185 
186  }
187  audioSource.Stop();
188  audioSource.volume = 1.0f;
189  }
190  }
191 }
Component to manage multiple AudioSources (or AudioClips) at the same time (or in the same component)
static IEnumerator LowerVolumeAndStopSounds(AudioSource audioSource)
void FadeOutAudioSource(AudioSource audioSource)
List< AudioSource > GetAudioSources(AudioClip clipInAudioSource)
Returns all AudioSources that are playing the given clip.
AudioSource GetAudioSource(int index)
Returns the AudioSource with the given index from the list of managed audio sources of this AudioSour...
AudioSource GetAudioSource(AudioClip clipInAudioSource)
Returns an AudioSource that is playing the given clip.
AudioSource PlayClip(AudioClip clip, float volume=1, bool loop=false, float pitch=1, float delay=0f, AudioMixerGroup audioMixerGroup=null)
Plays the clip.
List< AudioSource > StopClip(AudioClip clipInAudioSource)
Stops playing the clip in all AudioSources related to this AudioSoundManager that are playing it.
void StopAllClips(bool fadeOut=false)
Stops playing all clips i all AudioSources related to this AudioSourceManager.
AudioSource ConfigureAudioSource(AudioSource audioSource, AudioClip clip, float volume=1, bool loop=false, float pitch=1, AudioMixerGroup audioMixerGroup=null)