示例#1
0
    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);
        }
    }