🎮 UnityDocs

Cómo hacer un doble salto

Receta rápida y completa para implementar salto y doble salto en 2D con Rigidbody2D, incluyendo detección de suelo y cómo generalizarlo a N saltos.

🍳 RecetaPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 5 min · ⌨️ Práctica 15 min

El objetivo#

Un personaje que puede saltar desde el suelo y una vez más en el aire (doble salto), y que recupera los saltos al tocar el suelo.

Requisitos#

En tu personaje: un Rigidbody2D (Gravity Scale ≈ 3 para un salto ágil) y un Collider2D. Un objeto vacío hijo colocado en los pies (para detectar el suelo) y una capa "Suelo" asignada a las plataformas.

La receta#

C#
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class SaltoDoble : MonoBehaviour
{
    [SerializeField] private float fuerzaSalto = 12f;
    [SerializeField] private int saltosMaximos = 2;      // 2 = doble salto
    [SerializeField] private Transform pies;
    [SerializeField] private float radioSuelo = 0.2f;
    [SerializeField] private LayerMask capaSuelo;

    private Rigidbody2D rb;
    private int saltosRestantes;

    void Awake() => rb = GetComponent<Rigidbody2D>();

    void Update()
    {
        if (EnSuelo() && rb.linearVelocity.y <= 0.01f)
            saltosRestantes = saltosMaximos;   // recarga al aterrizar

        if (Input.GetKeyDown(KeyCode.Space) && saltosRestantes > 0)
        {
            // Reinicia la velocidad vertical para que el 2.º salto sea consistente
            rb.linearVelocity = new Vector2(rb.linearVelocity.x, fuerzaSalto);
            saltosRestantes--;
        }
    }

    bool EnSuelo() => Physics2D.OverlapCircle(pies.position, radioSuelo, capaSuelo);

    void OnDrawGizmosSelected()
    {
        if (pies == null) return;
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(pies.position, radioSuelo);
    }
}

Por qué funciona#

  • saltosRestantes cuenta cuántos saltos quedan; se recarga a saltosMaximos al tocar suelo.
  • Al reiniciar la velocidad vertical antes de aplicar el impulso, el segundo salto siempre tiene la misma altura, aunque el personaje estuviera cayendo.
  • saltosMaximos te da salto sencillo (1), doble (2) o triple (3) cambiando un número.
Coyote time y buffer

Para que el salto se sienta profesional, añade coyote time (permitir saltar unos milisegundos después de dejar el borde) y jump buffering (recordar la pulsación si se hizo justo antes de aterrizar). Son dos temporizadores pequeños que marcan una diferencia enorme en la sensación de control.

Errores frecuentes#

  • No detectar bien el suelo: si el círculo de pies se solapa con el propio collider del jugador, siempre dará "en suelo". Usa una LayerMask que solo incluya el suelo.
  • Sumar fuerza en vez de fijar velocidad: usar AddForce para saltar da alturas inconsistentes según la velocidad previa. Fijar linearVelocity.y es más predecible para plataformas.
  • Leer el salto en FixedUpdate: GetKeyDown puede perderse ahí; léelo en Update.

Resumen#

Un contador de saltos + detección de suelo + fijar la velocidad vertical. Cambiando saltosMaximos tienes salto simple, doble o triple. Para entender por qué el input va en Update y la física en FixedUpdate, mira el ciclo de vida.

Fuentes y para profundizar