using System; using System.Collections; using UnityEngine; using UnityEngine.UI; public class Fader : MonoBehaviour { private CanvasGroup canvasGroup; [SerializeField] private float fadeDuration = 1f; [SerializeField] private bool isFullBlack = false; private bool isFading = false; public static Fader instance => CanvasManager.singleton.fader; void Start() { canvasGroup = GetComponent(); StartCoroutine(FadeIn()); } public void SetFullBlack() { isFullBlack = true; canvasGroup.alpha = 1; } public void SetTransparent() { isFullBlack = false; canvasGroup.alpha = 0; } // from black to transparent public static IEnumerator FadeIn() { instance.isFading = true; instance.SetFullBlack(); float t = 0; while (t < instance.fadeDuration) { t += Time.deltaTime; instance.canvasGroup.alpha = 1 - t / instance.fadeDuration; yield return null; } instance.isFading = false; instance.SetTransparent(); } // from transparent to black public static IEnumerator FadeOut() { instance.isFading = true; instance.SetTransparent(); float t = 0; while (t < instance.fadeDuration) { t += Time.deltaTime; instance.canvasGroup.alpha = t / instance.fadeDuration; yield return null; } instance.isFading = false; instance.SetFullBlack(); } public static void Fade(Action fullBlackCallBack, Action endFadeOutCallBack = null, bool fadeOut = true) { instance.StartCoroutine(FadeCoroutine(fullBlackCallBack, endFadeOutCallBack, fadeOut)); } private static IEnumerator FadeCoroutine(Action fullBlackCallBack, Action endFadeOutCallBack = null, bool fadeOut = true) { yield return FadeOut(); fullBlackCallBack.Invoke(); if (fadeOut) { yield return FadeIn(); endFadeOutCallBack?.Invoke(); } } }