Unity中碰撞触发相机左右抖动问题求助
解决Unity相机碰撞墙体时的左右抖动问题
当玩家角色与墙体、地形等物体碰撞时相机出现左右抖动,核心原因是鼠标直接驱动玩家刚体旋转与物理引擎碰撞矫正产生了冲突——碰撞时物理引擎会修正玩家的位置/旋转,而你的脚本在LateUpdate里直接给_playerBody设置旋转,两者的帧更新时机不一致,导致旋转状态反复拉扯。
以下是针对性的解决方案:
1. 分离旋转指令与玩家物理体
用一个无物理属性的虚拟对象接收鼠标旋转输入,玩家刚体再平滑跟进这个虚拟对象的旋转,避免直接操作刚体旋转引发冲突。
修改后的代码:
using UnityEngine; public class CameraRotation : MonoBehaviour { [Range(100, 250)] public float _sensitivity; [SerializeField] private float _xRotation; [SerializeField] private float _yRotation; [SerializeField] private Transform _playerBody; [SerializeField] private Transform _dummyRotator; // 新增空对象作为旋转目标 [SerializeField] private float _rotationSmoothTime = 0.1f; private Vector3 _rotationVelocity; private void Awake() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; _dummyRotator.rotation = _playerBody.rotation; // 初始化同步旋转 } private void LateUpdate() { // 相机旋转逻辑保持不变 float mouseX = Input.GetAxis("Mouse X") * _sensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * _sensitivity * Time.deltaTime; _xRotation -= mouseY; _yRotation -= mouseX; _xRotation = Mathf.Clamp(_xRotation, -35, 35); transform.rotation = Quaternion.Euler(_xRotation, -_yRotation, 0); _dummyRotator.rotation = Quaternion.Euler(0f, -_yRotation, 0f); // 让虚拟对象接收旋转指令 } private void FixedUpdate() { // 在物理帧内平滑更新玩家体旋转,避免与碰撞反馈冲突 Quaternion targetRotation = _dummyRotator.rotation; _playerBody.rotation = Quaternion.SmoothDamp(_playerBody.rotation, targetRotation, ref _rotationVelocity, _rotationSmoothTime); } }
2. 优化玩家刚体设置
- 选中玩家的Rigidbody组件,在Constraints里勾选Freeze Rotation X和Freeze Rotation Z,防止碰撞时玩家自身产生不必要的旋转。
- 调整Rigidbody的Mass(质量)和Drag(阻力)参数,让玩家物理运动更稳定,减少碰撞后的弹跳或位移抖动。
3. 调整旋转更新时机
原脚本在LateUpdate里直接设置玩家体旋转,而物理更新在FixedUpdate执行,两者帧频不一致会导致状态冲突。将玩家体的旋转逻辑移到FixedUpdate(如上面代码所示),确保旋转更新与物理帧同步。
内容的提问来源于stack exchange,提问作者Injir
相关产品推荐
相关产品推荐

