diff options
author | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
commit | 6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch) | |
tree | b38119d2acf0a982cb67e381f146924b9bfc3b3f /Car.cs |
+init
Diffstat (limited to 'Car.cs')
-rw-r--r-- | Car.cs | 143 |
1 files changed, 143 insertions, 0 deletions
@@ -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); + } + } + } +} |