Unity中玩家身体Y轴旋转超359度时相机旋转出现跳变抖动的问题解决问询
解决相机旋转限制跳变的问题
问题根源
你遇到的跳变问题,核心原因是**Quaternion.eulerAngles.y的取值范围是0°到360°**——当玩家身体旋转超过359°时,这个值会突然回绕到0°左右。而你的相机yRotation是基于鼠标输入累加的连续值(可能从-∞到+∞),两者的坐标系不匹配,导致限制值limitL和limitR从284°/434°直接跳回-75°/75°,触发相机的突然 clamping。
解决方案
我们需要改用连续的角度值来跟踪玩家身体的Y轴旋转,而不是依赖四元数的欧拉角。这样就能彻底避免360°回绕带来的跳变。
修改后的代码
public class MouseLook : MonoBehaviour { public Transform CameraBox; public Transform lookAtPivot; public Transform lookAtObject; public Transform playerBody; public float sensitivity; public float bodyRotSpeed; float xRotation = 0f; float yRotation = 0f; public float limitL; public float limitR; // 添加变量跟踪连续的身体Y轴旋转角度(不会触发360°回绕) private float bodyYRotation = 0f; void Start() { Cursor.lockState = CursorLockMode.Locked; // 初始化连续角度为物体初始欧拉角 bodyYRotation = playerBody.rotation.eulerAngles.y; } void handleCamRotation() { float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime; xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -45, 35); yRotation += mouseX; // 用连续的bodyYRotation计算限制值,彻底避免回绕跳变 limitL = bodyYRotation - 75f; limitR = bodyYRotation + 75f; yRotation = Mathf.Clamp(yRotation, limitL, limitR); transform.rotation = Quaternion.Euler(xRotation, yRotation, 0f); } void handleBodyRotation() { // 获取目标Y轴旋转的欧拉角 float targetY = lookAtObject.rotation.eulerAngles.y; // 计算当前连续角度与目标角度的最短差值(自动处理360°回绕) float angleDiff = Mathf.DeltaAngle(bodyYRotation, targetY); // 平滑更新连续的身体Y轴旋转角度 bodyYRotation += angleDiff * bodyRotSpeed * Time.deltaTime; // 将连续角度应用到玩家身体 playerBody.rotation = Quaternion.Euler(playerBody.rotation.eulerAngles.x, bodyYRotation, playerBody.rotation.eulerAngles.z); } void Update() { handleCamRotation(); if (Input.GetKey(KeyCode.W)) { handleBodyRotation(); } } }
关键改动说明
- 新增
bodyYRotation变量:这个变量会连续累加旋转角度,不会像eulerAngles.y那样在360°时强制回绕到0°,完美匹配相机yRotation的连续特性。 - 用
Mathf.DeltaAngle计算旋转差:这个方法会自动处理360°回绕场景,比如目标角度是10°、当前连续角度是350°时,它会计算出差值为20°而非-340°,保证身体旋转始终走最短路径。 - 基于连续角度计算相机限制:现在
limitL和limitR是bodyYRotation ±75°,完全跟随身体的连续旋转,再也不会出现跳变。 - 直接用连续角度控制身体旋转:不再依赖
eulerAngles的回绕值,确保身体旋转状态和角度跟踪完全一致。
这样修改后,无论玩家身体旋转多少圈,相机的限制值都会平滑跟随,跳变现象就能彻底消除。
内容的提问来源于stack exchange,提问作者Mr. Dingleberry
相关产品推荐
相关产品推荐

