WEBVTT

00:00.050 --> 00:00.620
Hola a todos.

00:00.620 --> 00:01.700
Bienvenidos al video.

00:01.700 --> 00:05.360
Ya casi terminamos el desarrollo del personaje, solo faltan algunos pasos más.

00:06.890 --> 00:08.540
Ahora haremos el retroceso (knockback).

00:11.360 --> 00:17.450
Quiero dejar la funcionalidad más importante lista para poder pasar a enemigos, trampas y niveles sin volver tanto al jugador.

00:21.200 --> 00:23.330
No te preocupes, solo quedan unos videos más.

00:26.930 --> 00:32.270
En este video haremos el retroceso, para que el jugador pueda ser empujado por trampas o enemigos.

00:36.980 --> 00:39.350
Primero, eliminamos una plataforma para tener espacio.

00:42.530 --> 00:47.120
Vamos al Animator y creamos un nuevo clip: Player Knocked.

00:57.220 --> 01:02.710
En gráficos, buscamos el sprite de golpe y lo ponemos en la animación, con sample rate 12.

01:11.170 --> 01:13.990
Así el jugador se ve más lento cuando es golpeado.

01:19.730 --> 01:23.720
En el Animator, creamos un parámetro trigger llamado knockback.

01:38.980 --> 01:45.250
Arrastramos la animación y hacemos transición desde cualquier estado (Any State) a knocked, con condición knockback.

01:50.650 --> 01:51.280
Así puede ser golpeado en cualquier momento.

02:21.080 --> 02:22.880
Ponemos la duración de transición en cero y desmarcamos exit time.

02:47.120 --> 02:48.320
De knocked a idle/move, sin condición, pero con exit time en uno.

03:07.630 --> 03:09.070
Ahora configuramos el retroceso en el script.

03:15.100 --> 03:17.290
Creamos un header Knockback, con variables para duración, fuerza y booleanos.

03:54.840 --> 03:55.860
Ya tenemos el script.

04:01.120 --> 04:02.080
Creamos el método público Knockback.

04:10.440 --> 04:13.350
Ponemos isKnocked en true y activamos la animación con anim.SetTrigger("Knockback").

04:44.020 --> 04:47.860
Este método lo llamarán los enemigos o trampas, por eso es público.

05:10.090 --> 05:12.010
Por ahora, lo probamos con una tecla del teclado.

05:30.410 --> 05:35.360
Corremos, presionamos K y el jugador es golpeado.

05:41.330 --> 05:47.210
Queremos que el retroceso dure un tiempo y luego se desactive. Usamos una corutina para eso.

06:10.810 --> 06:13.120
En la corutina, canBeKnocked = false, isKnocked = true, esperamos la duración y luego los reseteamos.

06:36.820 --> 06:42.490
En Knockback, llamamos a StartCoroutine(KnockbackRoutine).

06:44.490 --> 06:51.600
Mientras isKnocked, el jugador no puede moverse ni saltar. En los métodos de movimiento, si isKnocked, return.

07:27.060 --> 07:31.950
Probamos: durante el retroceso no podemos saltar, pero sí después.

07:39.980 --> 07:41.150
Muy bien.

07:49.350 --> 07:53.250
Aplicamos la fuerza de retroceso usando RB.velocity = new Vector2(knockbackPower.x * -facingDirection, knockbackPower.y).

08:12.110 --> 08:14.030
Si isKnocked, no podemos volver a activar el retroceso.

08:38.350 --> 08:40.150
Probamos con valores de fuerza y funciona.

09:15.190 --> 09:19.900
Si la animación es más corta que la duración, ajusta knockbackDuration para que coincidan.

10:01.180 --> 10:06.550
Si quieres un retroceso más largo, puedes usar un booleano para controlar la transición de animaciones.

10:54.610 --> 10:56.620
Por ahora, lo dejamos así y lo ajustamos después si es necesario.

11:17.070 --> 11:18.930
Más adelante mejoraremos el retroceso según el objeto que golpee al jugador.

11:31.570 --> 11:31.570
¡Listo! Pasamos al siguiente video.
