第 1 章 Animation Fundamentals:变化、时间与代码动画

覆盖帧、关键帧、八类动画,以及 deltaTime、方向移动、动画曲线、协程旋转、UV 动画和相机震动。

问题:为什么动画不是播放 Clip,而是属性随时间变化

先预测:同一个物体每帧向右移动 0.1 米,在 30 FPS 和 120 FPS 机器上,一秒后是否会到同一位置?不会。第一章先把动画定义为 change over time,再用帧与关键帧描述离散采样,最后通过脚本把时间、方向、曲线、协程、材质偏移和相机震动连成可测实验。

原书边界与官方小节

官方目录包含 Understanding animation、Frames、Key frames;Animation types 下的 Rigid body、Rigged or bone-based、Sprite、Physics-based、Morph、Video、Particle 与 Programmatic animation;以及 Animating through code、deltaTime、directional movement、animation curves、coroutine rotation、material and mapping animation、camera shaking。

  • Understanding animation;Frames;Key frames
  • Rigid body animation;Rigged or bone-based animation;Sprite animation;Physics-based animation
  • Morph animation;Video animation;Particle animation;Programmatic animation
  • Animating through code - making things move;Consistent animation - speed, time, and deltaTime
  • Movement in a direction;Coding tweens with animation curves;Rotating towards objects - animation with coroutines
  • Material and mapping animation;Camera shaking - animation effects

这些小节按官方目录唯一归属。本站重新组织解释、代码与实验,不逐字复制原文;现代补充放在迁移段,不能替换或重复计算原始单元。

属性、时间域和采样

动画至少包含起始状态、时间域、变化函数和输出属性。关键帧只保存少数时间点,求值器在中间时刻插值;程序动画则在每次更新中显式计算。deltaTime 把每帧位移转换为每秒速度,AnimationCurve 把线性进度重映射为节奏,协程组织跨帧过程。UV 动画改变纹理坐标而非几何,相机震动应围绕稳定基准叠加可衰减偏移。

五个核心术语与责任边界

必须落到本章的输入、时间、求值器与输出链,指出正常值、边界值和最早失败信号。

必须落到本章的输入、时间、求值器与输出链,指出正常值、边界值和最早失败信号。

必须落到本章的输入、时间、求值器与输出链,指出正常值、边界值和最早失败信号。

必须落到本章的输入、时间、求值器与输出链,指出正常值、边界值和最早失败信号。

必须落到本章的输入、时间、求值器与输出链,指出正常值、边界值和最早失败信号。

术语若不能落到具体资产、时间点、对象属性和观测值,就仍停留在记忆层。读者应能为每个术语写出生产者、变化规则、消费者、正常样本和失败样本。

关键对象与数据流

实验固定起点、终点与总时长,分别以 30、60、120 FPS 模拟更新,先证明未乘 deltaTime 的错误累积,再加入速度与曲线。随后把同一归一化时间用于 Transform、材质 offset 与相机局部偏移,比较不同输出属性。每条路径记录 t、曲线值、目标属性和最终误差,确认节奏变化没有破坏终点。

排查时从最早可控输入开始,逐段检查导入设置、中间状态和最终像素。最终画面正确但链路不符合预测,也不能立即签发,因为它可能依赖未记录的帧率、缓存、随机种子或编辑器状态。

把时间域写清楚,动画才可比较

同一属性可能由 Update、FixedUpdate、Animator、协程或 shader 时间驱动。Update 使用可变帧间隔,适合视觉和输入响应;FixedUpdate 使用固定物理步长,适合刚体力和物理状态;Animator 根据更新模式读取游戏时间或未缩放时间;协程只是调度结构,不自动保证速度;shader 时间在 GPU 求值,也不等同于脚本帧。实验必须记录实际时间来源,否则暂停、慢动作和掉帧时的差异会被误认为曲线错误。

AnimationCurve 的横轴和纵轴单位由调用者定义。若把横轴规范为零到一的进度,持续时间由外层控制,曲线可复用于位置、颜色和震动包络;若直接使用秒,曲线资产与具体时长绑定。求值前先计算经过时间、归一化进度和边界策略,结束时显式写入终点,避免浮点累积让对象永远差一点到达。循环、往返和钳制也要由清晰规则决定,不能依赖曲线外推默认值。

三类动画的责任边界

  • 确定性关键帧:给定 Clip 与时间应得到相同属性值,适合镜头和场景编排。
  • 程序动画:输入和状态由代码控制,必须证明 deltaTime、坐标空间和取消条件。
  • 物理动画:结果受积分、碰撞和固定步长影响,不能直接逐帧覆盖 Rigidbody Transform。
  • 材质动画:改变采样参数或 shader 状态,要区分共享材质与每对象属性。
  • 相机震动:短时偏移围绕稳定基准叠加,结束后恢复,不得逐帧漂移。

签发时以 30、60、120 FPS 和一次 200 毫秒卡顿重放同一路径,比较一秒后的位移、终点误差和曲线相位。再暂停 timeScale,分别验证使用缩放时间与未缩放时间的动画。结果一致不是指每帧轨迹完全相同,而是相同真实时间和规则下到达等价状态。

正常、边界与失败样本

每章至少保存一个正常样本、一个极端边界和一个故意破坏配置。正常样本证明主路径,边界样本说明适用范围,失败样本证明诊断方法真的能抓到错误。

从 Unity 5 到现代 Unity

原书的 Update、Coroutine、AnimationCurve 和材质偏移概念仍有效。现代项目可在固定模拟中使用 FixedUpdate,在呈现层使用 Update 或 LateUpdate;SRP 材质属性名和实例化规则需要按 Shader 验证。Cinemachine 噪声可替代手写震动实现,但仍应保留基准、幅度、频率与衰减这四个可测变量。

迁移记录采用五列:原书载体、稳定不变量、现代实现、不可等价处、目标平台证据。允许替换工具和 API,不允许抹去原始问题或倒写历史。

验收证据

验收保存三种帧率的终点误差表、三条曲线的关键时刻截图、UV 偏移日志和震动结束后的相机基准差。每种动画类型还要指出变化属性、时间来源、求值位置和最常见失败信号。

证据包同时记录场景路径、代码版本、资产 GUID、参数、复现步骤、预期和实际结果。交给另一位读者后不需要猜测隐藏状态即可重放,才算掌握而不只是看过。

小结

  • 动画的核心是属性随时间变化,不等同于某个 Unity 组件
  • 帧与关键帧把连续变化表示为可编辑采样
  • deltaTime 保证按秒定义的速度不依赖帧率
  • 曲线、材质和相机实验展示同一时间模型的不同输出

讨论

评论区加载中…