summaryrefslogtreecommitdiff
path: root/Car.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Car.cs')
-rw-r--r--Car.cs143
1 files changed, 143 insertions, 0 deletions
diff --git a/Car.cs b/Car.cs
new file mode 100644
index 0000000..1cdab6c
--- /dev/null
+++ b/Car.cs
@@ -0,0 +1,143 @@
+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<CollisionChecker>();
+ wheels = GetComponentsInChildren<Wheel>();
+ input = GetComponent<GenericInputHandler>();
+ shake = base.transform.root.GetComponentInChildren<WobbleShake>();
+ Transform parent = GetComponentInChildren<Wheel>().transform.parent;
+ wheelColliders = parent.GetComponentsInChildren<Collider>();
+ }
+
+ 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);
+ }
+ }
+ }
+}