using System.Collections; using UnityEngine; /// /// Анимирует появление UI панелей с эффектом разворачивания /// public class UIPanelAnimator : MonoBehaviour { [Header("Animation Settings")] [SerializeField] private float animationDuration = 0.5f; [SerializeField] private AnimationCurve scaleCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); [SerializeField] private bool animateOnEnable = true; private RectTransform rectTransform; private CanvasGroup canvasGroup; private Vector3 originalScale; private Coroutine animationCoroutine; private void Awake() { rectTransform = GetComponent(); if (rectTransform == null) rectTransform = gameObject.AddComponent(); canvasGroup = GetComponent(); if (canvasGroup == null) canvasGroup = gameObject.AddComponent(); originalScale = rectTransform.localScale; } private void OnEnable() { if (animateOnEnable) PlayShowAnimation(); } /// /// Запускает анимацию появления панели /// public void PlayShowAnimation() { if (animationCoroutine != null) StopCoroutine(animationCoroutine); animationCoroutine = StartCoroutine(ShowAnimationCoroutine()); } /// /// Запускает анимацию появления панели с задержкой /// public void PlayShowAnimationWithDelay(float delay) { if (animationCoroutine != null) StopCoroutine(animationCoroutine); animationCoroutine = StartCoroutine(ShowAnimationWithDelayCoroutine(delay)); } /// /// Запускает анимацию скрытия панели /// public void PlayHideAnimation(System.Action onComplete = null) { if (animationCoroutine != null) StopCoroutine(animationCoroutine); animationCoroutine = StartCoroutine(HideAnimationCoroutine(onComplete)); } private IEnumerator ShowAnimationWithDelayCoroutine(float delay) { // Начальное состояние - невидимая и маленькая rectTransform.localScale = Vector3.zero; canvasGroup.alpha = 0f; yield return new WaitForSeconds(delay); yield return ShowAnimationCoroutine(); } private IEnumerator ShowAnimationCoroutine() { // Начальное состояние rectTransform.localScale = Vector3.zero; canvasGroup.alpha = 0f; float elapsed = 0f; while (elapsed < animationDuration) { elapsed += Time.deltaTime; float t = elapsed / animationDuration; float curveValue = scaleCurve.Evaluate(t); // Анимация масштаба (разворачивание) rectTransform.localScale = originalScale * curveValue; // Анимация прозрачности canvasGroup.alpha = curveValue; yield return null; } // Финальное состояние rectTransform.localScale = originalScale; canvasGroup.alpha = 1f; animationCoroutine = null; } private IEnumerator HideAnimationCoroutine(System.Action onComplete) { float elapsed = 0f; while (elapsed < animationDuration) { elapsed += Time.deltaTime; float t = 1f - (elapsed / animationDuration); float curveValue = scaleCurve.Evaluate(t); // Анимация масштаба (сворачивание) rectTransform.localScale = originalScale * curveValue; // Анимация прозрачности canvasGroup.alpha = curveValue; yield return null; } // Финальное состояние rectTransform.localScale = Vector3.zero; canvasGroup.alpha = 0f; animationCoroutine = null; onComplete?.Invoke(); } private void OnDisable() { if (animationCoroutine != null) { StopCoroutine(animationCoroutine); animationCoroutine = null; } // Сброс к исходному состоянию if (rectTransform != null) rectTransform.localScale = originalScale; if (canvasGroup != null) canvasGroup.alpha = 1f; } }