Files
aibis-dream/Assets/Scripts/UI/Terminal/TerminalPanelAnimator.cs
T

92 lines
2.4 KiB
C#

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<CanvasGroup>();
}
}
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);
}
}
}