首页/ 第 8 章 · 输入系统/ 第 119 课
LESSON 119 · 输入系统

第三人称跟随相机

第三人称相机已完成。下一课学跳跃与重力模拟。

⏱ 约 16 分钟📊 难度:入门🗂 第 8 章 · 输入系统📍 第 119 / 300 课
课程进度
119 / 300

🎯本节学习目标

  • 实现跟随相机
  • 实现鼠标环绕
  • 实现碰撞避让与缩放

🚀课程导读

《马里奥》《原神》类视角:相机跟在角色后上方,鼠标可环绕、滚轮可拉近拉远。本课实现完整的第三人称相机。

基础环绕跟随相机

相机绕着角色转。

  1. 思路:相机 = 围绕目标旋转 + 保持距离 + 看向目标。
  2. 新建脚本 ThirdPersonCamera 挂到相机:
  3. public Transform target; // 目标(角色)
  4. public float distance = 5f; public float sensitivity = 3f; public float minY = 10f; public float maxY = 80f;
  5. private float yaw = 0f; private float pitch = 30f;
  6. void LateUpdate() {
  7. yaw += Input.GetAxis("Mouse X") * sensitivity;
  8. pitch -= Input.GetAxis("Mouse Y") * sensitivity;
  9. pitch = Mathf.Clamp(pitch, minY, maxY);
  10. Quaternion rot = Quaternion.Euler(pitch, yaw, 0);
  11. Vector3 pos = target.position - rot * Vector3.forward * distance;
  12. transform.position = pos;
  13. transform.LookAt(target);
  14. }
  15. 【LateUpdate】在角色移动完成后更新相机(第 71 课)。
  16. 【原理】用 yaw/pitch 拼出旋转,相机放在“目标后方 distance 米”,再看向目标。
  17. 播放:鼠标拖拽环绕角色、上下调整俯仰。
💡
第三人称相机公式:目标点 - 旋转 × 前方 × 距离 = 相机位置,再 LookAt 目标。

缩放与碰撞避让

让相机更聪明。

  1. 【滚轮缩放】distance -= Input.GetAxis("Mouse ScrollWheel") * 2f; distance = Mathf.Clamp(distance, 2f, 10f);
  2. 【平滑】用 Lerp 平滑距离与位置变化,避免生硬。
  3. 【碰撞避让】相机与目标之间若有墙,应把相机“拉近”到墙前:
  4. RaycastHit hit;
  5. if (Physics.Linecast(target.position, desiredPos, out hit)) {
  6. Vector3 offset = hit.normal * 0.3f; // 墙前偏移一点点
  7. desiredPos = hit.point + offset;
  8. }
  9. 【实现】先算期望位置 desiredPos,再用 Linecast 检测是否被遮挡,遮挡则用命中点。
  10. 【平滑过渡】transform.position = Vector3.Lerp(transform.position, desiredPos, 10f * Time.deltaTime);
  11. 【注意】碰撞避让能避免“相机穿墙看到黑屏”。
  12. 【进阶】相机插值延迟跟随、跟随目标点放头顶等。
完整第三人称相机 = 环绕旋转 + 滚轮缩放 + Linecast 防穿墙。照着写即可用。

常见错误与排查

错误:相机穿墙/黑屏?
原因:没做碰撞避让
解决:用 Linecast 检测遮挡并拉近相机位置。

动手练习

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

  • 实现基础环绕跟随相机
  • 加滚轮缩放与平滑
  • 加 Linecast 碰撞避让

本节小结

第三人称相机已完成。下一课学跳跃与重力模拟。

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

← 上一课第一人称视角控制(鼠标旋转)