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 }