Unity中添加Rigidbody后仅脚本旋转GameObject却自动移动的原因
问题原因与解决方案
为什么添加Rigidbody后物体会自动向前移动?
- 直接在
Update中修改transform.rotation会和Unity物理引擎产生冲突:Rigidbody组件会让物理系统接管物体的运动状态,手动修改Transform的旋转会被物理引擎识别为异常的位置/角度变化,进而产生意外的物理力,驱动物体移动。 - 未冻结刚体的旋转轴:如果Rigidbody没有勾选对应轴的Freeze Rotation,鼠标旋转带来的角度变化会被物理引擎误判为外力作用,导致物体出现不受控的位移。
解决办法
1. 改用Rigidbody的API控制旋转
不要直接修改transform.rotation,而是使用Rigidbody提供的MoveRotation方法,让物理引擎正确处理旋转逻辑,避免冲突。同时将旋转逻辑移到FixedUpdate(物理帧更新)中执行,保证和物理系统同步:
using UnityEngine; public class PlayerMover : MonoBehaviour { private Vector2 _mouseInput; private Vector2 _rotation; private Rigidbody _rb; private void Start() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; _rb = GetComponent<Rigidbody>(); // 冻结所有旋转轴,避免物理引擎干扰手动旋转 _rb.freezeRotation = true; } private void FixedUpdate() { CalculateRotation(); _rb.MoveRotation(Quaternion.Euler(_rotation.x, _rotation.y, 0)); } private void CalculateRotation() { _mouseInput.x = Input.GetAxisRaw("Mouse X"); _mouseInput.y = Input.GetAxisRaw("Mouse Y"); _rotation.y += _mouseInput.x; _rotation.x -= _mouseInput.y; // 限制上下旋转角度,防止角色过度翻转 _rotation.x = Mathf.Clamp(_rotation.x, -90f, 90f); } }
2. 正确配置Rigidbody参数
- 在Inspector面板中,找到Rigidbody组件,勾选Freeze Rotation的X、Y、Z轴(根据需求调整,比如只保留Y轴旋转的话就冻结X和Z),避免物理引擎处理手动旋转的轴。
- 如果不需要物体受重力影响,取消勾选Use Gravity选项,防止重力导致的意外位移。
内容的提问来源于stack exchange,提问作者user20324932
相关产品推荐
相关产品推荐

