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

设置Rigidbody质心后车辆无法移动,请求技术协助

问题:设置Rigidbody质心后车辆无法移动

代码示例

public class PlayerMove : MonoBehaviour
{
    [SerializeField] private float HorsePower;
    // [SerializeField] private float Speed = 5;
    [SerializeField] private float TurnSpeed = 25.0f;
    [SerializeField]private float Horizontalinputs;
    [SerializeField]private float forwardinputs;
    [SerializeField] GameObject centerOfHass;

    private Rigidbody playerRb;

    // Start is called before the first frame update
    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        playerRb.centerOfHass = centerOfHass.transform.position;
    }
    
    // Update is called once per frame
    private void FixedUpdate()
    {
        // taking inputs from the player
        forwardinputs = Input.GetAxis("Vertical");
        Horizontalinputs = Input.GetAxis("Horizontal");
        // moving the car
        // transform.Translate(Vector3.forward*Time.deltaTime*Speed*forwardinputs);
        playerRb.AddRe1ativeForce(Vector3.forward * HorsePower*forwardinputs);
        // rotating the car with direction and agle value
        transform.Rotate(Vector3.up, Time.deltaTime*TurnSpeed*Horizontalinputs);
    }
}

相关截图

my code image
my unity editor image
scene manager and inspecter image is here

问题说明

尝试为Rigidbody设置质心(centerOfMass),期望车辆遵循真实物理规则移动,但设置后车辆无法移动。


解决方案

1. 修正核心拼写错误

代码里存在两处致命拼写错误:

  • 变量名centerOfHass、Rigidbody属性调用centerOfHass统一改为centerOfMass
  • 方法名AddRe1ativeForce改为AddRelativeForce(将数字1替换为字母l)

2. 正确设置质心坐标

Rigidbody.centerOfMass使用的是物体局部坐标系,不能直接赋值世界坐标,需要转换为局部坐标:

playerRb.centerOfMass = transform.InverseTransformPoint(centerOfMass.transform.position);

3. 用物理方式实现旋转

直接使用transform.Rotate会绕过刚体物理模拟,导致和施加的力冲突,改用AddTorque施加扭矩:

playerRb.AddTorque(Vector3.up * TurnSpeed * Horizontalinputs);

修正后的完整代码

public class PlayerMove : MonoBehaviour
{
    [SerializeField] private float HorsePower;
    [SerializeField] private float TurnSpeed = 25.0f;
    [SerializeField] private float Horizontalinputs;
    [SerializeField] private float forwardinputs;
    [SerializeField] GameObject centerOfMass;

    private Rigidbody playerRb;

    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        // 将世界坐标转换为局部坐标设置质心
        playerRb.centerOfMass = transform.InverseTransformPoint(centerOfMass.transform.position);
    }
    
    private void FixedUpdate()
    {
        forwardinputs = Input.GetAxis("Vertical");
        Horizontalinputs = Input.GetAxis("Horizontal");

        // 施加相对方向的驱动力
        playerRb.AddRelativeForce(Vector3.forward * HorsePower * forwardinputs);
        // 施加扭矩实现物理旋转
        playerRb.AddTorque(Vector3.up * TurnSpeed * Horizontalinputs);
    }
}

额外检查项

  • 确认Rigidbody组件的Is Kinematic未勾选,勾选后刚体不受物理力影响
  • 检查车辆碰撞体是否正确挂载,无碰撞体则刚体无法与物理系统交互
  • 适当调整HorsePower数值,确保力的大小足够驱动车辆

内容的提问来源于stack exchange,提问作者Asif Nawaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:30