155 lines
4.2 KiB
C#
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;
|
|
}
|
|
}
|
|
|