using FairyGUI; using UnityEngine; namespace NBC { /// /// ui界面默认动画 /// public class PanelAnimationDef : UIAnimTask { public enum AnimType { CenterScaleBig = 0, /// 上往中滑动-- UpToSlide = 1, /// //下往中滑动 DownToSlide = 2, /// 左往中-- LeftToSlide = 3, /// 右往中-- RightToSlide = 4, /// 透明度 Fade = 5, // CenterPopScaleFade = 6, UpToSlideFade = 7, DownToSlideFade = 8, LeftToSlideFade = 9, RightToSlideFade = 10, BounceVertical = 11, Rotate = 12, Shake = 13, } private bool _isClose; private GComponent _node; private AnimType _animType; private float _animTime; public PanelAnimationDef(GComponent node, AnimType animType = AnimType.CenterScaleBig, bool close = false, float animTime = 0.5F) { _node = node; _isClose = close; _animType = animType; _animTime = animTime; } protected override void OnStart() { if (_node == null) { Finish(); return; } // 直接使用 UITweenDynamic 扩展方法处理新增复合效果 switch (_animType) { case AnimType.CenterPopScaleFade: if (!_isClose) _node.TweenPopShow(callback: Finish); else _node.TweenPopHide(callback: Finish); return; case AnimType.UpToSlideFade: if (!_isClose) _node.TweenSlideInTop(callback: Finish); else _node.TweenSlideOutTop(callback: Finish); return; case AnimType.DownToSlideFade: if (!_isClose) _node.TweenSlideInBottom(callback: Finish); else _node.TweenSlideOutBottom(callback: Finish); return; case AnimType.LeftToSlideFade: if (!_isClose) _node.TweenSlideInLeft(callback: Finish); else _node.TweenSlideOutLeft(callback: Finish); return; case AnimType.RightToSlideFade: if (!_isClose) _node.TweenSlideInRight(callback: Finish); else _node.TweenSlideOutRight(callback: Finish); return; case AnimType.BounceVertical: if (!_isClose) _node.TweenBounceShow(callback: Finish); // 向上偏移进入 else _node.TweenBounceHide(callback: Finish); return; case AnimType.Rotate: if (!_isClose) _node.TweenRotateShow(callback: Finish); else _node.TweenRotateHide(callback: Finish); return; case AnimType.Shake: // shake 只在打开时使用,关闭直接结束 if (_isClose) { Finish(); return; } _node.TweenShakeShow(callback: Finish); return; } if (_animType == AnimType.CenterScaleBig) { var strat = _isClose ? Vector3.one : Vector3.zero; var end = _isClose ? Vector3.zero : Vector3.one; var easeType = _isClose ? EaseType.BackIn : EaseType.BackOut; GTween.To(strat, end, _animTime) .SetEase(easeType) .SetTarget(_node, TweenPropType.Scale) .OnComplete(Finish); } else if (_animType == AnimType.UpToSlide || _animType == AnimType.DownToSlide) { var safeAreaY = UI.Inst.GetSafeArea().y; var hight = GRoot.inst.viewHeight; var y = _animType == AnimType.UpToSlide ? -hight : hight; var strat = _isClose ? 0 : y; var end = _isClose ? y : safeAreaY; GTween.To(strat, end, _animTime) .SetEase(EaseType.CubicOut) .SetTarget(_node, TweenPropType.Y) .OnComplete(Finish); } else if (_animType == AnimType.LeftToSlide || _animType == AnimType.RightToSlide) { var width = GRoot.inst.viewWidth; var x = _animType == AnimType.LeftToSlide ? -width : width; var strat = _isClose ? 0 : x; var end = _isClose ? x : 0; GTween.To(strat, end, _animTime) .SetEase(EaseType.CubicOut) .SetTarget(_node, TweenPropType.X) .OnComplete(Finish); } else if (_animType == AnimType.Fade) { var s = _isClose ? 1 : 0; var end = _isClose ? 0 : 1; _node.alpha = s; GTween.To(s, end, _animTime) .SetEase(EaseType.Linear) .SetTarget(_node, TweenPropType.Alpha) .OnComplete(Finish); } } /// /// 设置默认的状态 /// public override void SetDefaultInfo() { switch (_animType) { case AnimType.CenterScaleBig: _node.scale = _isClose ? Vector2.one : Vector2.zero; break; case AnimType.UpToSlide: case AnimType.DownToSlide: var hight = GRoot.inst.viewHeight; var y = _animType == AnimType.UpToSlide ? -hight : hight; _node.y = _isClose ? 0 : y; break; case AnimType.LeftToSlide: case AnimType.RightToSlide: var width = GRoot.inst.viewWidth; var x = _animType == AnimType.LeftToSlide ? -width : width; _node.x = _isClose ? 0 : x; break; case AnimType.Fade: _node.alpha = _isClose ? 1 : 0; break; case AnimType.CenterPopScaleFade: _node.scale = _isClose ? Vector2.one : new Vector2(0.8f, 0.8f); _node.alpha = _isClose ? 1 : 0; break; case AnimType.UpToSlideFade: break; case AnimType.DownToSlideFade: break; case AnimType.LeftToSlideFade: break; case AnimType.RightToSlideFade: break; case AnimType.BounceVertical: break; case AnimType.Rotate: break; case AnimType.Shake: break; } } } public static class UIPanelAnimation { public static UIAnimTask GetCenterScaleBig(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.CenterScaleBig, close, animTime); public static UIAnimTask GetUpToSlide(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.UpToSlide, close, animTime); public static UIAnimTask GetDownToSlide(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.DownToSlide, close, animTime); public static UIAnimTask GetLeftToSlide(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.LeftToSlide, close, animTime); public static UIAnimTask GetRightToSlide(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.RightToSlide, close, animTime); public static UIAnimTask GetFade(IUIPanel panel, bool close = false, float animTime = 0.5F) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.Fade, close, animTime); // 新增复合动效获取方法 public static UIAnimTask GetCenterPopScaleFade(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.CenterPopScaleFade, close); public static UIAnimTask GetUpToSlideFade(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.UpToSlideFade, close); public static UIAnimTask GetDownToSlideFade(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.DownToSlideFade, close); public static UIAnimTask GetLeftToSlideFade(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.LeftToSlideFade, close); public static UIAnimTask GetRightToSlideFade(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.RightToSlideFade, close); public static UIAnimTask GetBounceVertical(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.BounceVertical, close); public static UIAnimTask GetRotate(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.Rotate, close); public static UIAnimTask GetShake(IUIPanel panel, bool close = false) => new PanelAnimationDef(panel.ContentPane, PanelAnimationDef.AnimType.Shake, close); } }