AudioSourseSet GetManagedSource(object key, Transform parent = null) { AudioSourseSet res = new AudioSourseSet(); if (!managedUsedSources.ContainsKey(key)) { managedUsedSources.Add(key, new List <AudioSourseSet>(maxAudioSourceCount)); } if (poolSources.Count > 0) { res = poolSources[0]; poolSources.RemoveAt(0); managedUsedSources[key].Add(res); } else if (poolSources.Count + usedSources.Count + managedUsedSources.Count < maxAudioSourceCount) { res = CreateNewSource("Source" + (poolSources.Count + usedSources.Count + managedUsedSources.Count)); managedUsedSources[key].Add(res); } if (res.source != null) { res.PosToUpdate = parent; } return(res); }
void ReturnBackSource(AudioSourseSet source) { usedSources.Remove(source); poolSources.Add(source); if (source.coroutineClipQueue != null) { StopCoroutine(source.coroutineClipQueue); source.coroutineClipQueue = null; } source.clipQueue = null; source.fadeStartVolume = 1; source.priority = 0; source.needToStop = false; //source.source.transform.parent = transform; source.PosToUpdate = null; source.source.Stop(); }
AudioSourseSet GetSource() { AudioSourseSet res = new AudioSourseSet(); if (poolSources.Count > 0) { res = poolSources[0]; poolSources.RemoveAt(0); usedSources.Add(res); } else if (poolSources.Count + usedSources.Count + managedUsedSources.Count < maxAudioSourceCount) { res = CreateNewSource("Source" + (poolSources.Count + usedSources.Count + managedUsedSources.Count)); usedSources.Add(res); } return(res); }
IEnumerator PlayClipsQueue(AudioSourseSet src, bool loop, float volume, SoundManager.SoundType type, float updateDeltaTime = 0.5f) { while (src.clipQueue.Count > 0) { var clipSet = src.clipQueue.Peek(); src.currentClipSet = clipSet; src.source.clip = clipSet.Clip; src.source.loop = clipSet.Loop; src.volumeDempfer = volume; src.Type = type; src.source.transform.position = src.clipQueue.Peek().Position; //src.source.transform.localPosition = src.clipQueue.Peek().Position; src.Play(); if (!src.source.loop) { var clip = src.clipQueue.Dequeue(); if (loop) { src.clipQueue.Enqueue(clip); } //если установили позицию для апдейта, то обновляем регулярно... if (src.PosToUpdate != null) { var timer = 0f; var duration = src.source.clip.length; while (timer < duration) { timer += Time.unscaledDeltaTime; if (src.PosToUpdate != null) { src.source.transform.position = src.PosToUpdate.position; } yield return(new WaitForSecondsRealtime(updateDeltaTime)); } } else { yield return(new WaitForSecondsRealtime(src.source.clip.length)); } } else { if (src.PosToUpdate != null) { while (true) { if (src.PosToUpdate != null) { src.source.transform.position = src.PosToUpdate.position; } yield return(new WaitForSecondsRealtime(updateDeltaTime)); } } else { break; } } } if (src.clipQueue.Count == 0) { ReturnBackSource(src); } }