Detección de Colisión con Raycast en Unity para Saltos Precisos

Clase 10 de 53Curso de C# para Videojuegos

Resumen

Un salto preciso en Unity empieza por entender el motor de físicas y la entrada del teclado. Aquí verás cómo pasar de un salto descontrolado a un comportamiento sólido usando raycast, capas y entradas discretas. Todo está enfocado a corregir el problema típico de “salta sin parar” y a que controles la lógica con confianza.

¿Por qué el personaje salta indefinidamente en Unity?

Cuando mantienes pulsada la tecla de salto dentro de update, el código se ejecuta en cada frame. Si el juego corre a 60 frames por segundo, estás aplicando fuerza vertical 60 veces por segundo. Resultado: el astronauta acumula fuerza y tarda mucho en bajar. La clave es simple: solo se debe saltar si estás cerca del suelo.

¿Qué hace update a 60 fps?

  • Llama tu lógica 60 veces por segundo si el juego va a 60 fps.
  • Repite la aplicación de fuerza si usas GetKey.
  • Genera saltos enormes por acumulación de impulsos.

¿Por qué GetKey causa múltiples saltos?

  • GetKey mantiene la acción mientras la tecla está pulsada.
  • Se comporta como un arma automática: cada frame suma impulso.
  • Necesitas una entrada discreta: un solo salto por pulsación.

¿Cómo detectar el suelo con raycast y layer mask?

Para que el salto ocurra solo cerca del suelo, usa un rayo invisible con Physics2D.Raycast y limita la detección a una Layer Mask de “suelo”. Así el personaje “pregunta” al motor de físicas si hay suelo bajo sus pies a una distancia máxima.

¿Cómo crear la capa ground en Unity?

  • Crea una capa nueva: Ground.
  • Asigna esa capa a todo lo que sea suelo: floor, plataformas pequeña/mediana/grande y rocas.
  • En el Player, expón una variable pública tipo LayerMask y asígnale la capa Ground desde el Inspector.
  • Beneficio: filtras colisiones solo contra el suelo, evitando falsos positivos.
// En tu script del jugador
public LayerMask groundMask; // capa de suelo asignada en el Inspector

¿Cómo programar el método isTouchingTheGround?

La función debe responder con un booleano: “¿estoy tocando el suelo?”. Usamos un rayo desde la posición del personaje hacia abajo, hasta una distancia razonable. Si el rayo choca con algo en la groundMask, devolvemos true.

// Nos indica si el personaje está o no tocando el suelo.
bool IsTouchingTheGround()
{
    // Distancia de detección ajustable: 1.5 m para personajes grandes.
    float checkDistance = 1.5f; 
    var hit = Physics2D.Raycast(transform.position, Vector2.down, checkDistance, groundMask);
    return hit.collider != null; // true si hay suelo a esa distancia.
}

Puntos clave: - Distancia muy corta (0.2f) puede fallar si el personaje es grande. - Prueba 1.0f, 1.5f o 2.0f y verifica la consistencia del salto. - Documenta tu código con comentarios y usa // TODO para pendientes.

¿Qué ajustes clave estabilizan el salto?

Además del raycast, evita la repetición de la fuerza con una entrada discreta. Cambia GetKey por GetKeyDown para detectar solo la bajada de la tecla.

¿Qué cambiar a GetKeyDown evita el salto continuo?

  • Sustituye la lectura continua por una pulsación única.
  • Combínalo con la comprobación del suelo para emitir un único impulso.
void Jump()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsTouchingTheGround())
    {
        // Aplica un impulso vertical una sola vez.
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }
}

Buenas prácticas: - Guarda el script antes de probar. Si no, no verás cambios. - Mantén el código indentado y legible. Mejora la depuración.

¿Qué parámetros ajustar: fuerza y masa?

  • Ajusta jumpForce y la masa del Rigidbody2D para modular altura y respuesta.
  • Recuerda la segunda ley de Newton: fuerza = masa por aceleración.
  • Si el salto es excesivo al mantener espacio, revisa: distancia del raycast y uso de GetKeyDown.
  • Más adelante, visualiza el rayo con Gizmos para afinar la distancia con precisión.

Ideas clave que consolidar: - Raycast hacia abajo con Physics2D limita el salto al estar cerca del suelo. - Layer Mask “Ground” organiza qué colisiona como suelo. - Entrada discreta con GetKeyDown elimina impulsos repetidos. - Documentación con // y TODO acelera el aprendizaje y la corrección. - Calibración: distancia del rayo, jumpForce y masa determinan el resultado final.

¿Te funcionó este enfoque o te encuentras con un caso especial de colisiones o tamaños? Cuéntalo en comentarios y vemos cómo afinar tu configuración.