void FixedUpdate() { vehicleBounds = transform.GetTotalBounds(Space.World); CalculateOrientationFromSurroundings(); if (control) { if (Input.GetKey(KeyCode.W)) { gas = 1; } else if (Input.GetKey(KeyCode.S)) { gas = -1; } else { gas = 0; } if (Input.GetKey(KeyCode.D)) { steer = 1; } else if (Input.GetKey(KeyCode.A)) { steer = -1; } else { steer = 0; } } float currentForwardVelocity = Vector3.Dot(CarBody.velocity, forward); if (gas > float.Epsilon || gas < -float.Epsilon) { CarBody.AddForce(PhysicsHelpers.CalculateRequiredForceForSpeed(CarBody.mass, currentForwardVelocity, Mathf.Clamp(currentForwardVelocity + gas * acceleration, -maxSpeed, maxSpeed)) * forward, ForceMode.Force); } float handlingMultiplier = handlingCurve.Evaluate(Mathf.Abs(currentForwardVelocity) / maxSpeed); if (steer > float.Epsilon || steer < -float.Epsilon) { forward = Quaternion.AngleAxis(steer * maxTurnRate * handlingMultiplier * Mathf.Sign(currentForwardVelocity), up) * forward; } ApplyFloatation(); ApplyOrientator(); ApplyFriction(); }
private void ApplyFriction() { float currentHorVelocity = Vector3.Dot(CarBody.velocity, right); float velocityFrictionMultiplier = frictionCurve.Evaluate(currentHorVelocity / maxSpeed); float forceToStop = PhysicsHelpers.CalculateRequiredForceForSpeed(CarBody.mass, currentHorVelocity, 0); CarBody.AddForce(right * forceToStop * velocityFrictionMultiplier, ForceMode.Force); Vector3 correctionTorque = CarBody.CalculateRequiredTorqueForRotation(castedOrientation, Time.fixedDeltaTime, maxCorrectionTorque); float maxTorque = 20; float correctionTorqueAmount = Vector3.Dot(correctionTorque, up); float torqueFrictionMultiplier = frictionCurve.Evaluate(correctionTorqueAmount / maxTorque); CarBody.AddTorque(up * correctionTorqueAmount, ForceMode.Force); }
private void ApplyFloatation() { Vector3 expectedFloatingForce = CalculateFloatingForce(); CarBody.AddForce(expectedFloatingForce, ForceMode.Force); }