Unity第一人称控制器相机灵敏度乘法失效问题
问题分析与修复方案
核心问题
- 旋转逻辑冲突:你先通过
transform.Rotate(xRot)修改了玩家物体的Y轴旋转,紧接着又用transform.localRotation = Quaternion.Euler(...)把Y轴旋转重置为之前的数值,等于完全抵消了X轴鼠标输入的旋转效果,这就是灵敏度cs对X轴无效的根本原因。 - Clamp未生效:
Mathf.Clamp(yRot, -90, 90)只是计算了限制后的值,但没有赋值回yRot,导致上下旋转没有被限制,会出现过度翻转的问题。 - 相机变量未利用:你声明了
public GameObject Camera但没使用,第一人称视角的上下旋转应该作用在相机上,而非玩家自身。
修复后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovementScript : MonoBehaviour { public GameObject Camera; public float cs = 200f; // 建议降低数值,1000会导致视角转动过快 private float yRot = 0f; void Start() { Cursor.lockState = CursorLockMode.Locked; transform.rotation = Quaternion.identity; } void Update() { updatePlrRotation(); } void updatePlrRotation() { // 先乘灵敏度再乘deltaTime,逻辑更清晰(顺序不影响结果,但可读性更好) float msX = Input.GetAxis("Mouse X") * cs * Time.deltaTime; float msY = Input.GetAxis("Mouse Y") * cs * Time.deltaTime; // 左右旋转:作用在玩家自身的Y轴 transform.Rotate(0, msX, 0); // 上下旋转:作用在相机的X轴,并且限制旋转范围 yRot -= msY; yRot = Mathf.Clamp(yRot, -90f, 90f); // 必须将Clamp结果赋值回yRot Camera.transform.localRotation = Quaternion.Euler(yRot, 0, 0); } }
关键修改说明
- 分离了玩家(左右旋转)和相机(上下旋转)的逻辑,避免旋转覆盖冲突。
- 修复了
Mathf.Clamp的赋值问题,确保上下旋转被限制在-90到90度之间,防止视角翻转。 - 调整了灵敏度的乘法顺序,让逻辑更直观,同时降低了默认灵敏度数值。
- 利用了声明的
Camera变量,将上下旋转正确作用在相机上,符合第一人称视角的常规逻辑。
内容的提问来源于stack exchange,提问作者user16840210
相关产品推荐
相关产品推荐

