🎮 UnityDocs

Movimiento de personaje 2D

Receta completa para mover un personaje de plataformas en 2D con Rigidbody2D: movimiento horizontal responsivo, giro del sprite y buenas prácticas de input y física.

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

El objetivo#

Un personaje 2D que se mueve a izquierda y derecha con respuesta precisa, mira hacia donde anda y respeta las reglas de física de Unity.

Requisitos#

En el personaje: un Rigidbody2D (con Gravity Scale ≈ 3 para plataformas, o 0 para vista cenital), un Collider2D y un SpriteRenderer. Congela la rotación Z del Rigidbody2D (Constraints → Freeze Rotation Z) para que no gire al chocar.

La receta#

C#
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class Movimiento2D : MonoBehaviour
{
    [SerializeField] private float velocidad = 7f;

    private Rigidbody2D rb;
    private SpriteRenderer sr;
    private float entradaX;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        sr = GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        // Input en Update: -1, 0 o 1
        entradaX = Input.GetAxisRaw("Horizontal");

        // Girar el sprite según la dirección
        if (entradaX > 0) sr.flipX = false;
        else if (entradaX < 0) sr.flipX = true;
    }

    void FixedUpdate()
    {
        // Movimiento en FixedUpdate: conserva la velocidad vertical (gravedad/salto)
        rb.linearVelocity = new Vector2(entradaX * velocidad, rb.linearVelocity.y);
    }
}

Por qué funciona así#

  • Input en Update, física en FixedUpdate: la regla de oro. Ver Update vs FixedUpdate.
  • GetAxisRaw (en vez de GetAxis) da respuesta instantánea, ideal para plataformas precisas.
  • Conservar linearVelocity.y: solo tocamos la X; así la gravedad y el salto (la Y) siguen funcionando sin interferencias.
Aceleración y frenada

Fijar la velocidad directamente da un control "arcade" (arranque y parada secos). Para una sensación más pulida, interpola hacia la velocidad objetivo con Mathf.MoveTowards, añadiendo aceleración y fricción. Es lo que hacen los plataformas que se sienten bien.

Añadir salto#

Combínalo con la receta de doble salto, que ya incluye la detección de suelo. Ambos scripts conviven en el mismo personaje sin conflicto porque uno toca la X y el otro la Y.

Errores frecuentes#

  • Mover con transform.position teniendo Rigidbody2D (rompe colisiones).
  • Sobrescribir la velocidad Y al mover en horizontal (el personaje "flota" o ignora la gravedad).
  • Leer el input en FixedUpdate (respuesta irregular).
  • Olvidar congelar la rotación Z y ver al personaje tumbarse.

Resumen#

Rigidbody2D + input en Update + linearVelocity en FixedUpdate, conservando la Y. Con GetAxisRaw para precisión y flipX para el giro. Súmale el doble salto y tienes un personaje de plataformas funcional.

Fuentes y para profundizar