sea-battle/Assets/Scripts/UI/UIPanelAnimator.cs

155 lines
4.2 KiB
C#

using System.Collections;
using UnityEngine;
/// <summary>
/// Àíèìèðóåò ïîÿâëåíèå UI ïàíåëåé ñ ýôôåêòîì ðàçâîðà÷èâàíèÿ
/// </summary>
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<RectTransform>();
if (rectTransform == null)
rectTransform = gameObject.AddComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
if (canvasGroup == null)
canvasGroup = gameObject.AddComponent<CanvasGroup>();
originalScale = rectTransform.localScale;
}
private void OnEnable()
{
if (animateOnEnable)
PlayShowAnimation();
}
/// <summary>
/// Çàïóñêàåò àíèìàöèþ ïîÿâëåíèÿ ïàíåëè
/// </summary>
public void PlayShowAnimation()
{
if (animationCoroutine != null)
StopCoroutine(animationCoroutine);
animationCoroutine = StartCoroutine(ShowAnimationCoroutine());
}
/// <summary>
/// Çàïóñêàåò àíèìàöèþ ïîÿâëåíèÿ ïàíåëè ñ çàäåðæêîé
/// </summary>
public void PlayShowAnimationWithDelay(float delay)
{
if (animationCoroutine != null)
StopCoroutine(animationCoroutine);
animationCoroutine = StartCoroutine(ShowAnimationWithDelayCoroutine(delay));
}
/// <summary>
/// Çàïóñêàåò àíèìàöèþ ñêðûòèÿ ïàíåëè
/// </summary>
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;
}
}