只要明白上面类图中的结构,我认为就差不多搞懂了DoTween的大体实现方式了。首先在Unity中之所以可以使用例如:transform.DoMove(new vector3(1,1,1),2);这种的调用方式,是因为DoTween定义了大量与Transform、Rigibody、Material、Camera等相关的拓展函数,这些拓展函数就定义在了ShortcutExtensions类中。拓展函数真是个c#的伟大设计,由于它的存在,使用者可以像调用类的原生函数一样调用自定义函数,使用起来简洁、高效,还减少了入参的数量和相关的有效性判断,可谓是一举多得。在以后自己的项目中编写模块时也可使用此方法。
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类型为红色的线条,我们一看图标就可知它是一条先急后缓的曲线,非常直观。
更多推荐
DOTween源码解析
发布评论