using System.Collections; using UnityEngine; namespace NextMind.Examples.Utility { /// /// Helper component used to fade in or out a CanvasGroup. /// [RequireComponent(typeof(CanvasGroup))] public class CanvasFader : MonoBehaviour { [SerializeField] private bool initialStateIsVisible = false; [SerializeField] private bool fadeOnEnabled = true; [SerializeField] private float fadeInDuration = 0.5f; [SerializeField] private float fadeOutDuration = 0.5f; [SerializeField] private bool disableOnFadeOut = false; private CanvasGroup canvasGroup; /// /// Is this canvas currenlty enabled and visible? /// public bool IsCanvasVisible => this.gameObject.activeInHierarchy && Mathf.Approximately(canvasGroup.alpha, 1); private void Awake() { canvasGroup = GetComponent(); canvasGroup.alpha = initialStateIsVisible ? 1 : 0; } void OnEnable() { if (fadeOnEnabled) { StartFade(true); } } public void StartFade(bool fadeIn) { StartFade(fadeIn, false); } public void StartFade(bool fadeIn, bool immediate) { int targetAlpha = fadeIn ? 1 : 0; if (immediate) { canvasGroup.alpha = targetAlpha; } else { StartCoroutine(Fade(targetAlpha, fadeIn ? fadeInDuration : fadeOutDuration)); } } public IEnumerator Fade(int targetAlpha, float fadeDuration = -1) { float elapsedTime = 0; Vector2 rangeFade = new Vector2(canvasGroup.alpha, targetAlpha); if (Mathf.Approximately(fadeDuration, -1)) { fadeDuration = targetAlpha > canvasGroup.alpha ? fadeInDuration : fadeOutDuration; } while (elapsedTime < fadeDuration) { canvasGroup.alpha = Mathf.Lerp(rangeFade.x, rangeFade.y, elapsedTime / fadeDuration); elapsedTime += Time.deltaTime; yield return null; } canvasGroup.alpha = rangeFade.y; if (targetAlpha == 0 && disableOnFadeOut) { this.gameObject.SetActive(false); } } } }