Mover un enemigo en Unity con FixedUpdate garantiza una física estable y un movimiento suave, incluso si bajan los frames. Aquí verás cómo calcular la velocidad y el giro según la dirección, y cómo aplicar la velocidad al rigidbody solo cuando el juego está en marcha, para mantener un control total del comportamiento.
¿Por qué usar fixedupdate en Unity para física del enemigo?
Usar FixedUpdate evita que las caídas de FPS afecten al movimiento. A diferencia de Update, que corre cada frame, FixedUpdate se llama menos veces por segundo pero a intervalos fijos, ideal para cálculos de fuerzas, aceleraciones y velocidades que impactan el motor de físicas y los rigid bodies. Así se minimizan los cambios visuales indeseados en pantalla.
- Update vs FixedUpdate: Update depende de los frames; FixedUpdate usa intervalos fijos.
- Física estable: cálculos en FixedUpdate para evitar saltos visuales.
- Cuándo usarlo: cuando actualizas el motor de físicas con velocidad o fuerzas.
Ejemplo de estructura básica:
void FixedUpdate()
{
// 1) Calcular velocidad según dirección.
// 2) Girar el sprite con eulerAngles si cambia la orientación.
// 3) Aplicar la velocidad al rigidbody solo si el estado es InGame.
}
¿Cómo calcular dirección y girar al enemigo con euler angles?
Primero se define una velocidad actual y se ajusta su signo según el sentido. Si mira a la derecha, es positiva; si mira a la izquierda, es negativa. Luego, se gira el objeto con transform.eulerAngles a 0 o 180 grados en el eje Y para reflejar visualmente el cambio de sentido.
¿Cómo invertir la velocidad según facing right?
- Velocidad positiva: cuando se avanza a la derecha.
- Velocidad negativa: cuando se avanza a la izquierda.
- Variable clave: una float, por ejemplo, currentRunningSpeed.
float currentRunningSpeed = runningSpeed;
if (facingRight)
{
currentRunningSpeed = runningSpeed; // derecha: velocidad positiva
}
else
{
currentRunningSpeed = -runningSpeed; // izquierda: velocidad negativa
}
¿Cómo girar con transform.eulerAngles 0/180?
- Giro a la derecha: Y en 180 para voltear el sprite.
- Giro a la izquierda: Vector3.zero para mantener orientación original.
if (facingRight)
{
transform.eulerAngles = new Vector3(0f, 180f, 0f);
}
else
{
transform.eulerAngles = Vector3.zero; // 0,0,0
}
¿Cómo aplicar la velocidad con gamemanager y rigidbody2d?
La velocidad calculada solo se aplica cuando el estado del juego es InGame. Si la partida no ha empezado o hay game over, el enemigo se queda quieto. Esto ofrece más control sobre el comportamiento y evita movimientos fuera de contexto.
- Condición de movimiento: solo con GameState.InGame.
- Eje X controlado: se usa currentRunningSpeed en X.
- Eje Y preservado: se mantiene rb.velocity.y para no alterar su valor.
if (GameManager.Instance.CurrentGameState == GameState.InGame)
{
rb.velocity = new Vector2(currentRunningSpeed, rb.velocity.y);
}
¿Qué parámetros ajusta el game designer?
- facingRight: al cambiarlo, el enemigo gira y recorre el lado opuesto.
- runningSpeed: puedes subirlo para que vaya muy rápido.
- Colocación en escena: si no está integrado en otros elementos, puede percibirse más lento respecto a la pantalla.
¿Te gustaría que el enemigo reaccione al chocar con paredes y se dé la vuelta de forma automática? Cuéntame qué comportamiento quieres añadir y lo diseñamos paso a paso.