From 2683c04adcaff44f9504248d2c983cd86bd4b3ad Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 31 May 2021 09:43:09 +0800 Subject: *tween --- .../Scripts/Animation/Tween/TweenAnimation.cs | 75 ++++++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) (limited to 'Assets/UI_Extension/Scripts/Animation/Tween/TweenAnimation.cs') 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 modules; @@ -67,6 +69,15 @@ namespace TweenAnimation public List 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(); 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; + } + } + /// - /// 根据时间执行tween + /// 根据时间执行tween, time是从播放开始的真实时间 /// /// real time 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; -- cgit v1.1-26-g67d0