Files
Fishing2/Assets/Scripts/NBC/UI/Runtime/UITween/UITweenDynamic.cs
2026-02-04 18:55:28 +08:00

840 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using FairyGUI;
using UnityEngine;
namespace NBC
{
public enum UISlideDirection
{
Left,
Right,
Top,
Bottom
}
public static class UITweenDynamic
{
private class TweenContext
{
public GObject target;
public float alpha;
public float scaleX;
public float scaleY;
public Vector3 position;
public float rotation;
public bool visible;
public Action callback;
}
private static readonly Dictionary<GObject, TweenContext> _contexts = new Dictionary<GObject, TweenContext>();
private static TweenContext Capture(GObject target, Action callback)
{
return new TweenContext
{
target = target,
alpha = target.alpha,
scaleX = target.scaleX,
scaleY = target.scaleY,
position = target.position,
rotation = target.rotation,
visible = target.visible,
callback = callback
};
}
// 启动新动画:如存在旧动画,先还原并调用旧回调,再杀死旧 tweens注册新上下文
private static TweenContext StartNewAnimation(GObject target, Action newCallback)
{
if (target == null) return null;
if (_contexts.TryGetValue(target, out var oldCtx))
{
// 还原旧动画状态
if (oldCtx.target != null)
{
oldCtx.target.alpha = oldCtx.alpha;
oldCtx.target.SetScale(oldCtx.scaleX, oldCtx.scaleY);
oldCtx.target.position = oldCtx.position;
oldCtx.target.rotation = oldCtx.rotation;
oldCtx.target.visible = oldCtx.visible;
}
// 调用旧动画的回调
oldCtx.callback?.Invoke();
_contexts.Remove(target);
}
GTween.Kill(target);
var ctx = Capture(target, newCallback);
_contexts[target] = ctx;
return ctx;
}
private static void FinishAnimation(GObject target)
{
if (target == null) return;
if (_contexts.TryGetValue(target, out var ctx))
{
_contexts.Remove(target);
ctx.callback?.Invoke();
}
}
#region UIPanel UI动效 (wrappers)
public static void TweenFadeShow<T>(this T self, float duration = 0.45f, Action callback = null)
where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenFadeShow(duration, callback);
}
public static void TweenFadeHide<T>(this T self, float duration = 0.3f, Action callback = null)
where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenFadeHide(duration, callback);
}
public static void TweenScaleShow<T>(this T self, float duration = 0.3f,
float fromScale = 0.8f, EaseType ease = EaseType.BackOut, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
// GComponent.TweenScaleShow signature: (duration, callback, fromScale, ease)
pane.TweenScaleShow(duration, callback, fromScale, ease);
}
public static void TweenScaleHide<T>(this T self, float duration = 0.2f,
float toScale = 0.8f, EaseType ease = EaseType.QuadIn, bool resetAfter = true, bool setInvisible = true,
Action callback = null)
where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
// GComponent.TweenScaleHide signature: (duration, callback, toScale, ease, resetAfter, setInvisible)
pane.TweenScaleHide(duration, callback, toScale, ease, resetAfter, setInvisible);
}
public static void TweenPopShow<T>(this T self, float duration = 0.2f,
float fromScale = 0.8f, EaseType ease = EaseType.BackOut, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenPopShow(duration, callback, fromScale, ease);
}
public static void TweenPopHide<T>(this T self, float duration = 0.2f, Action callback = null,
float toScale = 0.8f, EaseType ease = EaseType.QuadIn, bool setInvisible = true) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenPopHide(duration, callback, toScale, ease, setInvisible);
}
public static void TweenSlideInLeft<T>(this T self, float moveTime = 0.5f, float startFadeTimeRate = 0.42f,
float startAlpha = 0, float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideInLeft(moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset, ease, callback);
}
public static void TweenSlideOutLeft<T>(this T self, float moveTime = 0.3f, float startFadeTimeRate = 0,
float alphaTime = 0.08f, float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideOutLeft(moveTime, startFadeTimeRate, alphaTime, extraOffset, ease, resetAfter, setInvisible,
callback);
}
public static void TweenSlideInRight<T>(this T self, float moveTime = 0.5f, float startFadeTimeRate = 0.42f,
float startAlpha = 0, float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideInRight(moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset, ease, callback);
}
public static void TweenSlideOutRight<T>(this T self, float moveTime = 0.3f, float startFadeTimeRate = 0,
float alphaTime = 0.08f, float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideOutRight(moveTime, startFadeTimeRate, alphaTime, extraOffset, ease, resetAfter, setInvisible,
callback);
}
public static void TweenSlideInTop<T>(this T self, float moveTime = 0.35f, float startFadeTimeRate = 0.3f,
float startAlpha = 0, float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideInTop(moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset, ease, callback);
}
public static void TweenSlideOutTop<T>(this T self, float moveTime = 0.3f, float startFadeTimeRate = 0,
float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideOutTop(moveTime, startFadeTimeRate, alphaTime, extraOffset, ease, resetAfter, setInvisible,
callback);
}
public static void TweenSlideInBottom<T>(this T self, float moveTime = 0.35f, float startFadeTimeRate = 0.3f,
float startAlpha = 0, float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideInBottom(moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset, ease, callback);
}
public static void TweenSlideOutBottom<T>(this T self, float moveTime = 0.3f, float startFadeTimeRate = 0,
float alphaTime = 0.1f, float extraOffset = 0f, EaseType ease = EaseType.QuadIn, bool resetAfter = true,
bool setInvisible = true, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideOutBottom(moveTime, startFadeTimeRate, alphaTime, extraOffset, ease, resetAfter,
setInvisible, callback);
}
public static void TweenSlideIn<T>(this T self, UISlideDirection direction, float moveTime = 0.35f,
float startFadeTimeRate = 0.1f,
float startAlpha = 0, float alphaTime = 0.2f, float extraOffset = 0f, EaseType ease = EaseType.QuadOut,
Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideIn(direction, moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset, ease,
callback);
}
public static void TweenSlideOut<T>(this T self, UISlideDirection direction, float moveTime = 0.35f,
float startFadeTimeRate = 0.1f,
float alphaTime = 0.2f, float extraOffset = 0f, EaseType ease = EaseType.QuadIn, bool resetAfter = true,
bool setInvisible = true, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenSlideOut(direction, moveTime, startFadeTimeRate, alphaTime, extraOffset, ease, resetAfter,
setInvisible, callback);
}
public static void TweenBounceShow<T>(this T self, float duration = 0.4f, Action callback = null,
float fromYOffset = -100f) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenBounceShow(duration, callback, fromYOffset);
}
public static void TweenBounceHide<T>(this T self, float duration = 0.25f, Action callback = null,
float toYOffset = 100f, bool resetAfter = true, bool setInvisible = true) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenBounceHide(duration, callback, toYOffset, resetAfter, setInvisible);
}
public static void TweenRotateShow<T>(this T self, float duration = 0.2f, Action callback = null,
float fromRotation = -90f, EaseType ease = EaseType.BackOut) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenRotateShow(duration, callback, fromRotation, ease);
}
public static void TweenRotateHide<T>(this T self, float duration = 0.2f, Action callback = null,
float toRotation = -90f, EaseType ease = EaseType.QuadIn, bool resetAfter = true, bool setInvisible = true)
where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenRotateHide(duration, callback, toRotation, ease, resetAfter, setInvisible);
}
public static void TweenShake<T>(this T self, float duration = 0.4f, Action callback = null,
float amplitude = 12f, bool horizontal = true, int vibrato = 6) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenShake(duration, callback, amplitude, horizontal, vibrato);
}
public static void TweenShakeShow<T>(this T self, float durationScale = 0.2f, float ScaleStart = 0.3f,
float ScaleEnd = 1f, int shake = 4,
float shakeRotation = 18f, float duration = 1, Action callback = null) where T : IUIPanel
{
var pane = self?.ContentPane;
if (pane == null)
{
callback?.Invoke();
return;
}
pane.TweenShakeShow(durationScale, ScaleStart, ScaleEnd, shake, shakeRotation, duration, callback);
}
#endregion
#region GComponent UI动效
public static void TweenFadeShow(this GObject self, float duration = 0.45f, Action callback = null)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
self.alpha = 0f;
self.TweenFade(1f, duration).OnComplete(() => { FinishAnimation(self); });
}
public static void TweenFadeHide(this GObject self, float duration = 0.3f, Action callback = null)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
self.alpha = 1f;
self.TweenFade(0f, duration).OnComplete(() => { FinishAnimation(self); });
}
public static void TweenScaleShow(this GObject self, float duration = 0.3f, Action callback = null,
float fromScale = 0f, EaseType ease = EaseType.BackOut)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
self.SetPivot(0.5f, 0.5f, false);
self.SetScale(0, 0);
var ox = self.scaleX;
var oy = self.scaleY;
self.visible = true;
self.SetScale(fromScale, fromScale);
self.TweenScale(new Vector2(ox, oy), duration).SetEase(ease).OnComplete(() => { FinishAnimation(self); });
}
public static void TweenScaleHide(this GObject self, float duration = 0.2f, Action callback = null,
float toScale = 0.8f, EaseType ease = EaseType.QuadIn, bool resetAfter = true, bool setInvisible = true)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
self.SetPivot(0.5f, 0.5f, false);
self.SetScale(1, 1);
var ox = self.scaleX;
var oy = self.scaleY;
self.TweenScale(new Vector2(toScale, toScale), duration).SetEase(ease).OnComplete(() =>
{
if (resetAfter) self.SetScale(ox, oy);
if (setInvisible) self.visible = false;
FinishAnimation(self);
});
}
public static void TweenPopShow(this GObject self, float duration = 0.2f, Action callback = null,
float fromScale = 0.8f, EaseType ease = EaseType.BackOut)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ox = self.scaleX;
var oy = self.scaleY;
self.visible = true;
self.SetScale(fromScale, fromScale);
self.alpha = 0f;
int remain = 2;
void Done()
{
if (--remain == 0) FinishAnimation(self);
}
self.TweenScale(new Vector2(ox, oy), duration).SetEase(ease).OnComplete(Done);
self.TweenFade(1f, duration * 0.9f).SetEase(EaseType.QuadOut).OnComplete(Done);
}
public static void TweenPopHide(this GObject self, float duration = 0.2f, Action callback = null,
float toScale = 0.8f, EaseType ease = EaseType.QuadIn, bool setInvisible = true)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ox = self.scaleX;
var oy = self.scaleY;
int remain = 2;
void Done()
{
if (--remain == 0)
{
self.SetScale(ox, oy);
if (setInvisible) self.visible = false;
FinishAnimation(self);
}
}
self.TweenScale(new Vector2(toScale, toScale), duration).SetEase(ease).OnComplete(Done);
self.TweenFade(0f, duration * 0.9f).SetEase(EaseType.QuadIn).OnComplete(Done);
}
public static void TweenSlideInLeft(this GObject self, float moveTime = 0.5f, float startFadeTimeRate = 0.42f
, float startAlpha = 0, float alphaTime = 0.1f
, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null)
{
TweenSlideIn(self, UISlideDirection.Left, moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset,
ease, callback);
}
public static void TweenSlideOutLeft(this GObject self, float moveTime = 0.3f, float startFadeTimeRate = 0
, float alphaTime = 0.08f,
float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true,
Action callback = null)
{
TweenSlideOut(self, UISlideDirection.Left, moveTime, startFadeTimeRate, alphaTime, extraOffset, ease,
resetAfter, setInvisible, callback);
}
public static void TweenSlideInRight(this GObject self, float moveTime = 0.5f, float startFadeTimeRate = 0.42f
, float startAlpha = 0, float alphaTime = 0.1f
, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null)
{
TweenSlideIn(self, UISlideDirection.Right, moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset,
ease, callback);
}
public static void TweenSlideOutRight(this GObject self, float moveTime = 0.3f, float startFadeTimeRate = 0
, float alphaTime = 0.08f,
float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true,
Action callback = null)
{
TweenSlideOut(self, UISlideDirection.Right, moveTime, startFadeTimeRate, alphaTime, extraOffset, ease,
resetAfter, setInvisible, callback);
}
public static void TweenSlideInTop(this GObject self, float moveTime = 0.35f, float startFadeTimeRate = 0.3f
, float startAlpha = 0, float alphaTime = 0.1f
, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null)
{
TweenSlideIn(self, UISlideDirection.Top, moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset,
ease, callback);
}
public static void TweenSlideOutTop(this GObject self, float moveTime = 0.3f, float startFadeTimeRate = 0
, float alphaTime = 0.1f,
float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true,
Action callback = null)
{
TweenSlideOut(self, UISlideDirection.Top, moveTime, startFadeTimeRate, alphaTime, extraOffset, ease,
resetAfter, setInvisible, callback);
}
public static void TweenSlideInBottom(this GObject self, float moveTime = 0.35f, float startFadeTimeRate = 0.3f
, float startAlpha = 0, float alphaTime = 0.1f
, float extraOffset = 0f, EaseType ease = EaseType.CubicOut,
Action callback = null)
{
TweenSlideIn(self, UISlideDirection.Bottom, moveTime, startFadeTimeRate, startAlpha, alphaTime, extraOffset,
ease, callback);
}
public static void TweenSlideOutBottom(this GObject self, float moveTime = 0.3f, float startFadeTimeRate = 0
, float alphaTime = 0.1f,
float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true,
Action callback = null)
{
TweenSlideOut(self, UISlideDirection.Bottom, moveTime, startFadeTimeRate, alphaTime, extraOffset, ease,
resetAfter, setInvisible, callback);
}
public static void TweenSlideIn(this GObject self, UISlideDirection direction, float moveTime = 0.35f,
float startFadeTimeRate = 0.1f
, float startAlpha = 0, float alphaTime = 0.2f
, float extraOffset = 0f, EaseType ease = EaseType.QuadOut,
Action callback = null)
{
if (self == null || moveTime <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ori = self.position;
float startX = ori.x;
float startY = ori.y;
switch (direction)
{
case UISlideDirection.Left: startX = startX + (-self.width / 2) - Math.Max(0f, extraOffset); break;
case UISlideDirection.Right: startX = startX + (self.width / 2) + Math.Max(0f, extraOffset); break;
case UISlideDirection.Top: startY = startY + (-self.height / 2) - Math.Max(0f, extraOffset); break;
case UISlideDirection.Bottom: startY = startY + (self.height / 2) + Math.Max(0f, extraOffset); break;
}
self.visible = true;
self.alpha = startAlpha;
self.position = new Vector3(startX, startY, ori.z);
float startFadeTime = moveTime * startFadeTimeRate;
int remain = 3;
void Done()
{
if (--remain == 0) FinishAnimation(self);
}
GTweener moveTweener = (direction == UISlideDirection.Left || direction == UISlideDirection.Right)
? self.TweenMoveX(ori.x, moveTime)
: self.TweenMoveY(ori.y, moveTime);
moveTweener.SetEase(ease).OnComplete(Done);
self.TweenFade(startAlpha, startFadeTime).OnComplete(() =>
{
Done();
self.TweenFade(1, alphaTime).SetEase(EaseType.QuadOut).OnComplete(Done);
});
}
public static void TweenSlideOut(this GObject self, UISlideDirection direction, float moveTime = 0.35f,
float startFadeTimeRate = 0.1f
, float alphaTime = 0.2f,
float extraOffset = 0f, EaseType ease = EaseType.QuadIn,
bool resetAfter = true, bool setInvisible = true,
Action callback = null)
{
if (self == null || moveTime <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ori = self.position;
float endX = ori.x;
float endY = ori.y;
switch (direction)
{
case UISlideDirection.Left: endX = endX + (-self.width / 2) - Math.Max(0f, extraOffset); break;
case UISlideDirection.Right: endX = endX + (self.width / 2) + Math.Max(0f, extraOffset); break;
case UISlideDirection.Top: endY = endX + (-self.height / 2) - Math.Max(0f, extraOffset); break;
case UISlideDirection.Bottom: endY = endX + (self.height / 2) + Math.Max(0f, extraOffset); break;
}
float startAlpha = self.alpha;
float startFadeTime = moveTime * startFadeTimeRate;
int remain = 3;
void Done()
{
if (--remain == 0)
{
if (resetAfter) self.position = ori;
if (setInvisible) self.visible = false;
FinishAnimation(self);
}
}
GTweener moveTweener = (direction == UISlideDirection.Left || direction == UISlideDirection.Right)
? self.TweenMoveX(endX, moveTime)
: self.TweenMoveY(endY, moveTime);
moveTweener.SetEase(ease).OnComplete(Done);
self.TweenFade(startAlpha, startFadeTime).OnComplete(() =>
{
Done();
self.TweenFade(0, alphaTime).SetEase(EaseType.QuadOut).OnComplete(Done);
});
}
public static void TweenBounceShow(this GObject self, float duration = 0.4f, Action callback = null,
float fromYOffset = -100f)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ori = self.position;
self.visible = true;
self.position = new Vector3(ori.x, ori.y + fromYOffset, ori.z);
self.TweenMoveY(ori.y, duration).SetEase(EaseType.BounceOut).OnComplete(() => { FinishAnimation(self); });
}
public static void TweenBounceHide(this GObject self, float duration = 0.25f, Action callback = null,
float toYOffset = 100f, bool resetAfter = true, bool setInvisible = true)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ori = self.position;
self.TweenMoveY(ori.y + toYOffset, duration).SetEase(EaseType.QuadIn).OnComplete(() =>
{
if (resetAfter) self.position = ori;
if (setInvisible) self.visible = false;
FinishAnimation(self);
});
}
public static void TweenRotateShow(this GObject self, float duration = 0.2f, Action callback = null,
float fromRotation = -90f, EaseType ease = EaseType.BackOut)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
float ori = self.rotation;
self.visible = true;
self.rotation = fromRotation;
self.TweenRotate(ori, duration).SetEase(ease).OnComplete(() => { FinishAnimation(self); });
}
public static void TweenRotateHide(this GObject self, float duration = 0.2f, Action callback = null,
float toRotation = -90f, EaseType ease = EaseType.QuadIn, bool resetAfter = true, bool setInvisible = true)
{
if (self == null || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
float ori = self.rotation;
self.TweenRotate(toRotation, duration).SetEase(ease).OnComplete(() =>
{
if (resetAfter) self.rotation = ori;
if (setInvisible) self.visible = false;
FinishAnimation(self);
});
}
public static void TweenShake(this GObject self, float duration = 0.4f, Action callback = null,
float amplitude = 12f, bool horizontal = true, int vibrato = 6)
{
if (self == null || vibrato <= 0 || amplitude <= 0f || duration <= 0f)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
var ori = self.position;
float single = duration / (vibrato * 2f);
var end = horizontal
? new Vector3(ori.x + amplitude, ori.y, ori.z)
: new Vector3(ori.x, ori.y + amplitude, ori.z);
self.TweenMove(end, single).SetEase(EaseType.Linear).SetRepeat(vibrato * 2, true).OnComplete(() =>
{
self.position = ori;
FinishAnimation(self);
});
}
public static void TweenShakeShow(this GObject self, float durationScale = 0.2f, float ScaleStart = 0.3f,
float ScaleEnd = 1f, int shake = 4,
float shakeRotation = 18f, float duration = 1, Action callback = null)
{
if (self == null)
{
callback?.Invoke();
return;
}
StartNewAnimation(self, callback);
int remain = 4;
void Done()
{
if (--remain == 0)
{
FinishAnimation(self);
}
}
self.scale = Vector2.one * ScaleStart;
self.rotation = -shakeRotation;
float scaleEndTime = 0.2f;
float rotaEndTime = 0.1f;
float allIns = durationScale + scaleEndTime + rotaEndTime;
duration = allIns > duration ? allIns : duration;
float rotaTime = (duration - durationScale - scaleEndTime - rotaEndTime) / shake;
self.TweenScale(Vector2.one * ScaleEnd * 1.1f, durationScale)
.OnComplete(() =>
{
FinishAnimation(self);
self.TweenRotate(shakeRotation, rotaTime).SetRepeat(shake, true)
.OnComplete(() =>
{
FinishAnimation(self);
self.TweenRotate(0, rotaEndTime).OnComplete(() =>
{
FinishAnimation(self);
self.TweenScale(Vector2.one * ScaleEnd, scaleEndTime).OnComplete(() =>
{
FinishAnimation(self);
});
});
});
});
}
#endregion
}
}