Vector3Plugin 是 DOTween 中专门负责 Vector3 类型(如 transform.position、localScale)插值计算的核心插件。它继承自 ABSTweenPlugin<Vector3, Vector3, VectorOptions>,负责把数学计算与具体的属性更新落地。
一、 关键方法生命周期职责
-
SetFrom(...):实现.From()API 的逻辑。将当前的真实属性值设为endValue,并根据isRelative参数重新算出倒播起点startValue。若开启了轴向限制或snapping(像素/整数对齐),也会在此时做首帧修正并立刻调用setter赋值。 -
SetRelativeEndValue(...):实现.SetRelative()API,把相对增量转化为绝对终点:\\text{endValue} = \\text{endValue} + \\text{startValue}。 -
SetChangeValue(...):计算总变化量 \\text{changeValue} = \\text{endValue} - \\text{startValue}。若指定了单轴限制(如AxisConstraint.X),非目标轴的变化量会被强制设为0f。 -
GetSpeedBasedDuration(...):支持.SetSpeedBased()模式。根据三维空间位移向量的模长计算时长
二、 核心帧更新函数 EvaluateAndApply 深度剖析
EvaluateAndApply 在动画播放的每一帧都会被 TweenerCore.ApplyTween 调用,其内部包含四个核心步骤:
1. 增量循环(Incremental Loop)偏移计算
if (t.loopType == LoopType.Incremental)
{
startValue += changeValue * (float)(t.isComplete ? (t.completedLoops - 1) : t.completedLoops);
}
当动画设置了 LoopType.Incremental(每次循环在前一次的基础上递增)时,插件会在原始 startValue 的基础上,按已完成的循环次数 completedLoops 动态叠加 changeValue。如果该动画嵌套在父级 Sequence 内且父级开启了增量循环,也会进行相应的多重递增计算。
2. 缓动曲线求值
float num = EaseManager.Evaluate(t.easeType, t.customEase, elapsed, duration, t.easeOvershootOrAmplitude, t.easePeriod);
根据已播放时间 elapsed 和总时长 duration,通过 EaseManager 计算出当前帧的插值系数 num(通常在 0 ~1之间,带有 Ease 曲线效果)。
3. 轴向隔离更新(Axis Constraint)
-
单轴锁定(
AxisConstraint.X / Y / Z)Vector3 vector2 = getter(); vector2.x = startValue.x + changeValue.x * num; // ... setter(vector2);对于
DOMoveX这类只修改单一轴向的动画,插件会先调用getter()读取物体当前的真实Vector3,只修改指定的轴(如 X 轴),保留 Y 和 Z 轴的当前值 。这保证了在使用DOMoveX的同时,其他代码或物理系统对 Y/Z 轴的修改不会被覆盖。 -
全轴更新(
default) :直接计算startValue + changeValue * num,无需调用getter(),性能最高。
4. 像素与网格对齐(Snapping)
if (options.snapping)
{
startValue.x = (float)Math.Round((double)startValue.x);
startValue.y = (float)Math.Round((double)startValue.y);
startValue.z = (float)Math.Round((double)startValue.z);
}
若开启了 .SetOptions(snapping: true),最后会对算出的坐标进行 Math.Round 四舍五入取整,常用于 UI 或像素风游戏中防止画面渲染出出现微小抖动或锯齿。