首页/ 第 5 章 · C# 编程基础/ 第 72 课
LESSON 72 · C# 编程基础

Update 与 FixedUpdate 的区别

Update 与 FixedUpdate 已掌握。下一课系统学习调试神器 Debug.Log。

⏱ 约 14 分钟📊 难度:入门🗂 第 5 章 · C# 编程基础📍 第 72 / 300 课
课程进度
72 / 300

🎯本节学习目标

  • 理解两者调用频率差异
  • 知道物理放 FixedUpdate
  • 理解时间步长概念

🚀课程导读

为什么物体移动的代码放 Update,而物理(力、碰撞)放 FixedUpdate?本课讲透两者背后的原理。

Update:每帧一次

跟“帧”走,帧率波动。

  1. Update 每一帧调用一次。
  2. 调用频率 = 帧率(FPS):60 FPS 时每秒 60 次,30 FPS 时每秒 30 次。
  3. 所以 Update 的执行次数“不固定”——取决于电脑性能。
  4. 适合:几乎所有的“非物理”游戏逻辑(输入响应、UI、动画、移动计算)。
  5. 由于频率不固定,Update 里做移动时必须乘以 Time.deltaTime(第 74 课),否则速度随帧率变化。
  6. Update 里不适合直接施加物理力(会受帧率影响)。
💡
Update 的频率 = 看设备脸色;FixedUpdate 的频率 = 恒定。

FixedUpdate:固定时间步长

跟“时间”走,恒定节奏。

  1. FixedUpdate 以【固定时间间隔】调用,默认每 0.02 秒一次(每秒 50 次)。
  2. 这个间隔由 Project Settings→Time→Fixed Timestep 控制,与帧率无关。
  3. 即使游戏掉帧,FixedUpdate 依然按固定节奏推进。
  4. 【物理系统】刚体(Rigidbody)的运动、力、碰撞检测都在 FixedUpdate 阶段计算。
  5. 因此:对刚体施加力、改变速度应放在 FixedUpdate 里(或刚体相关代码),保证物理稳定。
  6. 【注意】FixedUpdate 可能一帧内调用多次(掉帧时补算),也可能 0 次。
  7. Debug.Log 在 FixedUpdate 里会“一坨一坨”输出,属正常。
  8. 【小结】移动物体(不涉及刚体力)用 Update;物理力与刚体操作用 FixedUpdate。
⚠️
在 FixedUpdate 里操作普通 Transform 移动也应乘 Time.fixedDeltaTime(第 74 课会统一讲时间增量)。

实战验证

观察调用次数。

  1. 新建脚本 TimeDemo,挂到空对象。
  2. 声明两个计数变量:int u=0, f=0;
  3. Update 里 u++;FixedUpdate 里 f++。
  4. 每隔一秒打印一次(用 Time.time 判断):if (Time.time > last + 1f) { Debug.Log($"Update:{u} FixedUpdate:{f}"); last = Time.time; u = 0; f = 0; }
  5. 播放观察:一秒钟里 FixedUpdate 约 50 次,Update 次数取决于你的帧率。
  6. 在 Project Settings→Time 里把 Fixed Timestep 改成 0.05,再观察 FixedUpdate 次数减半。
  7. 体会两者的节奏差异。
💡
改回默认 0.02,避免影响后续物理实验。

常见错误与排查

错误:物体在 Update 里受力后表现不稳定?
原因:物理计算应放 FixedUpdate
解决:把 AddForce 等刚体操作移到 FixedUpdate。

动手练习

课后小任务(做出来才算真的学会)

  • 用计数器对比每秒 Update 与 FixedUpdate 次数
  • 把 Fixed Timestep 改为 0.05 观察变化
  • 总结两者的适用场景

本节小结

Update 与 FixedUpdate 已掌握。下一课系统学习调试神器 Debug.Log。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课Unity 脚本生命周期(Awake/Start/Update)