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

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

第一人称视角已实现。下一课学第三人称跟随相机。

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

🎯本节学习目标

  • 实现鼠标水平旋转
  • 实现鼠标垂直俯仰
  • 限制俯仰范围

🚀课程导读

第一人称游戏的“转头”:鼠标左右转身体、上下转相机。本课实现标准 FPS 视角。

水平与垂直旋转

两个轴各司其职。

  1. 新建脚本 MouseLook,挂到玩家/相机上:
  2. public float sensitivity = 2f;
  3. public float minPitch = -80f; public float maxPitch = 80f;
  4. private float pitch = 0f;
  5. void Update() {
  6. float mx = Input.GetAxis("Mouse X") * sensitivity;
  7. float my = Input.GetAxis("Mouse Y") * sensitivity;
  8. transform.Rotate(0, mx, 0); // 绕 Y 轴水平转身
  9. pitch -= my; // 上下累积(注意方向)
  10. pitch = Mathf.Clamp(pitch, minPitch, maxPitch); // 限制抬头低头
  11. transform.localEulerAngles = new Vector3(pitch, transform.localEulerAngles.y, 0); // 应用俯仰
  12. }
  13. 【说明】水平用 Rotate 累积;垂直用单独变量 pitch 累积并 Clamp 防止“翻跟头”。
  14. 【挂载】把脚本挂到相机所在的玩家对象(水平转身体 + 相机一起转)。
💡
垂直旋转必须单独累积并 Clamp,否则相机会“倒翻”——这是 FPS 的经典坑。

锁定鼠标与视角

让鼠标不出窗口。

  1. 【锁定光标】Cursor.lockState = CursorLockMode.Locked; 隐藏并锁定鼠标在屏幕中央(FPS 标准)。
  2. 【显示光标】Cursor.lockState = CursorLockMode.None;(打开菜单/暂停时恢复)。
  3. 【可见性】Cursor.visible = false/true。
  4. 【Esc 退出锁定】按 Esc 解锁并显示鼠标(再点画面重新锁定)。
  5. 【实战整合】
  6. void Update() {
  7. if (Input.GetKeyDown(KeyCode.Escape)) { Cursor.lockState = CursorLockMode.None; Cursor.visible = true; }
  8. if (Input.GetMouseButtonDown(0) && Cursor.lockState != CursorLockMode.Locked) { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; }
  9. ...旋转代码...
  10. }
  11. 【注意】锁定后 GetAxis("Mouse X") 依然有效。
  12. 【组合】第一人称移动(第 117 课相对相机)+ 鼠标视角 = 完整 FPS 控制。
  13. 【进阶】把相机单独放子对象只做俯仰,身体只做水平(更专业)。
FPS 控制 = 相机锁定 + 鼠标水平转身体 + 垂直俯仰。三件套齐活。

常见错误与排查

错误:相机乱转/视角穿地?
原因:垂直旋转没 Clamp 或旋转轴错乱
解决:垂直用独立 pitch 变量累积并 Clamp;确认只对 Y 用 Rotate。

动手练习

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

  • 实现完整的鼠标视角控制
  • 加入光标锁定与 Esc 解锁
  • (进阶)身体与相机分离,相机只做俯仰

本节小结

第一人称视角已实现。下一课学第三人称跟随相机。

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

← 上一课角色移动脚本(WASD + 相机)