Exemplo n.º 1
0
    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);
        }
    }
Exemplo n.º 2
0
    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);
        }
    }