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#
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 enFixedUpdate: la regla de oro. Ver Update vs FixedUpdate. GetAxisRaw(en vez deGetAxis) 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.
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.positionteniendo 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.