public static AudioSourceFadeState FadeOut(this AudioSource source, MonoBehaviour behaviour = null, float waitDuration = 0f, float fadeDuration = 3f, bool stopOnFinished = true, Action finishedCallback = null) { behaviour = behaviour ?? AutoMonoBehaviour.Instantiate(source.gameObject); AudioSourceFadeState fadeState = new AudioSourceFadeState(source); behaviour.StartCoroutine(StartFadeOut(source, waitDuration, fadeDuration, stopOnFinished, finishedCallback, fadeState)); return fadeState; }
public static AudioSourceFadeState FadeOut(this AudioSource source, MonoBehaviour behaviour = null, float waitDuration = 0f, float fadeDuration = 3f, bool stopOnFinished = true, Action finishedCallback = null) { behaviour = behaviour ?? AutoMonoBehaviour.Instantiate(source.gameObject); AudioSourceFadeState fadeState = new AudioSourceFadeState(source); behaviour.StartCoroutine(StartFadeOut(source, waitDuration, fadeDuration, stopOnFinished, finishedCallback, fadeState)); return(fadeState); }
private static IEnumerator StartFadeOut(AudioSource source, float waitDuration, float fadeDuration, bool stopOnFinished, Action finishedCallback, AudioSourceFadeState fadeState) { if (waitDuration > 0) { yield return new WaitForSeconds(waitDuration); } float startingVolume = source.volume; float currentDuration = 0; float startTime = Time.time; while (currentDuration < fadeDuration && fadeState.IsFading) { source.volume = Mathf.Lerp(startingVolume, 0, currentDuration / fadeDuration); yield return null; currentDuration = Time.time - startTime; } fadeState.IsFading = false; if (finishedCallback != null && fadeState.CallCallback) { finishedCallback(); } if (stopOnFinished && fadeState.ShouldStop) { source.Stop(); } }
private static IEnumerator StartFadeOut(AudioSource source, float waitDuration, float fadeDuration, bool stopOnFinished, Action finishedCallback, AudioSourceFadeState fadeState) { if (waitDuration > 0) { yield return(new WaitForSeconds(waitDuration)); } float startingVolume = source.volume; float currentDuration = 0; float startTime = Time.time; while (currentDuration < fadeDuration && fadeState.IsFading) { source.volume = Mathf.Lerp(startingVolume, 0, currentDuration / fadeDuration); yield return(null); currentDuration = Time.time - startTime; } fadeState.IsFading = false; if (finishedCallback != null && fadeState.CallCallback) { finishedCallback(); } if (stopOnFinished && fadeState.ShouldStop) { source.Stop(); } }