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

相关推荐
萌萌的提莫队长16 小时前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
mxwin1 天前
Unity Shader 光线追踪原理与实战案例
unity·游戏引擎
地狱为王2 天前
Unity使用DPDFNet实现实时语音增强(降噪)
unity·语音增强·降噪·dpdfnet
平行云PVT2 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
夏炎黄2 天前
Terrain地形剪裁
unity
小贺儿开发2 天前
DeepSeek + Codex + MCP:Unity 游戏开发实测
科技·游戏·unity·ai·程序员·编程·deepseek
新的瑞拉公主2 天前
Cocos plist 粒子一键导入 Unity:Editor 工具实现与参数映射
unity·游戏开发·cocos2d-x·粒子系统·editor工具
淡海水2 天前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
xcLeigh3 天前
Unity基础:Instantiate实例化——在运行时动态创建游戏物体
游戏·unity·游戏引擎·教程·instantiate
流浪打工人4 天前
Unity3d TimeLine中audio track的使用
unity