14internal class AudioManager : MonoSingleton<AudioManager>
16 private Queue<AudioSource> _audioSourcePool =
new();
17 private List<AudioSource> _playingSources =
new();
19 public static void CreateAudioManager()
22 Instance =
new GameObject(
"AudioManager").AddComponent<AudioManager>();
25 public AudioSource PlaySound(
28 Transform parent =
null,
34 bool bypassEffects =
false,
35 float minDistance = 0,
36 float? maxDistance =
null,
37 float? dopplerLevel =
null,
39 AudioRolloffMode? rolloffMode =
null,
40 AnimationCurve customRolloffCurve =
null,
42 string sourceType =
"")
44 if (!clip)
return null;
46 if (_audioSourcePool.Count == 0)
49 var source = _audioSourcePool.Dequeue();
51 source.transform.position = position;
53 source.transform.SetParent(parent,
true);
54 source.volume = volume;
57 source.spatialBlend = spatial;
58 source.reverbZoneMix = reverbMix;
59 source.bypassEffects = bypassEffects;
60 source.minDistance = minDistance;
62 if (!
string.IsNullOrEmpty(sourceType) && global::AudioManager.sourceTypeDict.TryGetValue(sourceType, out var audioSourceType))
64 AudioSource audioSourcePrefab = audioSourceType.audioSourcePrefab;
65 source.dopplerLevel = dopplerLevel ?? audioSourcePrefab.dopplerLevel;
66 source.spread = spread ?? audioSourcePrefab.spread;
67 source.maxDistance = maxDistance ?? audioSourcePrefab.maxDistance;
68 if (rolloffMode ==
null)
70 AnimationCurve customCurve = audioSourcePrefab.GetCustomCurve(AudioSourceCurveType.CustomRolloff);
71 source.rolloffMode = AudioRolloffMode.Custom;
72 source.SetCustomCurve(AudioSourceCurveType.CustomRolloff, customRolloffCurve ?? customCurve);
77 AudioSource defaultAudio = global::AudioManager.defaultAudio;
78 source.dopplerLevel = dopplerLevel ?? defaultAudio.dopplerLevel;
79 source.spread = spread ?? defaultAudio.spread;
80 source.maxDistance = maxDistance ?? defaultAudio.maxDistance;
81 if (rolloffMode ==
null)
83 AnimationCurve customCurve = defaultAudio.GetCustomCurve(AudioSourceCurveType.CustomRolloff);
84 source.rolloffMode = AudioRolloffMode.Custom;
85 source.SetCustomCurve(AudioSourceCurveType.CustomRolloff, customRolloffCurve ?? customCurve);
89 source.rolloffMode = rolloffMode ?? source.rolloffMode;
91 source.outputAudioMixerGroup = mixerType
switch
93 AudioMixerType.Music => global::AudioManager.instance.soundtrackMixer,
94 AudioMixerType.Sfx => global::AudioManager.instance.gameMixer,
95 AudioMixerType.UI => global::AudioManager.instance.UIMixer,
96 _ => source.outputAudioMixerGroup
99 source.gameObject.SetActive(
true);
100 _playingSources.Add(source);
106 private void CreateAudioSource()
108 var source =
new GameObject(
"AudioSource").AddComponent<AudioSource>();
109 source.transform.SetParent(transform);
110 source.playOnAwake =
false;
111 _audioSourcePool.Enqueue(source);
114 private void SendBackToPool(AudioSource source)
116 _audioSourcePool.Enqueue(source);
117 source.transform.SetParent(transform);
118 source.gameObject.SetActive(
false);
121 private void Update()
123 for (
int sourceIndex = _playingSources.Count - 1; sourceIndex >= 0; sourceIndex--)
125 var source = _playingSources[sourceIndex];
128 _playingSources.RemoveAt(sourceIndex);
131 if (!source.isPlaying)
133 _playingSources.RemoveAt(sourceIndex);
134 SendBackToPool(source);