private void DisposeOfSource(PooledAudioSource data) { //Search for source in list and remove for (int i = 0; i < playingAudio.Count; i++) { if (playingAudio[i].Equals(data)) { //Label complete and dispose playingAudio[i].complete = true; playingAudio.RemoveAt(i); } } data.Dispose(); AudioSource source = (AudioSource)data.audioSource; if (source == null) { return; } source.Stop(); source.gameObject.SetActive(false); if (audioPool.Count > maxAudioPool) { Destroy(source.gameObject); } else { audioPool.Add(source); } }
//Play a random sound at a position selected from a list public static PooledAudioSource PlayAudioAtTransform(List <ArdenAudioClip> clips, Transform transform, MixerGroup group = MixerGroup.sfx, float volume = 1, bool looped = false, AudioSourceSettings settings = null) { if (clips == null) { return(null); } if (clips.Count == 0) { return(null); } PooledAudioSource source = null; if (clips.Count == 1) { source = PlayPooledClip(clips[0].audioClip, transform.position, group, clips[0].volume * volume, clips[0].GetPitch(), looped, settings); } else { int r = UnityEngine.Random.Range(0, clips.Count); source = PlayPooledClip(clips[r].audioClip, transform.position, group, clips[r].volume * volume, clips[r].GetPitch(), looped, settings); } if (source != null) { source.attached = transform; source.Update(); } return(source); }
public void Init(PooledAudioSource source) { this.source = source; position = this.source.audioSource.transform.position; source.onComplete += () => { _OnComplete(); }; }
public override ArdenAudioInstance Play(AudioSourceSettings settings, float volume, MixerGroup group = MixerGroup.sfx, bool looped = false) { PooledAudioSource source = SoundManager.PlayPooledClip(audioClip, group, volume * this.volume, GetPitch(), looped, settings); ArdenAudioClipInstance instance = new ArdenAudioClipInstance(this, settings); instance.Init(source); return(instance); }
public static PooledAudioSource PlayAudioAtTransform(ArdenAudioClip clip, Transform transform, MixerGroup group = MixerGroup.ui, float volume = 1, AudioSourceSettings settings = null, bool looped = false) { if (clip == null) { return(null); } PooledAudioSource source = PlayPooledClip(clip.audioClip, transform.position, group, clip.volume * volume, clip.GetPitch(), looped, settings); if (source != null) { source.attached = transform; source.Update(); } return(source); }
//Force stop a specific source public static void StopPooledClip(PooledAudioSource source) { if (source == null) { return; } if (source.complete) { return; } if (Instance.playingAudio.Contains(source)) { //Stop coroutine if (source.coroutine != null) { CoroutineManager.StopACoroutine(source.coroutine); } Instance.DisposeOfSource(source); } }
private void OnAudioSourceDone(PooledAudioSource source) { DisposeOfSource(source); }
//Play a sound at a position public static PooledAudioSource PlayPooledClip(AudioClip clip, Vector3?position, MixerGroup group = MixerGroup.sfx, float volume = 1, float pitch = 1, bool loop = false, AudioSourceSettings settings = null) { if (Instance.audioPool == null) { Instance.audioPool = new List <AudioSource>(); } if (Instance.audioPoolObject == null) { Instance.audioPoolObject = new GameObject("__Audio Pool (Singleton)"); GameObject.DontDestroyOnLoad(Instance.audioPoolObject); } if (clip == null) { return(null); } if (settings == null) { settings = new AudioSourceSettings(); } AudioSource audioSource = null; if (position == null) { audioSource = Instance.GetAudioSource(); } else { audioSource = Instance.GetAudioSource((Vector3)position); } audioSource.outputAudioMixerGroup = GetMixerGroup(group); audioSource.clip = clip; audioSource.volume = volume; audioSource.loop = loop; audioSource.name = clip.name; audioSource.time = 0; if (pitch > 0) { audioSource.pitch = pitch; } else { audioSource.pitch = 0.01f; } audioSource.Play(); audioSource.rolloffMode = settings.rolloffMode; audioSource.maxDistance = settings.maxDistance; audioSource.minDistance = settings.minDistance; PooledAudioSource audioSourceData = new PooledAudioSource(); audioSourceData.audioSource = audioSource; audioSourceData.complete = false; //By default, anything not music, ambient, or UI will be affected by time if (group != MixerGroup.ambient && group != MixerGroup.music && group != MixerGroup.ui) { audioSourceData.gameTimebased = true; } if (loop == false) { IEnumerator WaitTillAudioComplete() { yield return(new WaitWhile(() => { if (audioSource == null) { return false; } return audioSource.isPlaying; })); if (audioSourceData.onComplete != null) { audioSourceData.onComplete(); } Instance.OnAudioSourceDone(audioSourceData); } audioSourceData.coroutine = CoroutineManager.RunExternalCoroutine(WaitTillAudioComplete()); } Instance.playingAudio.Add(audioSourceData); return(audioSourceData); }