using System;
using Cysharp.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
using UniTask = Cysharp.Threading.Tasks.UniTask;
///
/// UI窗口基类 - 动画部分
/// 包含窗口显示/隐藏动画相关功能
///
public abstract partial class UIWindow
{
#region Animation
///
/// 播放窗口动画
///
/// 是否为显示动画
/// 动画完成回调
/// 动画任务
public virtual async UniTask PlayAnimation(bool isShow, Action callBack = null)
{
var canvasGroup = gameObject.GetComponent();
if (!canvasGroup)
{
canvasGroup = gameObject.AddComponent();
}
var time = 0.2f;
_isPlayingOpenAnim = true;
_openAnimSeq = DOTween.Sequence();
if (isShow)
{
canvasGroup.alpha = 0;
time = 0.3f;
var tw0 = canvasGroup.DOFade(1, time);
_openAnimSeq.Append(tw0);
_openAnimSeq.AppendCallback(() =>
{
_isPlayingOpenAnim = false;
_openAnimSeq.Kill();
_openAnimSeq = null;
callBack?.Invoke();
});
}
else
{
canvasGroup.alpha = 1;
var tw1 = canvasGroup.DOFade(0, time);
_openAnimSeq.Append(tw1);
_openAnimSeq.AppendCallback(() =>
{
if (!_isCloseCbCalled)
{
_isPlayingOpenAnim = false;
_openAnimSeq.Kill();
_openAnimSeq = null;
callBack?.Invoke();
_isCloseCbCalled = true;
}
});
await UniTask.WaitUntil(() =>
{
if (null == _openAnimSeq)
return true;
if (!_openAnimSeq.IsActive())
return true;
return _openAnimSeq.IsComplete();
});
//保证销毁界面时全都销毁掉
//await UniTask.WaitForSeconds(time); // UniTask.wa((int)time * 1000 + 10);
if (!_isCloseCbCalled)
{
_isPlayingOpenAnim = false;
_openAnimSeq?.Kill();
_openAnimSeq = null;
callBack?.Invoke();
_isCloseCbCalled = true;
}
}
}
///
/// 播放显示动画
///
/// 动画完成回调
/// 动画任务
public virtual async UniTask AnimShow(Action callBack = null)
{
DebugUtil.Log("播放显示动画");
await PlayAnimation(true, callBack);
}
///
/// 播放隐藏动画
///
/// 动画完成回调
/// 动画任务
public virtual async UniTask AnimHide(Action callBack = null)
{
DebugUtil.Log("播放隐藏动画");
await PlayAnimation(false, callBack);
}
#endregion
}