public void Accelerate(float power) { var sign = reverse ? 1 : -1; if (FrontWheelKmPerH < maxSpeed) { frontWheel.AddTorque(power * FrontRearDriveRatio * sign); } if (RearWheelKmPerH < maxSpeed) { rearWheel.AddTorque(power * (1 - FrontRearDriveRatio) * sign); } }
private void doBrake(Wheel wheel, WheelJoint2D joint, float power) { var angularVelocity = wheel.AngularVelocity; wheelVelocitySignHistory[wheel].Add(Mathf.Sign(angularVelocity)); if (power * fullStopThreshold > Mathf.Abs(angularVelocity)) { wheel.AngularVelocity = 0; joint.useMotor = true; } else { var sign0 = wheelVelocitySignHistory[wheel][0]; var sign1 = wheelVelocitySignHistory[wheel][1]; var sign2 = wheelVelocitySignHistory[wheel][2]; if (sign0 * sign1 == -1 && sign1 * sign2 == -1) { wheel.AngularVelocity = 0; joint.useMotor = true; } else { var sign = Mathf.Sign(angularVelocity); wheel.AddTorque(power * -sign); joint.useMotor = false; } } if (power == 0) { wheelVelocitySignHistory[wheel].Clear(); wheelVelocitySignHistory[wheel].Add(0); wheelVelocitySignHistory[wheel].Add(0); } while (wheelVelocitySignHistory[wheel].Count > 3) { wheelVelocitySignHistory[wheel].RemoveAt(0); } }