using UnityEngine; public class Car : MonoBehaviour { public float forwardForceMultiplier = 1f; public float breakForce = 1f; public float glide = 1f; private float thrust; public AnimationCurve driftCurveGas; public AnimationCurve driftBreakForceCurve; public AnimationCurve driftVecloityForceCurve; public AnimationCurve driftTurnCurve; public AnimationCurve lowSpeedGripCurve; public AnimationCurve speedTurnCurve; public AnimationCurve useWheelToTurnCurve; private float driftAmount; private WobbleShake shake; public Rigidbody mainRig; public float turnTorque = 1f; public float downwardsForce; private GenericInputHandler input; private CollisionChecker[] checkers; private Collider[] wheelColliders; private float sinceGrounded; private Wheel[] wheels; private void Start() { checkers = GetComponentsInChildren(); wheels = GetComponentsInChildren(); input = GetComponent(); shake = base.transform.root.GetComponentInChildren(); Transform parent = GetComponentInChildren().transform.parent; wheelColliders = parent.GetComponentsInChildren(); } private void FixedUpdate() { float num = 1f; if (mainRig.transform.InverseTransformDirection(mainRig.velocity).z < 0f) { num = -1f; } float num2 = Mathf.Clamp(Vector3.Angle(mainRig.velocity, mainRig.transform.forward * num), 10f, 90f); float num3 = Mathf.Clamp(Vector3.Angle(mainRig.velocity, mainRig.transform.forward * num), 1f, 90f); float z = mainRig.transform.InverseTransformDirection(mainRig.velocity).z; thrust = Mathf.Clamp(input.inputDirection.z, -0.7f, 1f); float num4 = speedTurnCurve.Evaluate(z); float num5 = 1f; num5 = 0f; for (int i = 0; i < checkers.Length; i++) { if (checkers[i].sinceGrounded < 0.1f) { num5 += 1f / (float)checkers.Length; } } if (num5 == 0f) { sinceGrounded += Time.deltaTime; } else { if ((double)sinceGrounded > 0.5) { shake.AddShake(base.transform.forward * 0.5f * Mathf.Clamp(sinceGrounded, 0f, 5f), 0.9f); } sinceGrounded = 0f; } if (num5 > 0f) { mainRig.angularVelocity *= 0.98f; if (input.space) { driftAmount = Mathf.Lerp(driftAmount, 1f, Time.fixedDeltaTime * 2f); if (driftAmount > 0.7f) { mainRig.angularVelocity *= 0.98f; } } else { driftAmount = Mathf.Lerp(driftAmount, 0f, Time.fixedDeltaTime * 3f); } } float num6 = driftCurveGas.Evaluate(Mathf.Clamp(num3, driftAmount * 45f, 999f) / 10f); Collider[] array = wheelColliders; foreach (Collider collider in array) { collider.material.dynamicFriction = Mathf.Clamp(5f / mainRig.velocity.magnitude - 0.2f, 0f, 0.5f); } if (mainRig.velocity.magnitude > 10f) { shake.AddShakeWorld(Random.insideUnitSphere * (Mathf.Clamp(num3 / 10f - 1f, 0f, 40f) * mainRig.velocity.magnitude * 0.01f) * 0.5f, 0.8f); shake.AddShake(Vector3.up * (Mathf.Clamp(num3 / 10f - 1f, 0f, 90f) * mainRig.velocity.magnitude * -0.03f) * 0.1f, 0.8f); } Wheel[] array2 = wheels; foreach (Wheel wheel in array2) { if (wheel.isActive) { mainRig.AddForce(-mainRig.transform.up * mainRig.velocity.magnitude * downwardsForce * num5, ForceMode.Acceleration); mainRig.AddTorque(mainRig.transform.up * (1f + driftAmount * 0.5f) * input.inputDirection.x * driftTurnCurve.Evaluate(num3 / 90f) * num4 * turnTorque * num5, ForceMode.Acceleration); Vector3 normalized = Vector3.Lerp(mainRig.transform.forward, wheel.forward, useWheelToTurnCurve.Evaluate(mainRig.velocity.magnitude)).normalized; Vector3 vector = normalized * forwardForceMultiplier * num5 * (1f + Mathf.Clamp(Vector3.Angle(mainRig.transform.forward, mainRig.velocity), 0f, 20f) * 0.01f); if (thrust != 0f) { vector *= thrust; } Vector3 vector2 = Vector3.ProjectOnPlane(vector, mainRig.velocity); Vector3 force = vector - vector2; mainRig.AddForceAtPosition(vector2, wheel.transform.position, ForceMode.Acceleration); if (thrust != 0f) { mainRig.AddForceAtPosition(force, wheel.transform.position, ForceMode.Acceleration); } mainRig.AddForceAtPosition(-mainRig.velocity * forwardForceMultiplier * 0.02f * num5, wheel.transform.position, ForceMode.Acceleration); mainRig.AddForce(mainRig.velocity * breakForce * -1f * driftBreakForceCurve.Evaluate(num3 / 10f) * num5, ForceMode.Acceleration); mainRig.AddForce(-mainRig.transform.right * mainRig.transform.InverseTransformDirection(mainRig.velocity).x * 0.2f * num5 * glide * 10f / num6, ForceMode.Acceleration); } } } }