using UnityEngine;
public class CarroControl : MonoBehaviour
{
[Header("Movimiento")]
public float velocidad = 500f;
public float velocidadReversa = 200f;
public float fuerzaFrenado = 3000f;
[Header("Wheel Colliders")]
public WheelCollider colDelanteroIzq;
public WheelCollider colDelanteroDer;
public WheelCollider colTraseroIzq;
public WheelCollider colTraseroDer;
[Header("Visual Llantas")]
public Transform llantaDelanteraIzq;
public Transform llantaDelanteraDer;
public Transform llantaTraseraIzq;
public Transform llantaTraseraDer;
[Header("Cámara")]
public Transform camara;
public Transform puntoCamara;
[Header("Sonido Motor")]
public AudioSource motorAudio;
public float pitchMin = 0.7f;
public float pitchMax = 2.0f;
public float velocidadMaximaPitch = 50f;
private Quaternion rotacionInicialCamara;
private Vector3 offsetInicialCamara;
private float tiempoDesdeMovimientoCarro = 0f;
private float tiempoDesdeMovimientoCamara = 0f;
public float tiempoResetCamaraCarro = 2f;
public float tiempoResetCamaraMouse = 4f;
private bool moviendoCamaraMouse = false;
private float anguloActualCamara = 0f;
private float velocidadRotacionCamara = 2f;
private float inputVertical;
private float inputHorizontal;
private float rotacionCamara = 0f;
private bool colisionando = false;
private float tiempoFreno = 0.3f;
private float contadorFreno = 0f;
private Rigidbody rb;
void Start()
{
rotacionInicialCamara = camara.rotation;
offsetInicialCamara = camara.position - transform.position;
rb = GetComponent<Rigidbody>();
if (motorAudio != null)
motorAudio.loop = true;
}
void Update()
{
inputVertical = Input.GetAxis("Vertical");
inputHorizontal = Input.GetAxis("Horizontal");
if (Mathf.Abs(inputHorizontal) > 0.01f || Mathf.Abs(inputVertical) > 0.01f)
tiempoDesdeMovimientoCarro = 0f;
else
tiempoDesdeMovimientoCarro += Time.deltaTime;
if (Input.GetKeyDown(KeyCode.E))
{
Vector3 euler = transform.eulerAngles;
euler.z = 0f;
transform.eulerAngles = euler;
}
ActualizarSonidoMotor();
}
void FixedUpdate()
{
float motor = 0f;
float freno = 0f;
if (contadorFreno > 0)
{
freno = fuerzaFrenado * 2;
contadorFreno -= Time.fixedDeltaTime;
}
else
{
if (inputVertical > 0)
motor = inputVertical * velocidad;
else if (inputVertical < 0)
motor = inputVertical * velocidadReversa;
if (Input.GetKey(KeyCode.Space))
freno = fuerzaFrenado;
}
colDelanteroIzq.motorTorque = motor;
colDelanteroDer.motorTorque = motor;
colTraseroIzq.motorTorque = motor;
colTraseroDer.motorTorque = motor;
colDelanteroIzq.brakeTorque = freno;
colDelanteroDer.brakeTorque = freno;
colTraseroIzq.brakeTorque = freno;
colTraseroDer.brakeTorque = freno;
colDelanteroIzq.steerAngle = inputHorizontal * 30f;
colDelanteroDer.steerAngle = inputHorizontal * 30f;
ActualizarLlantas(colDelanteroIzq, llantaDelanteraIzq);
ActualizarLlantas(colDelanteroDer, llantaDelanteraDer);
ActualizarLlantas(colTraseroIzq, llantaTraseraIzq);
ActualizarLlantas(colTraseroDer, llantaTraseraDer);
if (camara != null)
ActualizarCamara();
}
void ActualizarLlantas(WheelCollider col, Transform llanta)
{
Vector3 pos;
Quaternion rot;
col.GetWorldPose(out pos, out rot);
llanta.position = pos;
llanta.rotation = rot;
}
void ActualizarCamara()
{
// Detectar dirección del carro
Vector3 direccion = transform.forward;
if (inputVertical < -0.1f)
direccion = -transform.forward;
// Ángulo en Y hacia donde apunta el carro
float anguloObjetivo = Mathf.Atan2(direccion.x, direccion.z) * Mathf.Rad2Deg;
// Interpolación suave del ángulo Y
anguloActualCamara = Mathf.LerpAngle(anguloActualCamara, anguloObjetivo, Time.deltaTime * velocidadRotacionCamara);
// Crear rotación con X = 20, Y interpolado
Quaternion rotacionCamara = Quaternion.Euler(20f, anguloActualCamara, 0f);
// Calcular offset rotado
Vector3 offset = rotacionCamara * Vector3.back * offsetInicialCamara.magnitude;
// Posición final de la cámara (incluye altura real del carro)
Vector3 posicionFinal = puntoCamara.position + offset;
camara.position = posicionFinal;
camara.rotation = rotacionCamara; // ← Aquí forzamos que la cámara tenga X = 20
}
void ActualizarSonidoMotor()
{
if (motorAudio == null || rb == null)
return;
float velocidadActual = rb.velocity.magnitude;
float t = Mathf.Clamp01(velocidadActual / velocidadMaximaPitch);
float pitchActual = Mathf.Lerp(pitchMin, pitchMax, t);
motorAudio.pitch = pitchActual;
if (!motorAudio.isPlaying)
motorAudio.Play();
}
void OnCollisionEnter(Collision collision)
{
colisionando = true;
contadorFreno = tiempoFreno;
}
}