Optimización de Código en Controladores de Juego

Clase 31 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

Simplifica el controlador del jugador con una estrategia clara: sustituir tres comprobaciones por una sola condición, combinar los ejes con GetAxisRaw y normalizar el vector de movimiento. El update queda reducido, el código es más legible y el motor solo evalúa una condición por frame.

¿Por qué agrupar condiciones en un único if?

La lógica original comprobaba movimiento horizontal, vertical y diagonal en tres ifs, lo que complica la lectura y duplica código. Además, esas tres condiciones se evaluaban hasta 60 veces por segundo. Con una sola condición que usa OR, basta con detectar si cualquiera de los dos ejes supera un umbral para activar el movimiento.

  • Menos comprobaciones por frame y mejor rendimiento.
  • Menos líneas duplicadas y más claridad.
  • Una sola vía de entrada al estado de movimiento.

¿Qué condición OR activa el movimiento?

if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5f ||
    Mathf.Abs(Input.GetAxisRaw("Vertical")) > 0.5f)
{
    walking = true;
    // El resto del movimiento se calcula más abajo.
}

Punto clave: si uno de los ejes se invoca, nos estamos moviendo. El umbral 0.5 evita micro-movimientos.

¿Cómo combinar ejes y normalizar el vector de movimiento?

Antes, se mantenía la velocidad en el eje no usado y se corregía la diagonal con el “truco de la raíz de dos”. Ahora, basta con construir un vector con ambos ejes y llamar a Normalize. Así se obtiene la dirección correcta sin cálculos manuales.

  • Se usa el vector de movimiento como suma de horizontal y vertical.
  • Se normaliza para corregir la diagonal automáticamente.
  • Se multiplica por velocidad y por tiempo: ecuación de movimiento aplicada.

¿Cómo se forma lastMovement y se aplica velocity?

// Vector sin normalizar para el Animator y lógica de dirección
lastMovement = new Vector2(
    Input.GetAxisRaw("Horizontal"),
    Input.GetAxisRaw("Vertical")
);

// Dirección normalizada + velocidad + tiempo
playerRigidbody.velocity = lastMovement.normalized * speed * Time.deltaTime;

Detalle importante: lastMovement se guarda sin normalizar para transmitir dirección al Animator, mientras que la aplicación de movimiento se hace con el vector normalizado.

¿Qué se elimina y qué mejoras concretas se logran?

La simplificación permite borrar comprobaciones específicas de horizontal, vertical y diagonal, y también la variable de gestión manual de velocidad, como current speed. Con Normalize, esa corrección deja de ser necesaria y se puede usar solo speed.

  • Antes: alrededor de 130 líneas de código.
  • Ahora: 104 líneas aproximadamente.
  • Ahorro: unas 26 líneas eliminadas.
  • Evaluaciones por frame: pasa de tres condiciones a una sola.

  • Habilidades trabajadas: refactorización de código.

  • Conceptos clave: condición OR en un único if, vector de movimiento, normalización con Normalize, ecuación de movimiento con Time.deltaTime.
  • Keywords útiles: movimiento horizontal, vertical y diagonal; Rigidbody.velocity; GetAxisRaw; umbral 0.5; limpieza y depuración.

¿Te gustaría compartir cómo organizas tus comprobaciones de entrada y movimiento? Comenta tus variantes o dudas y seguimos la conversación.