using System.Collections; using UnityEngine; public class MenuIntroController : MonoBehaviour { [System.Serializable] public class MenuItem { public RectTransform rect; public CanvasGroup canvasGroup; public float delay; [HideInInspector] public Vector2 targetPosition; } public MenuItem[] menuItems; public float moveDistance = 80f; public float introDuration = 0.6f; // 나타날 때 속도 public float outroDuration = 0.3f; // 사라질 때 속도 public AnimationCurve ease = AnimationCurve.EaseInOut(0, 0, 1, 1); private void Awake() { foreach (MenuItem item in menuItems) { item.targetPosition = item.rect.anchoredPosition; item.rect.anchoredPosition = item.targetPosition + new Vector2(moveDistance, 0f); item.canvasGroup.alpha = 0f; item.canvasGroup.interactable = false; item.canvasGroup.blocksRaycasts = false; } } private void Start() { StartCoroutine(PlayIntro()); } // ── 인트로 (슬라이드 인) ─────────────────── private IEnumerator PlayIntro() { foreach (MenuItem item in menuItems) StartCoroutine(AnimateItemIn(item)); yield return null; } private IEnumerator AnimateItemIn(MenuItem item) { yield return new WaitForSeconds(item.delay); float time = 0f; Vector2 startPos = item.targetPosition + new Vector2(moveDistance, 0f); while (time < introDuration) { time += Time.deltaTime; float curved = ease.Evaluate(Mathf.Clamp01(time / introDuration)); item.rect.anchoredPosition = Vector2.Lerp(startPos, item.targetPosition, curved); item.canvasGroup.alpha = Mathf.Lerp(0f, 1f, curved); yield return null; } item.rect.anchoredPosition = item.targetPosition; item.canvasGroup.alpha = 1f; item.canvasGroup.interactable = true; item.canvasGroup.blocksRaycasts = true; } // ── 아웃트로 (슬라이드 아웃) ─────────────── public IEnumerator PlayOutro() { foreach (MenuItem item in menuItems) StartCoroutine(AnimateItemOut(item)); float maxWait = 0f; foreach (MenuItem item in menuItems) maxWait = Mathf.Max(maxWait, item.delay); yield return new WaitForSeconds(maxWait + outroDuration); } private IEnumerator AnimateItemOut(MenuItem item) { yield return new WaitForSeconds(item.delay); float time = 0f; Vector2 startPos = item.rect.anchoredPosition; Vector2 exitPos = item.targetPosition + new Vector2(moveDistance, 0f); while (time < outroDuration) { time += Time.deltaTime; float curved = ease.Evaluate(Mathf.Clamp01(time / outroDuration)); item.rect.anchoredPosition = Vector2.Lerp(startPos, exitPos, curved); item.canvasGroup.alpha = Mathf.Lerp(1f, 0f, curved); yield return null; } item.rect.anchoredPosition = exitPos; item.canvasGroup.alpha = 0f; item.canvasGroup.interactable = false; item.canvasGroup.blocksRaycasts = false; } // ── 외부에서 재실행 ──────────────────────── public void ReplayIntro() { StopAllCoroutines(); foreach (MenuItem item in menuItems) { item.rect.anchoredPosition = item.targetPosition + new Vector2(moveDistance, 0f); item.canvasGroup.alpha = 0f; item.canvasGroup.interactable = false; item.canvasGroup.blocksRaycasts = false; } StartCoroutine(PlayIntro()); } }