DOTween源码解析
ShortcutExtensions只是做一层中转,它调用的是DOTween的相关接口,以DoMove为例:
DOTween会在Unity中创建一个名为[DOTween]的对象,此对象会挂载一个DOTweenComponent的脚本,该脚本利用Unity MonoBehaviour的Update、LateUpdate、FixUpdate函数来对TweenManager进行驱动。TweenManager会取出数据集中所有的有效的TweenerCore进行一些逻辑判断并调用Tween.DoGoto函数并最终调用TweenerCore.ApplyTween 进行计算。
TweenerCore<T1,T2,TPlugOptions>这个模板类其实很简单
主要就是上图中的getter-用来获取动画的初始量,setter-用来得到计算结果后设置当前量,然后通过T1,T2,TPlugOptions的不同,定义适用于各种业务的功能类,如类图中用于计算位置变化的Vector3Plugin : ABSTweenPlugin<Vector3,Vector3,VectorOptions>类和用于计算颜色变化的ColorPlugin : ABSTweenPlugin<Color, Color, ColorOptions>类,不同的业务类在其EvaluateAndApply函数中各自进行计算并设置。
说到这还剩一个问题,DOTween中的动画表现有几十种模式,比如默认的模式Ease.OutQuad,就是一个先快后慢的一个表现,这个是怎么做的呢?观看代码后发现是这样的:业务类的EvaluateAndApply接口通过将动画类型、当前花费时间、总时间等参数送入EaseManager.Evaluate接口,得到一个计算过后的(0~1)比例,然后根据此比例:当前值 = 开始值 + 当前比例 * 总变化值。最后将当前值通过回调函数设置。
不过计算比例的EaseManager.Evaluate函数咋一看上去很唬人,因为它长这样:
虽然大概明白这就是一些曲线的表达公式,但是还是很难有一个直观清晰地认识,这边我安利一个工具:ZGrapher。这款软件可以自行输入数学公式,然后在坐标轴上给予呈现,下面是我根据Evaluate中的部分常用计算公式得到的图表,公式后面的括弧为对应的枚举类型:
上图中OutQuad类型为红色的线条,我们一看图标就可知它是一条先急后缓的曲线,非常直观。