summaryrefslogtreecommitdiff
path: root/Car.cs
blob: 1cdab6c50fafac0cb6aaa21ffc9632553d6ee160 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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);
			}
		}
	}
}