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