12/09/2018
Hacer que un personaje salte en Unity puede parecer una de las tareas más sencillas al empezar a desarrollar un juego. Sin embargo, lograr que ese salto se sienta bien, que sea responsivo y que se adapte a las necesidades de tu gameplay, es un arte sorprendentemente complejo. ¿Usarás las físicas incorporadas de Unity para lanzar al jugador por los aires, o prefieres un control manual y preciso a través de scripts? ¿Cómo puedes evitar esa sensación de "flotar" en el aire? ¿Y cómo permitir que el jugador salte más alto si mantiene presionado el botón?
Hay muchas variables a considerar, y la elección correcta dependerá enteramente del tipo de juego que estés creando. Pero no te preocupes. En este artículo, desglosaremos paso a paso todo lo que necesitas saber sobre los saltos en Unity. Exploraremos los diferentes métodos, desde los más básicos hasta técnicas avanzadas, para que puedas decidir cuál es el mejor para tu proyecto y crear una mecánica de salto que tus jugadores adorarán.

- El Salto Básico con Físicas: El Rol del Rigidbody
- Solucionando el "Salto Flotante": Ajustando la Gravedad
- Técnicas de Salto Avanzadas con Físicas
- Saltar Sin Físicas: Control Manual con Transform
- Alternativas: Character Controller y Rigidbody Kinematic
- Tabla Comparativa de Métodos de Salto
- Preguntas Frecuentes (FAQ)
El Salto Básico con Físicas: El Rol del Rigidbody
El método más común y directo para implementar un salto en Unity es utilizando el sistema de físicas. El corazón de este sistema es el componente Rigidbody (o Rigidbody2D para juegos en 2D). Un Rigidbody permite que un GameObject sea controlado por el motor de físicas de Unity, lo que significa que será afectado por la gravedad, podrá colisionar con otros objetos y se le podrán aplicar fuerzas.
Para hacer saltar a un personaje, simplemente aplicamos una fuerza vertical hacia arriba a su Rigidbody. Esto se logra con la función AddForce.
En un proyecto 3D, se vería así:
public Rigidbody rb;
public float fuerzaSalto = 10f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * fuerzaSalto, ForceMode.Impulse);
}
}
Y en 2D, el concepto es idéntico, pero usando componentes y vectores 2D:
public Rigidbody2D rb;
public float fuerzaSalto = 10f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector2.up * fuerzaSalto, ForceMode2D.Impulse);
}
}
En ambos ejemplos, Vector3.up (o Vector2.up) es una forma abreviada de escribir un vector que apunta directamente hacia arriba. Lo multiplicamos por nuestra variable fuerzaSalto para controlar la intensidad. Un detalle crucial es el segundo parámetro: ForceMode.Impulse. Este modo aplica la fuerza de manera instantánea, como un golpe o una explosión, lo cual es perfecto para un salto. El modo por defecto (ForceMode.Force) aplica la fuerza de manera gradual, como el empuje de un cohete, lo que no suele ser deseable para esta mecánica.
Solucionando el "Salto Flotante": Ajustando la Gravedad
Al implementar el salto básico, es muy común encontrarse con un problema: el personaje sube y baja lentamente, dando una sensación de estar flotando o de tener poco peso. Esto puede arruinar el "game feel" de un juego de plataformas que requiere precisión y rapidez.

La solución más sencilla es aumentar el efecto de la gravedad sobre el personaje. En el componente Rigidbody2D, existe una propiedad llamada Gravity Scale. Por defecto, su valor es 1. Si aumentas este valor (a 3, 5, o incluso 10), la fuerza de la gravedad que afecta a ese objeto específico se multiplicará, haciendo que caiga mucho más rápido.
Al aumentar la escala de gravedad, necesitarás también aumentar considerablemente tu variable fuerzaSalto para compensar y alcanzar la misma altura. El resultado será un salto mucho más rápido, ágil y responsivo.
Una Nota sobre Colisiones a Alta Velocidad
Cuando un objeto se mueve muy rápido, existe la posibilidad de que atraviese otras geometrías en un solo frame, un fenómeno conocido como "tunnelling". Para evitar que tu jugador atraviese el suelo, puedes cambiar la propiedad Collision Detection en su Rigidbody de `Discrete` a `Continuous`. Esto consume un poco más de rendimiento, pero es esencial para personajes rápidos.
Técnicas de Salto Avanzadas con Físicas
Una vez dominado el salto básico, podemos añadir capas de complejidad para darle al jugador más control y mejorar la experiencia.
1. Salto de Altura Variable
En muchos juegos de plataformas clásicos, la altura del salto depende de cuánto tiempo el jugador mantenga presionado el botón. Una pulsación corta resulta en un salto bajo, mientras que una pulsación larga alcanza la altura máxima. ¿Cómo logramos esto?
Una técnica efectiva es aplicar la fuerza del salto inicial y, si el jugador suelta el botón antes de llegar al punto más alto, reducir la velocidad vertical. Esto se puede hacer aplicando una fuerza hacia abajo o, de forma más directa, modificando la velocidad del Rigidbody.

