using UnityEngine; public class CarController : MonoBehaviour { public float baseSpeed = 10f; public float turnSpeed = 50f; public AnimationCurve driftCurve; public Transform[] visualWheels; private Rigidbody rb; private float turnInput; private Vector2 startTouchPos; private Vector2 currentTouchPos; void Start() { rb = GetComponent(); rb.centerOfMass = new Vector3(0, -0.5f, 0); } void Update() { // Touch input if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); switch (touch.phase) { case TouchPhase.Began: startTouchPos = touch.position; break; case TouchPhase.Moved: case TouchPhase.Stationary: currentTouchPos = touch.position; float horizontal = (currentTouchPos.x - startTouchPos.x) / Screen.width; turnInput = Mathf.Clamp(horizontal, -1f, 1f); break; case TouchPhase.Ended: turnInput = 0f; break; } } else { turnInput = 0f; } } void FixedUpdate() { float speed = baseSpeed; Vector3 forwardMove = transform.forward * speed * Time.fixedDeltaTime; rb.MovePosition(rb.position + forwardMove); float turnAmount = turnInput * turnSpeed * Time.fixedDeltaTime; Quaternion turnOffset = Quaternion.Euler(0, turnAmount, 0); rb.MoveRotation(rb.rotation * turnOffset); // Drift logic based on speed and angle Vector3 velocity = rb.velocity; float angle = Vector3.Angle(transform.forward, velocity); float driftFactor = driftCurve.Evaluate(angle); Vector3 driftDirection = Vector3.Lerp(velocity, transform.forward * velocity.magnitude, driftFactor); rb.velocity = new Vector3(driftDirection.x, rb.velocity.y, driftDirection.z); // Visual wheel rotation foreach (var wheel in visualWheels) { float rotationAmount = rb.velocity.magnitude * 10f; wheel.Rotate(Vector3.right, rotationAmount); } } }