Animation是Unity的舊的動畫系統,先說目的,其使用是為了在UI中播放動效,并且在動效播放結束后接自定義事件而設計的
設計的關鍵點在于,這個腳本不是通過Animation直接播放動畫片段,而是通過修改AnimationState的normalizedTime,并且調用Animation.Sample方法來直接應用動畫狀態到具體時間點,然后再通過時間判斷是否播放結束,如果播放結束,那么調用onComplete回調
- 具體分析
在決定播放動畫時,先調用Stop方法,停止所有動畫,然后重置_progressTime,再調用Play方法,讓動畫從頭開始播放,這里的Play和Stop的區別在于,Play相當于將動畫片段的normalizedTime變為0,然后調用Sample方法,即立刻將動畫片段重置到初始狀態,而Stop則是在此時停止動畫片段,并不會重置到初始狀態
,然后初始化_lastFrameTime,isPlaying狀態為true
先判斷是否在播放狀態,然后獲取當前播放的動畫片段,再獲取_currentTime,這里_lastFrameTime和_currentTime全部是使用的Time.unscaledTime,因為這個是不受時間縮放影響的時間,即獲取的是游戲世界中真實的時間,然后計算兩幀之間的差值,即幀之間的時間間隔,通過這個時間間隔,乘動畫片段的播放速度,累加得到動畫的播放進度_progressTime。
然后判斷是否設置為Loop模式,如果是,就通過取模操作計算normalizedTime,否則直接計算已經播放的百分比,然后通過Sample直接應用對應時間點的動畫狀態。
最后,判斷進度是否達到或超過總長度,如果是的話,且不是Loop模式,則調用onComplete回調,同時將isPlaying置為false。
通過這種設計,能夠在具體的時間點插入回調,在Update中自定義更新動畫片段的狀態,其核心就是調整動畫的normalizedTime以及應用Sample方法。