La coherencia del control marca la diferencia. Aquí verás cómo evitar que el personaje corra más en diagonal y cómo lograr que las animaciones acompañen el movimiento con precisión. Con una simple normalización del vector y una configuración clara del blend tree, obtendrás un comportamiento pulido y profesional.
¿Por qué el movimiento diagonal acelera en Unity?
Cuando combinas dos direcciones (horizontal y vertical), la suma de vectores forma la hipotenusa de un triángulo rectángulo. Eso hace que la velocidad diagonal sea mayor que la de un solo eje: en concreto, es raíz de dos veces la original. Por eso el personaje se desplaza más rápido en diagonal.
- Suma de vectores: la diagonal es la hipotenusa.
- Efecto observable: mayor velocidad combinando dos ejes.
- Solución: normalización del vector de movimiento.
¿Cómo normalizar la velocidad en diagonal?
La idea es detectar cuando hay dos movimientos simultáneos y, en ese caso, dividir la velocidad por Mathf.Sqrt(2). Para ello, crea una variable currentSpeed que sustituya a speed allí donde se calcula el movimiento.
- Detección de diagonal: umbral con Mathf.Abs e Input.GetAxisRaw mayor que 0.5.
- Corrección de velocidad: currentSpeed = speed / Mathf.Sqrt(2f) si hay doble entrada.
- Uso consistente: reemplaza todas las multiplicaciones por speed con currentSpeed.
public float speed; // velocidad original
private float currentSpeed; // velocidad efectiva
void Update() {
// detectar movimiento en dos ejes a la vez
bool movingH = Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5f;
bool movingV = Mathf.Abs(Input.GetAxisRaw("Vertical")) > 0.5f;
if (movingH && movingV) {
currentSpeed = speed / Mathf.Sqrt(2f); // normalización
} else {
currentSpeed = speed;
}
// usar currentSpeed en lugar de speed
float moveX = Input.GetAxisRaw("Horizontal") * currentSpeed;
float moveY = Input.GetAxisRaw("Vertical") * currentSpeed;
// ... aplica moveX y moveY como ya lo tenías.
}
Resultados esperados: la velocidad en diagonal coincide con la horizontal o vertical, sin acelerones. Además, el control se siente más uniforme y predecible.
¿Cómo priorizar animaciones en diagonales con blend trees?
Moverse en ocho direcciones no obliga a crear ocho animaciones nuevas. En lugar de combinar clips en diagonal, prioriza una animación existente según el cuadrante. Así evitas generar cuatro ataques y cuatro desplazamientos adicionales.
- Recursos existentes: arriba, abajo, izquierda, derecha.
- Objetivo: usar una de las cuatro según la diagonal.
- Beneficio: menos arte, menos clips y lógica clara.
¿Qué configuración usar en el Animator?
En el blend tree del ataque (y si quieres, también en movimiento), añade cuatro motion fields adicionales que representen las diagonales y asígnales animaciones ya existentes según el eje Y.
- Añade cuatro puntos: (1, 1), (1, -1), (-1, -1), (-1, 1).
- y positivo: asigna la animación de ataque mirando hacia arriba.
- y negativo: asigna la animación de ataque mirando hacia abajo.
- Izquierda/derecha: seguirán predominando cuando corresponda por el parámetro X.
Con esta prioridad, cuando el personaje mire en diagonal hacia arriba, verás el ataque vertical hacia arriba; si mira hacia abajo, verás el ataque vertical hacia abajo. El resultado es consistente y fácil de mantener.
¿Qué mejoras de código conviene planear?
Ahora mismo puedes tener varios ifs: horizontal, vertical y diagonal. Un siguiente paso recomendable es simplificar la lógica en un único bloque que calcule la velocidad efectiva y reduzca repeticiones. Así el update queda limpio, más legible y listo para crecer.
¿Te quedó alguna duda sobre la normalización, los umbrales o la configuración del blend tree? Cuéntame tu caso y ajustamos los detalles juntos.