DOTween的Vector3Plugin

Vector3Plugin 是 DOTween 中专门负责 Vector3 类型(如 transform.positionlocalScale)插值计算的核心插件。它继承自 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 或像素风游戏中防止画面渲染出出现微小抖动或锯齿。

相关推荐
一梭键盘任平生12 小时前
Shader入门笔记2
unity
点心的游戏开发世界19 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
点心的游戏开发世界21 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
微三云生态系统架构师-彭丹2 天前
任务卷轴积分系统架构设计:从任务状态机到合规风控的完整实现
unity·系统架构·游戏引擎
XR技术研习社2 天前
从 PICO 文档看未来短期内的 Unity 版本选择
unity·游戏引擎·xr·vr
玖玥拾2 天前
Unity 热更新(一)
unity·游戏引擎
软件黑马王子2 天前
1.non-MonoBehaviour 单例模式泛型基类
unity·前端框架·c#
KhalilRuan3 天前
Unity性能优化
unity·性能优化·游戏引擎
ellis19703 天前
u3d IMGUI[二] 编辑器扩展
unity