DOTween的Vector3Plugin

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 或像素风游戏中防止画面渲染出出现微小抖动或锯齿。

相关推荐
tealcwu9 小时前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
tealcwu1 天前
【Unity高级】Unity URP:构建同时支持 2D 与 3D 场景的项目完全指南
3d·unity·游戏引擎
淡海水1 天前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
小小数媒成员1 天前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
暴走约伯1 天前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
小小数媒成员1 天前
Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解
unity·游戏引擎
tealcwu1 天前
【Unity基础】Unity输入与Time.deltaTime的使用原则
unity·游戏引擎
郝学胜-神的一滴2 天前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
BuHuaX2 天前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
peter67683 天前
unity2d游戏开发经验总结
unity