diff options
author | chai <chaifix@163.com> | 2021-05-31 09:43:09 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-05-31 09:43:09 +0800 |
commit | 2683c04adcaff44f9504248d2c983cd86bd4b3ad (patch) | |
tree | 1ab3e0ac80b3ace9a8cb1a1f897dbb73d2612d52 /Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs | |
parent | 293def05f43c55fce6e90d6b1907c9d9fc63facc (diff) |
*tween
Diffstat (limited to 'Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs')
-rw-r--r-- | Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs b/Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs index 6441552..79f31c6 100644 --- a/Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs +++ b/Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs @@ -18,6 +18,8 @@ namespace TweenAnimation [NonSerialized]
public bool unfold = false;
#endif
+ [NonSerialized]
+ public bool trigged = false;
public TweenEvent()
{
name = "New Event";
@@ -42,7 +44,7 @@ namespace TweenAnimation PingPong,
}
- public string description = "No Description";
+ public new string name = "New Animation";
[SerializeReference]
public List<TweenModule> modules;
@@ -67,6 +69,15 @@ namespace TweenAnimation public List<TweenEvent> eventList;
+ // 默认的事件回调函数
+ public UnityEvent onStart;
+ public UnityEvent onTurnStart;
+ public UnityEvent onTurnEnd;
+ public UnityEvent onEnd;
+
+ // 上次更新时的时间(一个turn内的)
+ private float m_LastPlaybackTurnTime;
+
public TweenAnimation()
{
this.playbackStyle = PlaybackStyle.Loop;
@@ -74,6 +85,7 @@ namespace TweenAnimation this.duration = 1;
this.modules = new List<TweenModule>();
this.triggerOnce = false;
+ m_LastPlaybackTurnTime = -0.001f;
}
public void AddModule(TweenModule module)
@@ -105,8 +117,25 @@ namespace TweenAnimation eventList.Remove(e);
}
+ public void BeforePlay()
+ {
+ m_LastPlaybackTurnTime = -0.001f;
+ ResetEventTriggerFlag();
+ }
+
+ private void ResetEventTriggerFlag()
+ {
+ for(int i = 0; i < eventList.Count; ++i)
+ {
+ var e = eventList[i];
+ if (e == null)
+ continue;
+ e.trigged = false;
+ }
+ }
+
/// <summary>
- /// 根据时间执行tween
+ /// 根据时间执行tween, time是从播放开始的真实时间
/// </summary>
/// <param name="time">real time</param>
public void Process(float time)
@@ -114,9 +143,44 @@ namespace TweenAnimation if (modules == null)
return;
- time = ApplyLimit(time);
- float logicTime = HandleTime(time);
+ float limitTime = ApplyLimit(time); // 转换为playback limit后的逻辑时间
+ float logicTime = HandleTime(limitTime); // 转换为1个turn内的逻辑时间
+ // 处理事件
+ if(triggerEvents)
+ {
+ if (limitTime >= 0 && m_LastPlaybackTurnTime < 0)
+ onStart.Invoke();
+ bool isPingpong = playbackStyle == PlaybackStyle.PingPong;
+ for (int i = 0; i < eventList.Count; ++i)
+ {
+ var e = eventList[i];
+ if (e == null)
+ continue;
+ if (triggerOnce && e.trigged)
+ continue;
+ float t = e.time;
+ bool bTrigger = false;
+ bool isOdd = (((int)(limitTime / duration)) & 1) == 1;
+ if (isPingpong && isOdd && (eventTriggeredDirection & EventTriggeredDirection.Backward) == 0)
+ continue;
+ if (isPingpong && !isOdd && (eventTriggeredDirection & EventTriggeredDirection.Forward) == 0)
+ continue;
+ if (isPingpong && isOdd)
+ bTrigger = logicTime <= t && m_LastPlaybackTurnTime > t;
+ else
+ bTrigger = logicTime >= t && m_LastPlaybackTurnTime < t;
+ if(bTrigger && e.eventHandler != null)
+ {
+ e.eventHandler.Invoke();
+ if (triggerOnce)
+ e.trigged = true;
+ }
+ }
+ m_LastPlaybackTurnTime = logicTime;
+ }
+
+ // 更新动画
for (int i = 0; i < modules.Count; i ++)
{
TweenModule module = modules[i];
@@ -166,12 +230,13 @@ namespace TweenAnimation return logicTime;
}
+ // 返回真实时间对应的逻辑时间
public float ApplyLimit(float time)
{
if (playbackLimit <= 0)
return time;
if (playbackStyle == PlaybackStyle.Loop)
- time = Mathf.Clamp(time, 0, playbackLimit * duration);
+ time = Mathf.Clamp(time, 0, playbackLimit * duration - 0.001f); // 0.001是为了防止HandleTime的mod等于0
else if(playbackStyle == PlaybackStyle.PingPong)
time = Mathf.Clamp(time, 0, playbackLimit * duration);
return time;
|