using System; using DG.Tweening; using UnityEngine; namespace AibisDream.UI.Terminal { public class TerminalPanelAnimator : MonoBehaviour { [SerializeField] private CanvasGroup canvasGroup; [SerializeField] private RectTransform sweep; [SerializeField] private float fadeDuration = 0.18f; [SerializeField] private float sweepDuration = 0.24f; private Tween _activeTween; private void Awake() { if (canvasGroup == null) { canvasGroup = GetComponent(); } } public void Show(Action onComplete = null) { gameObject.SetActive(true); _activeTween?.Kill(); if (canvasGroup == null) { onComplete?.Invoke(); return; } canvasGroup.alpha = 0f; canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; PrepareSweep(); var sequence = DOTween.Sequence().SetUpdate(true); sequence.Join(canvasGroup.DOFade(1f, fadeDuration)); if (sweep != null) { sequence.Join(sweep.DOAnchorPosX(0f, sweepDuration).SetEase(Ease.OutQuad)); } sequence.OnComplete(() => { canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; onComplete?.Invoke(); }); _activeTween = sequence; } public void Hide(Action onComplete = null) { _activeTween?.Kill(); if (canvasGroup == null) { gameObject.SetActive(false); onComplete?.Invoke(); return; } canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; _activeTween = canvasGroup .DOFade(0f, fadeDuration) .SetUpdate(true) .OnComplete(() => { gameObject.SetActive(false); onComplete?.Invoke(); }); } private void PrepareSweep() { if (sweep == null) { return; } var width = ((RectTransform)transform).rect.width; sweep.anchoredPosition = new Vector2(-width * 0.08f, sweep.anchoredPosition.y); } } }