设置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); } }
相关截图



问题说明
尝试为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
相关产品推荐
相关产品推荐

