示例#1
0
 private IEnumerator VolumeChangeCoroutine(ViewSoundInfo info, float targetVolume, bool destroyAtEnd)
 {
     if (info.Coroutine != null)
     {
         UIManager.Instance.StopCoroutine(info.Coroutine);
     }
     while (info.AudioSource && info.AudioSource.volume != targetVolume)
     {
         info.AudioSource.volume = Mathf.MoveTowards(info.AudioSource.volume, targetVolume, Time.unscaledDeltaTime * VolumeChangeSpeed);
         yield return(null);
     }
     if (destroyAtEnd)
     {
         if (info.AudioSource)
         {
             if (viewSounds.TryGetValue(info.AudioSource.clip, out var otherInfo))
             {
                 if (info == otherInfo)
                 {
                     viewSounds.Remove(info.AudioSource.clip);
                 }
             }
             info.AudioSource.Stop();
             GameObject.Destroy(info.AudioSource.gameObject);
         }
     }
 }
示例#2
0
        private void Play(AudioClip backgroundSound, bool playFromStart)
        {
            if (viewSounds.TryGetValue(backgroundSound, out var info))
            {
                info.ViewsCounter++;
                StartVolumeChange(info, info.InitVolume, false);
                return;
            }

            var audio = GameObject.Instantiate(backgroundSoundPrefab);

            audio.transform.SetParent(UIManager.Instance.transform);
            audio.loop = true;
            audio.clip = backgroundSound;
            audio.time = playFromStart ? 0 : UnityEngine.Random.Range(0, audio.clip.length / 2);
            audio.Play();

            info             = new ViewSoundInfo();
            info.AudioSource = audio;
            info.InitVolume  = audio.volume;
            info.ViewsCounter++;
            viewSounds[backgroundSound] = info;

            audio.volume = 0;
            StartVolumeChange(info, info.InitVolume, false);
        }
示例#3
0
        private void StartVolumeChange(ViewSoundInfo info, float targetVolume, bool destroyAtEnd)
        {
            if (info.Coroutine != null)
            {
                UIManager.Instance.StopCoroutine(info.Coroutine);
            }

            info.Coroutine = UIManager.Instance.StartCoroutine(VolumeChangeCoroutine(info, targetVolume, destroyAtEnd));
        }