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