public Rigidbody2D rb;
public float jumpForce = 20f;
public float cancelRate = 100f;
bool jumping = false;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
jumping = true;
}
if (jumping && Input.GetKeyUp(KeyCode.Space))
{
// Si suelta el botón mientras sube, frena el ascenso
if (rb.velocity.y > 0)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f); // Reduce la velocidad a la mitad
}
}
// Lógica para resetear 'jumping' cuando toque el suelo (no incluida aquí)
}
2. Caída Acelerada (Estilo Super Mario)
Otra técnica clásica es hacer que el personaje caiga más rápido de lo que sube. Esto le da al jugador más tiempo para reaccionar en el aire y controlar el descenso. La forma más simple de lograrlo es cambiando dinámicamente el `Gravity Scale`.
public Rigidbody2D rb;
public float normalGravityScale = 5f;
public float fallingGravityScale = 15f;
void Update()
{
if (rb.velocity.y >= 0)
{
// Está subiendo o en el ápice del salto
rb.gravityScale = normalGravityScale;
}
else
{
// Está cayendo
rb.gravityScale = fallingGravityScale;
}
}
3. Salto a una Altura Exacta
Para diseñadores de niveles que necesitan consistencia, es posible calcular la fuerza exacta necesaria para que el personaje alcance una altura específica, sin importar los cambios en la gravedad. Esto se logra con una fórmula física:
fuerza = √(alturaDeseada * -2 * gravedad)
En código, se vería así:
public Rigidbody2D rb;
public float alturaSalto = 5f;
void Jump()
{
float gravedadActual = Physics2D.gravity.y * rb.gravityScale;
float fuerzaNecesaria = Mathf.Sqrt(alturaSalto * -2f * gravedadActual);
rb.AddForce(new Vector2(0, fuerzaNecesaria), ForceMode2D.Impulse);
}
Saltar Sin Físicas: Control Manual con Transform
A veces, el sistema de físicas de Unity puede ser excesivo o no ofrecer el tipo de control granular que necesitas. En esos casos, puedes optar por controlar el movimiento del personaje manualmente, modificando directamente su componente Transform. Esto te da control absoluto, pero también significa que eres responsable de implementar todo, incluyendo la gravedad y la detección de colisiones.
Implementando tu Propia Gravedad y Salto
Para esto, mantenemos una variable de velocidad vertical. Al saltar, le damos un valor positivo. En cada frame, le restamos un valor de gravedad.
public float fuerzaSalto = 20f;
public float gravedad = -30f;
private float velocidadVertical;
private bool enElSuelo = true;
void Update()
{
// Aplicar gravedad solo si no está en el suelo
if (!enElSuelo)
{
velocidadVertical += gravedad * Time.deltaTime;
}
// Saltar si está en el suelo
if (Input.GetKeyDown(KeyCode.Space) && enElSuelo)
{
velocidadVertical = fuerzaSalto;
enElSuelo = false;
}
// Mover el personaje
transform.Translate(new Vector3(0, velocidadVertical, 0) * Time.deltaTime);
// Aquí necesitarías una lógica de Ground Check para detectar el suelo
}
La Necesidad de un "Ground Check"
Como el personaje ya no tiene un Rigidbody que gestione colisiones, caerá infinitamente a menos que le digamos cuándo detenerse. Para esto, se usa una técnica llamada "Ground Check". Consiste en lanzar una pequeña línea (Raycast) o una caja (OverlapBox) invisible desde los pies del personaje hacia abajo. Si esta forma detecta un objeto con un collider (el suelo), entonces sabemos que el personaje está "en el suelo".
public Transform groundCheckPoint;
public float groundCheckRadius = 0.2f;
public LayerMask groundLayer;
void CheckGround()
{
enElSuelo = Physics2D.OverlapCircle(groundCheckPoint.position, groundCheckRadius, groundLayer);
if (enElSuelo && velocidadVertical < 0)
{
velocidadVertical = 0;
}
}
Esta función `CheckGround()` se llamaría en cada `Update` para actualizar constantemente el estado del jugador.

