大名鼎鼎的DoTween就不用我多做介绍了,用过Unity的开发者应该都知道,就算没用过也听过。 搜索一下DoTween的用法,一找一堆,但是我很奇怪的却没看到有对DoTween的源码分析的帖子(需要下载的请出门右转,搜索DoTween,进入官网进行下载),这里我就抛砖引玉,简单的说说自己的理解。 先来看一下我画的DoTween的类图结构:
只要明白上面类图中的结构,我认为就差不多搞懂了DoTween的大体实现方式了。首先在Unity中之所以可以使用例如:transform.DoMove(new vector3(1,1,1),2);这种的调用方式,是因为DoTween定义了大量与Transform、Rigibody、Material、Camera等相关的拓展函数,这些拓展函数就定义在了ShortcutExtensions类中。拓展函数真是个c#的伟大设计,由于它的存在,使用者可以像调用类的原生函数一样调用自定义函数,使用起来简洁、高效,还减少了入参的数量和相关的有效性判断,可谓是一举多得。在以后自己的项目中编写模块时也可使用此方法。

ShortcutExtensions只是做一层中转,它调用的是DOTween的相关接口,以DoMove为例:


调用的是DOTween的To接口,第一个参数为Get回调,第二个参数是Set的回调,第三个为目的地。DOTween会为调用TweenManager接口,得到一个新的TweenerCore类对象并返回。

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源码解析