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方法