You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:32:58