Lección 3.2: Haz que el mundo pase volando

Tutorial

Beginner

+10XP

70 mins

(537)

Unity Technologies

Lección 3.2: Haz que el mundo pase volando

Descripción general:

Ya tenemos definidas las mecánicas básicas de este juego: el jugador puede presionar la barra espaciadora para saltar sobre obstáculos que se acercan. Sin embargo, el jugador parece que corre durante los primeros segundos, pero luego el fondo simplemente desaparece. Para corregir este detalle, necesitamos hacer que el fondo se repita sin interrupciones y así parezca que el mundo se mueve velozmente. También necesitamos que el juego se detenga cuando el jugador choque con un obstáculo, lo que a su vez detendrá la repetición del fondo y la generación de obstáculos. Por último, debemos destruir cualquier obstáculo que el jugador logre evitar.

Resultado del proyecto:

El fondo se mueve sin errores en sincronía con los obstáculos y los obstáculos desaparecen cuando sobrepasan los límites del juego. Con el poder de la comunicación de scripts, el fondo y el Spawn Manager se detendrán cuando el jugador choque con un obstáculo. Chocar con un obstáculo también desencadenará un mensaje de fin del juego en el registro de la consola, lo cual detendrá el fondo y el gestor de generación.

1. ¿Cómo crear un script para repetir el fondo?

Necesitamos repetir el fondo y moverlo a la izquierda a la misma velocidad que los obstáculos para crear la ilusión de que el mundo pasa a gran velocidad. Por fortuna, ya tenemos un script de movimiento a la izquierda, pero necesitaremos un nuevo script para que se repita.
  1. Crea un nuevo Script llamado RepeatBackground.cs y adjúntalo al Background Object.

2. ¿Cómo restablecer la posición del Background?

Para repetir el fondo y crear la ilusión de un mundo que se mueve velozmente, necesitamos restablecer la posición del objeto de fondo para que encaje de forma perfecta.
  1. Declara una nueva variable private Vector3 startPos;.
  2. En Start(), define la variable startPos en su posición inicial real al asignarle = transform.position;.
  3. En Update(), escribe un enunciado condicional if para restablecer la posición si se mueve hasta cierta distancia.

3. ¿Cómo corregir la repetición del fondo con colisionador?

Tenemos el fondo que se repite cada vez que pasan unos cuantos segundos, pero la transición se ve bastante extraña. Necesitamos hacer que el fondo se repita perfectamente y sin errores con algunas nuevas variables.
  1. Agrega un componente Box Collider al Background.
  2. Declara una nueva variable private float repeatWidth.
  3. En Start(), obtén el ancho del Box Collider, dividido entre 2.
  4. Incorpora la variable repeatWidth en la función repeat.

4. ¿Cómo agregar un nuevo desencadenador de fin del juego?

Cuando el jugador choca con un obstáculo, queremos desencadenar un estado de «Game Over» que detenga todo. Para ello, necesitamos una forma de etiquetar y discernir todos los objetos del juego con los que el jugador choca.
  1. En el Inspector, agrega una etiqueta «Ground» al Ground y una etiqueta «Obstacle» al Prefab Obstacle.
  2. En PlayerController, declara un nuevo public bool gameOver;.
  3. En OnCollisionEnter, agrega el enunciado condicional if-else para probar si el jugador chocó con el «Ground» o con un «Obstacle».
  4. Si chocó con el «Ground», define isOnGround = true y si chocó con un «Obstacle», define gameOver = true.

5. ¿Cómo detener MoveLeft cuando ocurre un gameOver?

Agregamos un bool gameOver que parece funcionar, pero el fondo y los objetos continúan en movimiento cuando el jugador choca con un obstáculo. Necesitamos el Script MoveLeft para comunicarnos con el PlayerController y detenerlo cuando el jugador desencadene un gameOver.
  1. En MoveLeft.cs, declara un nuevo private PlayerController playerControllerScript;.
  2. En Start(), inicialízalo al encontrar al Player y obtén el componente PlayerController.
  3. Envuelve el translate method en un enunciado condicional que verifique si el juego no ha terminado.

6. ¿Cómo detener la generación de obstáculos durante el gameOver?

El Background y los Obstacles dejan de moverse cuando gameOver == true, pero el Spawn Manager sigue generando un ejército de obstáculos. Necesitamos comunicarnos con el Script Spawn Manager e indicarle que se detenga cuando el juego ha finalizado.
  1. En SpawnManager.cs, obtén una referencia para playerControllerScript con la misma técnica que usaste para MoveLeft.cs.
  2. Agrega una condición para que solo cree instancias de objetos si gameOver == false.

7. ¿Cómo destruir los obstáculos que sobrepasen los límites?

Al igual que los animales en la Unidad 2, necesitamos destruir cualquier obstáculo que sobrepase los límites. Si no, se deslizarán hacia el infinito... ¡por toda la eternidad!
  1. En MoveLeft, en Update(); escribe un enunciado condicional if para Destroy Obstacles si su posición es menos que una variable leftBound.
  2. Agrega cualquier comentario que necesites hacer para que tu código sea más legible.

8. Resumen de la lección

Nueva funcionalidad

  • El fondo se repite sin errores
  • El fondo se detiene cuando el jugador choca con un obstáculo
  • La generación de obstáculos se detiene cuando el jugador choca con un obstáculo
  • Los obstáculos se destruyen al salir de la pantalla

Nuevos conceptos y habilidades:

  • Repetir fondo
  • Obtener ancho del Colisionador
  • Comunicación de Scripts
  • Operador igual que (==)
  • Etiquetas
  • CompareTag()

Siguiente lección:

  • Nuestro personaje, aunque es feliz en el fondo de su corazón, parece un poco rígido en el exterior, así que trabajaremos un poco con ANIMACIONES.

Complete this Tutorial