public static AudioUnit GetFromPool() { if (audioParent == null) { audioParent = new GameObject(audioPoolParent); } AudioUnit audio = audioPool.Where(x => !x.gameObject.activeSelf).FirstOrDefault(); if (audio == null) { audio = new GameObject(audioUnitPrefix, typeof(AudioSource), typeof(AudioUnit)).GetComponent <AudioUnit>(); audioPool.Add(audio); audio.transform.SetParent(audioParent.transform, false); } audio.name = audioUnitPrefix; audio.OnPlay += delegate() { audio.gameObject.SetActive(true); }; return(audio); }
public static void ReturnToPool(AudioUnit audio) { audio.gameObject.SetActive(false); if (!audioPool.Contains(audio)) { audioPool.Add(audio); } }
public AudioUnit Play(string audioUnitPrefixName = null) { // Initialization AudioUnit audioSource = AudioPool.GetFromPool(); // Setup Paramaters audioSource.playOnAwake = false; audioSource.loop = loopType == AudioLoopType.Normal; audioSource.loopType = loopType; audioSource.timeBetweenLoop = timeBetweenLoop; audioSource.outputAudioMixerGroup = mixerGroup; audioSource.clip = isUsingClips ? clips.Random() : clip; audioSource.clips = isUsingClips ? clips : null; audioSource.pitch = isPitchModified ? 1f - pitchMaxVariation.RandomValue : 1f; audioSource.isGoingToStop = autoDestroy != AudioStopType.No; if (audioSource.clip == null) { Debug.LogWarning($"An audio unit is created without a clip."); AudioPool.ReturnToPool(audioSource); } else { if (audioUnitPrefixName != null) { audioSource.gameObject.name = audioUnitPrefixName; } audioSource.gameObject.name += audioSource.clip.name; // Auto Destroy switch (autoDestroy) { case AudioStopType.StopAfterDuration: audioSource.duration = multiplier; break; case AudioStopType.StopAfterPlays: audioSource.duration = audioSource.clip.length * (multiplier - 1); break; } // Play Sound audioSource.Play(); } return(audioSource); }