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); } }