NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/UIWindow.Animation.cs

110 lines
3.0 KiB
C#

using System;
using Cysharp.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
using UniTask = Cysharp.Threading.Tasks.UniTask;
/// <summary>
/// UI窗口基类 - 动画部分
/// 包含窗口显示/隐藏动画相关功能
/// </summary>
public abstract partial class UIWindow
{
#region Animation
/// <summary>
/// 播放窗口动画
/// </summary>
/// <param name="isShow">是否为显示动画</param>
/// <param name="callBack">动画完成回调</param>
/// <returns>动画任务</returns>
public virtual async UniTask PlayAnimation(bool isShow, Action callBack = null)
{
var canvasGroup = gameObject.GetComponent<CanvasGroup>();
if (!canvasGroup)
{
canvasGroup = gameObject.AddComponent<CanvasGroup>();
}
var time = 0.3f;
_isPlayingOpenAnim = true;
_openAnimSeq = DOTween.Sequence();
if (isShow)
{
canvasGroup.alpha = 0;
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;
}
}
}
/// <summary>
/// 播放显示动画
/// </summary>
/// <param name="callBack">动画完成回调</param>
/// <returns>动画任务</returns>
public virtual async UniTask AnimShow(Action callBack = null)
{
await PlayAnimation(true, callBack);
}
/// <summary>
/// 播放隐藏动画
/// </summary>
/// <param name="callBack">动画完成回调</param>
/// <returns>动画任务</returns>
public virtual async UniTask AnimHide(Action callBack = null)
{
await PlayAnimation(false, callBack);
}
#endregion
}