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

106 lines
3.1 KiB
C#

using System;
using DG.Tweening;
using UnityEngine;
namespace AibisDream.UI
{
public class TerminalPanelAnimator : MonoBehaviour
{
[SerializeField] private CanvasGroup canvasGroup;
[SerializeField] private RectTransform sweep;
[Header("终端风格")]
[SerializeField, Range(0f, 1f)] private float visibleAlpha = 0.88f;
[SerializeField] private float fadeDuration = 0.06f;
[SerializeField] private Ease showEase = Ease.Linear;
[SerializeField] private Ease hideEase = Ease.Linear;
[SerializeField] private float sweepDuration = 0.08f;
private Tween _activeTween;
private void Awake()
{
if (canvasGroup == null)
{
canvasGroup = GetComponent<CanvasGroup>();
}
}
/// <param name="onComplete">淡入完成回调。</param>
/// <param name="prepare">在 SetActive 之前执行的内容准备(赋值、布局等)。</param>
public void Show(Action onComplete = null, Action prepare = null)
{
_activeTween?.Kill();
prepare?.Invoke();
if (canvasGroup != null)
{
canvasGroup.alpha = 0f;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
}
PrepareSweep();
gameObject.SetActive(true);
Canvas.ForceUpdateCanvases();
if (canvasGroup == null)
{
onComplete?.Invoke();
return;
}
var sequence = DOTween.Sequence().SetUpdate(true);
sequence.Join(canvasGroup.DOFade(visibleAlpha, fadeDuration).SetEase(showEase));
if (sweep != null)
{
sequence.Join(sweep.DOAnchorPosX(0f, sweepDuration).SetEase(Ease.Linear));
}
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)
.SetEase(hideEase)
.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);
}
}
}