首页/ 第 13 章 · 2D 游戏开发/ 第 216 课
LESSON 216 · 2D 游戏开发

2D 摄像机跟随

相机跟随完成。下一课学 Tilemap 瓦片地图。

⏱ 约 13 分钟📊 难度:入门🗂 第 13 章 · 2D 游戏开发📍 第 216 / 300 课
课程进度
216 / 300

🎯本节学习目标

  • 实现平滑跟随
  • 实现边界限制
  • 实现预判

🚀课程导读

相机死死盯住角色会“抖”,专业做法是平滑跟随+边界限制。本课实现。

平滑跟随

镜头“追”而不是“粘”。

  1. 【基础跟随】每帧把相机移到角色位置:
  2. Camera.main.transform.position = new Vector3(target.position.x, target.position.y, -10f);
  3. (2D 相机 Z 保持 -10)。
  4. 【平滑】用 SmoothDamp 让相机“追”得自然:
  5. public Transform target; public float smoothTime = 0.2f;
  6. private Vector3 velocity;
  7. void LateUpdate() {
  8. Vector3 desired = new Vector3(target.position.x, target.position.y, -10f);
  9. transform.position = Vector3.SmoothDamp(transform.position, desired, ref velocity, smoothTime);
  10. }
  11. 【LateUpdate】在角色移动后更新相机,避免抖动。
  12. 【说明】SmoothDamp 自动处理平滑速度,smoothTime 越大越“慢”。
  13. 【竖直跟随】2D 平台常只水平跟随、竖直有限制(下面)。
  14. 【注意】相机脚本放相机对象上,target 拖角色。
  15. 【测试】角色移动时镜头平滑跟随不抖。
  16. 【完成】镜头“专业”了!
💡
平滑跟随 = LateUpdate + SmoothDamp。相机“追”角色的标准姿势。

边界限制与预判

镜头不出“地图”。

  1. 【边界】2D 关卡有边界,相机不能跟出地图:
  2. public float minX, maxX, minY, maxY;
  3. void LateUpdate() {
  4. Vector3 p = transform.position;
  5. p.x = Mathf.Clamp(p.x, minX, maxX);
  6. p.y = Mathf.Clamp(p.y, minY, maxY);
  7. transform.position = p;
  8. }
  9. 【边界值】在地图设计时定好(相机半视野 + 地图边界)。
  10. 【Lookahead 预判】相机朝角色移动方向稍微“提前”(看到前方):
  11. float ahead = Mathf.Sign(rb.velocity.x) * 2f;
  12. desired.x = target.position.x + ahead;
  13. 【竖直跟随限制】平台游戏常只在角色高于某高度时相跟随上:
  14. if (target.position.y > followThreshold) desired.y = target.position.y;
  15. 【分屏注意】多玩家时相机要容纳所有人(进阶)。
  16. 【测试】跑到地图边缘,相机被边界挡住。
  17. 【注意】边界值需要和相机 Size 配合(半高=Size、半宽=Size×宽高比)。
  18. 【完成】镜头“稳、准、不越界”。
  19. 【进阶】Lerp 版本:Vector3.Lerp(pos, target, 0.1f)。
镜头三件套:SmoothDamp 平滑 + Clamp 边界 + Lookahead 预判。可做所有 2D 相机。

常见错误与排查

错误:相机抖动?
原因:Update 里跟随或没平滑
解决:用 LateUpdate + SmoothDamp;角色插值 Interpolate 开启(第 206 课)。

动手练习

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

  • 实现平滑跟随相机
  • 限制相机在地图内
  • 加水平预判看前方

本节小结

相机跟随完成。下一课学 Tilemap 瓦片地图。

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

← 上一课2D 子弹与弹幕