Alternativas: Character Controller y Rigidbody Kinematic
Existen dos enfoques híbridos que combinan aspectos del control manual y las físicas.
Character Controller: Es un componente específico para movimiento de personajes (principalmente en 3D). No usa fuerzas de Rigidbody, sino que se mueve con la función `Move()`. Gestiona las colisiones por sí mismo, evitando que el personaje atraviese paredes y suelos, e incluso tiene una propiedad `.isGrounded` muy conveniente. Es una excelente opción para juegos en primera persona, pero sus interacciones con otros objetos de física pueden ser menos realistas que las de un Rigidbody completo.
Rigidbody Kinematic: Un Rigidbody puede ser configurado como `Kinematic`. Esto significa que sigue siendo parte del sistema de físicas (útil para detectar colisiones y triggers), pero no es afectado por fuerzas externas como la gravedad o los impactos. Tú lo mueves manualmente a través de scripts usando `rb.MovePosition()`. Este método ofrece un control muy preciso, similar al de mover el Transform, pero con una mejor integración en el ecosistema de físicas de Unity, lo cual es ideal para el rendimiento en 2D al mover colliders.
Tabla Comparativa de Métodos de Salto
| Método | Pros | Contras | Ideal para... |
|---|---|---|---|
| Rigidbody Dinámico | Fácil de empezar, interacciones físicas realistas. | Puede sentirse "flotante" sin ajustes, menos control preciso. | Juegos basados en físicas, prototipos rápidos. |
| Control por Transform | Control total y predecible sobre el movimiento. | Requiere implementar gravedad y colisiones manualmente. | Juegos de plataformas de alta precisión, donde el "feel" debe ser perfecto. |
| Character Controller (3D) | Solución integrada, gestiona colisiones básicas, tiene `isGrounded`. | Interacciones con otros Rigidbodies pueden ser extrañas. | Juegos en primera o tercera persona que no dependen de interacciones físicas complejas. |
| Rigidbody Kinematic | Control preciso como el Transform, pero mejor integrado con las físicas (eventos de colisión). | No es afectado por fuerzas, requiere movimiento manual. | Personajes que necesitan un movimiento preciso pero deben interactuar con triggers o empujar otros objetos físicos. |
Preguntas Frecuentes (FAQ)
- ¿Por qué necesito obtener una referencia al Rigidbody con `GetComponent`?
- Tu script y el Rigidbody son dos componentes separados en el mismo GameObject. Para que tu script pueda darle órdenes al Rigidbody (como aplicar una fuerza), primero necesita una referencia a él. `GetComponent
()` es la forma de buscar y "agarrar" ese componente para poder usarlo en el código. - ¿Debo poner mi código de salto en `Update` o `FixedUpdate`?
- La regla general es: la detección de input (como `Input.GetKeyDown`) debe ir en `Update`, ya que se ejecuta en cada frame. Las operaciones de física (como `AddForce` con modo Force o modificar la velocidad continuamente) deben ir en `FixedUpdate`, que se ejecuta a un ritmo fijo y sincronizado con el motor de físicas. Para un `AddForce` con `Impulse`, que es instantáneo, llamarlo desde `Update` suele ser aceptable.
- ¿Cuál es la diferencia entre un Rigidbody dinámico, cinemático (kinematic) y estático?
- Un Rigidbody Dinámico es el estándar: se mueve por fuerzas y es afectado por la gravedad. Un Rigidbody Cinemático (Kinematic) no es afectado por fuerzas; solo se mueve si lo programas para ello. Un objeto Estático es uno que solo tiene un Collider pero no tiene Rigidbody; el motor de físicas asume que nunca se moverá.
- ¿Qué es la Interpolación (Interpolate) en el Rigidbody?
- Como `FixedUpdate` (físicas) y `Update` (gráficos) corren a frecuencias distintas, el movimiento de un objeto físico puede verse ligeramente entrecortado o con "jitter". Activar la interpolación en el Rigidbody suaviza visualmente este movimiento, prediciendo dónde debería estar el objeto entre los cálculos de física. Es muy recomendable para el personaje del jugador.
Crear el salto perfecto es un proceso de experimentación. No hay una única solución correcta. Te animo a probar estos diferentes métodos, ajustar los valores de fuerza, gravedad y tiempo, y encontrar la combinación que haga que mover a tu personaje sea una experiencia divertida y satisfactoria. Al final, un buen control del personaje es uno de los pilares fundamentales de un gran juego.
Si quieres conocer otros artículos parecidos a Salto Perfecto en Unity: La Guía Definitiva puedes visitar la categoría Juegos.
