Unity Wheel Collider车辆行驶过慢问题技术求助
Unity Wheel Collider车辆模拟速度过低且打滑问题
我正在使用Unity的Wheel Collider进行车辆模拟,尽管已设置符合现实的质量、阻力和扭矩数值,但车辆行驶速度远低于预期,且轮胎未出现打滑现象。
尝试过移除阻力后车辆仍行驶缓慢;增大motorTorque则引发轮胎打滑,调整摩擦参数提升滑移值和刚度后,打滑有所缓解但未彻底解决。期望通过参数调校实现车辆真实速度行驶且无过度打滑的平衡状态。
相关素材:
- 问题演示视频
- 车身刚体参数截图
- Motor组件参数截图
- Wheel Collider参数截图
代码实现
Tesla.cs
// Tesla.cs public class Tesla : MonoBehaviour { [SerializeField] private new Rigidbody rigidbody; [SerializeField] private Servomotor steerServomotor; [SerializeField] private Motor powerMotor; private bool isForwardGear = true; public float SpeedKmph => rigidbody.velocity.magnitude * 3.6f; public float MotorTorque => powerMotor.MotorTorque; public float BrakeTorque => powerMotor.BrakeTorque; public float SteerAngle => steerServomotor.SteerAngle; public void Accelerate(float amount) { powerMotor.MotorTorque = amount; } public void Brake(float amount) { powerMotor.BrakeTorque = amount; } public void Steer(float angle) { steerServomotor.SteerAngle = angle; } private void FixedUpdate() { isForwardGear = true switch { _ when Input.GetKey(KeyCode.E) => true, _ when Input.GetKey(KeyCode.Q) => false, _ => isForwardGear }; var accelerateAmount = Input.GetKey(KeyCode.W) switch { true when isForwardGear => 1f, true when !isForwardGear => -1f, _ => 0f }; var steerAmount = true switch { _ when Input.GetKey(KeyCode.A) => -1f, _ when Input.GetKey(KeyCode.D) => 1f, _ => 0f }; Accelerate(accelerateAmount); Brake(Input.GetKey(KeyCode.S)? 1f : 0f); Steer(steerAmount); } }
Motor.cs
// Motor.cs public class Motor : MonoBehaviour { [SerializeField] private WheelCollider[] wheels; [SerializeField] private float torqueMultiplier; private float motorTorque; private float brakeTorque; public float MotorTorque { get => motorTorque; set { motorTorque = value * torqueMultiplier; var wheelMotorTorque = motorTorque / wheels.Length; foreach (var wheel in wheels) { wheel.motorTorque = wheelMotorTorque; } } } public float BrakeTorque { get => brakeTorque; set { brakeTorque = value * torqueMultiplier; var wheelBrakeTorque = brakeTorque / wheels.Length; foreach (var wheel in wheels) { wheel.brakeTorque = wheelBrakeTorque; } } } private void Awake() { foreach (var wheel in wheels) { wheel.ConfigureVehicleSubsteps(5f, 12, 15); } } private void FixedUpdate() { var circumFerence = 2f * Mathf.PI * wheels[0].radius * wheels[0].transform.lossyScale.y; var speedOnKmh = circumFerence * wheels[0].rpm * 60f / 1000f; Debug.Log($"Wheel 0 Speed: {speedOnKmh} km/h"); } }
Servomotor.cs
// Servomotor.cs public class Servomotor : MonoBehaviour { [SerializeField] private WheelCollider[] wheels; [SerializeField] private float steerAngleMultiplier; private float steerAngle; public float SteerAngle { get => steerAngle * steerAngleMultiplier; set { steerAngle = value; foreach (var wheel in wheels) { wheel.steerAngle = steerAngle * steerAngleMultiplier; } } } }
内容的提问来源于stack exchange,提问作者Tempus
相关产品推荐
相关产品推荐

