Crea un juego móvil 2D con Unity | Max Vynnyk | Skillshare
Buscar

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Crea un juego móvil 2D con Unity

teacher avatar Max Vynnyk, Software Developer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción al curso

      1:28

    • 2.

      S1L0: introducción de la sección

      0:55

    • 3.

      S1L1: configuración central de la escena

      4:36

    • 4.

      S1L2: agrega un creador de rutas

      2:37

    • 5.

      S1L3: mover bolas

      8:24

    • 6.

      S1L4: generación de bolas

      12:21

    • 7.

      S1L5: destruye bolas

      9:33

    • 8.

      S1L6: lanza bolas

      12:10

    • 9.

      S1L7: agrega diferentes colores

      6:09

    • 10.

      S1L8: bolas de tierra

      16:04

    • 11.

      S1L9: destruye los mismos colores

      5:58

    • 12.

      S1L10: refactorización de la sección media

      1:56

    • 13.

      S1L11: mueve las bolas separadas hacia atrás

      5:57

    • 14.

      S1L12: movimiento → ciclo de destrucción

      2:53

    • 15.

      S1L13: agrega bolas especiales

      8:25

    • 16.

      S1L14: agrega una bola tipo bomba

      5:02

    • 17.

      S1L15: agrega bola de tipo inverso

      5:26

    • 18.

      S1L16: agrega bolas de tipo lento

      3:14

    • 19.

      S1L17: refactorización de secciones y corrección de errores

      1:49

    • 20.

      S2L1: agrega nuevos sprites

      3:51

    • 21.

      S2L2: sprites de bolas activadas

      4:50

    • 22.

      S2L3: sprite activo para disparar

      5:00

    • 23.

      S2L4: agrega música y SFX

      7:12

    • 24.

      S2L5: agrega sprites de ruta y generador

      1:21

    • 25.

      S2L6: agrega animación de destructor

      3:12

    • 26.

      S3L1: menú principal

      7:00

    • 27.

      S3L2: pausa del menú

      6:36

    • 28.

      S3L3: agrega niveles

      11:19

    • 29.

      S3L4: agrega un escenario emocionante

      6:17

    • 30.

      S3L5: comienza un nuevo juego

      6:06

    • 31.

      S3L6: corrige errores y optimiza

      14:35

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

21

Estudiantes

1

Proyectos

Acerca de esta clase

¡Obtén una nueva experiencia creando un juego móvil 2D al estilo de las mazmorras!

Ambos sabemos que para mejorar en algo, necesitamos practicarlo.
Especialmente si se trata de ser desarrollador, necesitamos actualizar continuamente nuestros conocimientos y adquirir habilidades.
Al igual que en los juegos, necesitamos mejorar nuestras habilidades, subir de nivel para seguir jugando.

Este curso no es un tutorial para enseñarte a ser desarrollador de juegos desde cero.
Hay muchos cursos en Internet que puedes tomar para lograr ese objetivo.
En cambio, este curso es como una misión en un juego y está diseñado para darte nueva experiencia, herramientas, habilidades de práctica y
confianza.Este curso fue creado para ti si ya tienes experiencia de principiante con Unity y C#, y entiendes los conceptos básicos del desarrollo de juegos y la programación de
C#.Te dará una buena ganancia de experiencia y obtendrás nuevas habilidades prácticas para crear juegos similares de coincidencia de mosaicos.

Lo hice para ayudarte a subir de nivel como desarrollador de juegos.

No tengas miedo de cometer errores.Durante el curso, verás que los errores son en realidad una forma de obtener conocimientos y comprensión más
profundos.
Todo lo que necesitamos es encontrarlos y solucionarlos.
Y prepárate para pasar más tiempo del que parece tomar y obtener mucha más experiencia de la que parece.

¿Estás listo para la misión?

¡Espero que disfrutes el curso y siéntete libre de enviarme mensajes o dejar tus pensamientos sobre la conversación debajo de cada conferencia!

Conoce a tu profesor(a)

Teacher Profile Image

Max Vynnyk

Software Developer

Profesor(a)
Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción al curso: Bienvenidos al curso. Este curso no es un tutorial para enseñarte a ser desarrollador de juegos desde cero. Hay muchos cursos en Internet que puedes tomar para ese objetivo. En cambio, este curso es como una misión en un juego y está diseñado para brindarte una nueva experiencia, herramientas, habilidades de práctica y confianza. Lo hice para ayudarte a subir de nivel como desarrollador de juegos. Este curso se divide en tres secciones. En la primera sección, haremos solo un prototipo funcional del juego. En la segunda sección, haremos que parezca y suene como un buen juego. Y en la tercera, agregaremos menús, ahorro, y otras cosas. No tengas miedo de cometer errores. Durante el curso, verás que los errores son en realidad una forma de obtener un conocimiento y comprensión más profundos. Todo lo que necesitamos es encontrarlo y arreglarlo y prepararnos para pasar más tiempo del que parece tomar. Pero en cambio, obtendrás más experiencia de la que parece dar. 2. S1L0: introducción de la sección: Bienvenidos a la primera parte del curso. En esta parte, vamos a aprender cómo funciona el juego. Mantendremos las cosas simples con precio básico y aún no usaremos música ni efectos de sonido. Comenzaremos haciendo que las bolas se muevan por el camino con la ayuda de la herramienta gratuita llamada creador Baja Pass. Después de eso, crearemos una manera de disparar bolas para que aterricen en el camino. Luego exploraremos cómo disparar, destruir y traer bolas de regreso junto con algunos detalles adicionales. Para concluir esta sección, agregaremos algunas bolas especiales como revólveres, bombas y otras que ralentizan el tiempo 3. S1L1: configuración central de la escena: En esta breve lección, configuraremos los elementos básicos de nuestro juego la pelota, la palabra y el tirador. Empecemos por crear un nuevo proyecto. Utilizaremos la versión 2021, ya que tiene la comunidad más grande en línea y aún recibe actualizaciones frecuentes de soporte. A continuación, seleccionaremos el proyecto MT dos D y la placa. Adaptaremos nuestro juego a los requisitos específicos del móvil después de terminar la lógica principal del juego. Nombraremos el proyecto Eternal Dungeon y haremos clic en el botón Crear El primer paso es ir a la configuración de compilación y asegurarnos de que estamos desarrollando para una plataforma móvil como IOS o Android. Seleccione IOS y haga clic en el botón de conmutación. A continuación, reorganicemos el diseño dos en tres y movamos la vista del proyecto hacia abajo. Este arreglo coloca la escena y las ventanas del juego a la izquierda con el resto a la derecha. Verifiquemos también la resolución. Para este curso, trabajaremos con una resolución específica de 1080 por 1920 píxeles. Podemos ajustar nuestro juego para acomodar otras resoluciones más adelante. Necesitamos ajustar el tamaño ortográfico de nuestra cámara a 9.6 Esta configuración es esencial ya que determina la cantidad de escena que puede capturar la cámara. Quizás te preguntes ¿por qué exactamente 9.6? Eso se debe a que el tamaño ortográfico es la mitad de la altura del área de visualización de la cámara en unidades de palabras Cuando se trata de una resolución D más completa vertical, que en nuestro caso es de 1080 por 1920 píxeles Y con el objetivo de un renderizado perfecto de píxeles o una escala de vista específica, debe calcular el tamaño ortográfico correcto en función de la resolución vertical y los ajustes de píxeles por unidad elegidos. En definitiva, PP. PPU define cuántos píxeles representan una unidad en el mundo de unidades Entonces, si nuestro valor de PPU se establece en el valor predeterminado, que es 100 y la altura de la pantalla es de 1920 píxeles, entonces la mitad de la cabeza sería de 60 píxeles Por lo tanto, nuestras cámaras de tamaño ortográfico deben ser 960/100 es igual a 9.6. Eso es. Guarda la escena, navega a la carpeta since y cámbiala a game. Luego haz clic en Recargar. Primero, cree una nueva carpeta llamada sprites y coloque las imágenes proporcionadas en esta lección en la carpeta Después arrastra cada tipo de imagen a los objetos de la escena individualmente, nombrando cada uno según sea necesario A continuación, cree un objeto vacío y asígnale un nombre tablero. Este objeto manejará la mayor parte de la funcionalidad del juego relacionada con las bolas. Tenemos que asegurarnos de que la pelota y el tirador tengan su propio orden de capas para que la pelota sea siempre sobre el tirador. Ajustemos esto ahora. Vamos a asignar diez a la pelota y cinco al tirador. Voy a crear una nueva carpeta llamada scripts. Luego voy a generar guiones para cada objeto que tengamos en la escena, a saber, pelota, tirador y tablero. Cada script será asignado a su objeto respectivo. Entonces estos son el objeto principal con el que trabajaremos principalmente. 4. S1L2: agrega un creador de rutas: En esta lección, agregaremos el activo creador de pases y aprenderemos a editarlo para crear nuestro pase deseado. Encontremos el componente creador de pases que vamos a usar en nuestro juego. Ya lo he editado, así que solo está el botón open in unity de mi sitio, pero probablemente necesitarías hacer clic en el botón Agregar a mi Evaluar y luego abrir en Unity. Entonces, si tu proyecto de Unity ya está abierto, entonces verás esta ventana de administrador de paquetes. Esperemos hasta que termine de cargar paquetes. Y luego necesitas encontrar el componente BuspsGreator aquí. Haga clic en Descargar. Y luego botón Importar. En la ventana emergente, haz clic en otro botón Importar. Espera a que termine. Entonces verás una nueva carpeta de activos aquí. Vamos a crear un objeto vacío y llamarlo creador de pases. Cuando se crea un objeto vacío, su posición se establece en el centro de la SNU, pero nos será más fácil más adelante si lo ponemos a cero Hagámoslo por el tablero y pasemos los objetos creadores. Y luego para el objeto creador de pases, agregaré un script con el mismo nombre pass creator. Ahora podemos editar ese pase, pero asegúrese de que la herramienta de movimiento esté seleccionada en la parte superior. Podemos cambiar la trayectoria moviendo los puntos de anclaje rojos y podemos ajustar el tobillo moviendo estos puntos de control azules. Puedes conocer más sobre este creador de pases en su página de la tienda ***. Puedes agregar otro punto simplemente desplazando como haciendo clic. Para que el movimiento de estos puntos sea más conveniente, podemos aumentar la escala del mango. Genial. Hemos completado con éxito el pase. Bien hecho. 5. S1L3: mover bolas: Esta lección es para aprender a mover arcos en el camino. Vamos a abrir el guión del tazón. No necesitamos estos comunes porque ya conocemos esa información, así podemos eliminarla. Estoy agregando el campo creador de pases aquí. La función find object of type solo devolverá el creador de pases, objeto que tenemos en escena. Por lo que no necesitamos establecerlo explícitamente y vamos tener flujo público distancia recorrida campo. Y para poder movernos, necesitamos aumentar esta distancia con el tiempo. Entonces en base a ese valor usando pass creator, podemos obtener el punto en el camino. Bien, se mueve. Vamos a crear un objeto vacío y nombrarlo ranura de bola. Entonces crea un guión para ello. Y asignarlo al objeto. Voy a abrir ese guión. Simplemente copia y pega todo el código que teníamos en el guión de la pelota. Arreglando las dependencias. Voy a mover el objeto de bola en el objeto de ranura de bola. Asegurémonos de que la posición esté puesta a cero. Y podemos ver que está funcionando tan bien como antes. Voy a añadir el colisionador circular a la ranura de bola ya que lo necesitaremos más adelante Y ahora podemos ver que nuestra pelota es un poco demasiado grande. El radio del colisionador circular es 0.5. Entonces su diámetro es exactamente un punto la bola de sprites y podemos cambiar el píxel por unidad de valor aquí Puedes jugar con él dependiendo del tamaño del sprite Aquí, 200 funcionarán. Arrastre y suelte la ranura del arco carpeta Assets para convertirla en un prefab Vamos a crear una carpeta de prefabs y ponerla ahí. Voy a instanciar la ranura de proa desde el guión Bar Para eso, necesito una referencia al prefab de ranura de proa. Podemos eliminar ese objeto de la escena. Vamos a tener acceso al cráter pase aquí en el guión de la junta Entonces necesitamos la longitud del camino. A dado que el diámetro de nuestra pared es un punto podemos colocar la parte entera de la longitud número de bolas en ese baño. Entonces, por ejemplo, si la longitud del baño es de 30.5, ahí podremos colocar 30 bolas Entonces para cada uno de ese recuento, voy a instanciar una ranura en cada parte de la ruta Llamaremos a ese método al inicio y vamos a comprobar si está funcionando. Como puedes ver, creó muchas ranuras para bolas, pero parece que se mueven todas juntas en un mismo punto. Para solucionarlo, necesitamos establecer el recorrido de distancia inicial de cada una de ambas ranuras. Cambiemos el tipo de ranura de bola prefiero a la ranura de arco en lugar del objeto de juego. Entonces podemos acceder al campo de recorrido de distancia de la ranura de bola y configurarlo para que sea el índice del iterador Como podemos ver, todos los flotadores de bolas se mueven por separado, pero hay un problema con cada una de las bolas pero hay un problema con cada una de las bolas Para solucionarlo, solo necesitamos eliminar todo el código que dejamos en el script de arco. Ya que movemos esa funcionalidad a la ranura de bola. Comprobemos de nuevo y está funcionando. Se puede ver el pequeño hueco entre la primera y la segunda bola. Vamos a arreglar eso también. Es porque ignoramos esa parte no entera de la longitud de la ruta. Vamos a dividirlo con cada una de las ranuras de arco y la longitud del paso entre dos ranuras sería la longitud de la ruta dividida por el recuento de ranuras. Oh Estamos estableciendo ese valor en dos lugares, así que es mejor moverlo a una variable y usar esa variable en su lugar. Comprobemos de nuevo. Y es perfecto. 6. S1L4: aparición de bolas: En esta lección, haremos pernos atados uno por uno para luego movernos por el camino. También agregaremos animación a ese proceso. Arrastremos el lote de bolas a la stin y le quitemos la pelota. Abrimos prefabricados, retiramos la bola y volvemos. Ahora podemos sacar de la escena el prefabricado de boleta. Comprobemos si no rompimos nada. Simplemente haré clic en cualquiera de la ranura del perno y veré si se está moviendo. Genial. Vamos a aclarar un poco y colocar toda la ranura del perno rallado en un objeto. Estoy creando un objeto vacío y llamándolo contenedor ralentizado. Asegúrese de que su posición esté establecida en cero. Necesitamos una referencia a ese contenedor en el guión de la junta. Y después de instanciar la ranura de proa, necesitamos configurarlo transform parent, ser el contenedor Llenemos ese campo contenedor de las tablas. Y por favor no importa la excepción de mi lado. Es solo por la falta de configuración de plugins. Comprobemos si o cambio funcionó? Para instanciar ambos, necesitamos tener acceso a ambos Vamos a crear de nuevo el objeto bola y convertirlo en un prefabricado Podemos eliminarlo ahora y llenar la bola prefab llena en el tablero Necesitamos acceder a las ranuras de bola en el tablero así que mantengámoslo en una matriz. Eso debería ser entero en lugar de flotar. A Puedes ordenar todos los slots por el campo de distancia recorrida y obtener el primero, que es el más cercano al inicio del camino. Y vamos a instanciar una bola en esa ranura Consulta lo que tenemos. No funciona. Veamos si establecemos un índice adecuado en capa para la pelota ya que la creamos de nuevo. Bien, ahora podemos poner la pelota, pero sólo hay una. Y el problema es que en la ranura de bola, necesitamos restablecer la distancia recorrida. Cada vez se hace más grande que la longitud del pase. Comprobemos de nuevo. Fresco. Ahora vemos que creamos muchas bolas en la misma ranura. Para arreglarlo, necesitamos verificar si la ranura ya tiene una bola dentro. Crearemos un nuevo campo. Será pelota. Y asignamos un tazón recién creado a esta ranura. Hagamos el chequeo para crear un nuevo tazón. Yo ahora podemos ver que todo está funcionando a la perfección. He creado un nuevo campo en el guión de pelota. La bala pública está desove. Hagamos una falsificación, que rastreará el escalado de la pelota En la actualización, iremos a comprobar si la pelota está desove Y aumentaremos ese contador y estableceremos o transformaremos la escala local para que sean Vctors 31 multiplicados por el contador Si ese contador es mayor o igual a uno, nos fijamos es fundar para ser falso. Pongamos el cheque antes de aplicar la báscula. Y agregue aquí una declaración de retorno. También, donde creamos una bola, pondremos desove para que sea verdad Genial. Si ves ese pequeño atisbo cuando creamos una pelota, eso es porque la escala inicial de la pelota es una, así que arreglemos eso Yo genial. Aumentemos la velocidad de escalado. Parece que es un poco demasiado rápido, para que sea más fácil jugar con la velocidad y elegir lo que mejor se adapte a nosotros. Vamos a mover el valor de velocidad al objeto donde podemos almacenar propiedades similares como esta. Posteriormente podremos depurarlo desde el editor. Crea un objeto Idi y asígnale el nombre de las propiedades del juego. Además, estoy creando un guión con el mismo nombre. Asignarlo al objeto. Por lo que la propiedad es bola flotante pública de velocidad de escala. Pongámoslo a ser dos. Necesitamos una referencia a este objeto desde el guión de la bola. Y volvamos a reproducir esa madera con el valor que hemos creado ahora Dacing Genial. Se puede ver que podemos jugar con ese número en tiempo real. Pero por ahora, dejemos que sean dos. 7. S1L5: destruye bolas: Crearemos un objeto al final del camino que destruirá cualquier bola que choque con ella Hagamos que las ranuras de bolas se muevan más rápido y almacenemos el valor de velocidad en el objeto de propiedades del juego como hicimos en la selección anterior. Vamos a revisar. Genial. Así que vamos a crear un objeto destructor de boll. Será un objeto vacío. Vamos a cambiarle el nombre. Para necesitar un colisionador circular a la. Vamos a configurarlo para que sea disparador. Para que sea posible colisionar con la ranura de bola, necesitamos agregar un cuerpo rígido componente a la ranura de bola Vamos a crear un guión de Bol destructor. Asignarlo a este objeto. En el script, necesitaremos en trigger enter a la función, y necesitamos verificar si el objeto con el que hemos colisionado es el adecuado Entonces para eso, necesitamos etiquetar este objeto. Vamos a llevar la ranura de bola a la escena. Haga clic en Tech, agregue Tech, haga clic en el icono más y asígnele el nombre Bol slot. Haz clic en Guardar, selecciona Ranura de bola de nuevo. Haz clic en Tecnología y haz clic en la ranura Bol en el menú desplegable. Vamos a guardar el progreso. Y ahora podemos volver a quitar la prueba de la escena. En el guión. Comprobamos si el objeto colisionado tiene ranura de arco tecnológico usando la función de etiqueta de comparación Si es así, podemos obtener el componente de ranura de pausa de ese colisionador Y comprueba si el Blot tiene pelota. Aquí, simplemente destruiremos el objeto de juego de la pelota. Comprobemos si está funcionando. Voy a acercar el objeto destructor de bolas para que no tengamos que esperar Y genial, está funcionando. Para hacer una mejor animación de destrucción, necesitamos verificar si la pelota está destruyendo. Necesitaríamos otra variable similar a e desove. Pero cuanto más variables de este tipo tengamos, más difícil será mantenerlas. Entonces, la mejor manera es tener una variable de estado que solo diga sobre el estado de la pelota. Así que vamos a crear un script um vacío. Y por ahora, tendremos tres estados desovando a Islat y Reemplacemos la propiedad de desove e con el estado aquí y arreglemos los problemas Tendremos otro caso si el estado está destruyendo. Posteriormente, tendremos más estados, por lo que es mejor manejarlo en la caja del interruptor en lugar de si ande. El caso destructor sería realmente similar al caso abatido Bajaremos de escala en lugar de exclusivo. En el caso destructor, reemplacemos el contador de lujo con el contador de escala descendente H agrega otro valor al objeto de propiedades del juego. Será velocidad de escala descendente de bola. Aquí no cambiaremos de estado, simplemente destruiremos el objeto del juego. Arreglemos problemas en el script bord. También, en guión de destructor de bolas, estableceremos el estado para que esté destruyendo Sin asignar la pelota desde la ranura de la bola. Cheque de Et. Guau. Nos olvidamos de cambiar algo. Entonces en este caso, comprobamos si nuestro contador downscale es menor que cero en lugar de mayor que uno, porque lo hacemos cada vez más pequeño Comprobemos de nuevo. Genial. Está funcionando. 8. S1L6: lanza bolas: Uh, eh. En esta lección, haremos que el tirador dispare bolas. Vamos a crear un método que cambie el estado del balón a tiro. Al mover la pelota del punto A al punto B, también necesitamos recordar la dirección. Entonces necesitamos un campo separado para ello. La dirección se puede pasar desde el tirador usando parámetros del método. Entonces el estado, tenemos que sumar el nuevo tiroteo de estado de pelota. Ahora podemos implementar la caja del switch de estado. Esta será una lógica simple de cambiar la posición a lo largo del tiempo. Vamos a aumentar la posición de transformación de la pelota por el vector de dirección de disparo multiplicado por algún valor de velocidad, que iniciaremos en el sujeto de propiedad del juego. Y por supuesto, tenemos que multiplicarlo por de vez en cuando. Ahora podemos ir al guión del tirador. Consigamos la dirección del tiroteo. Para conseguirlo, necesitamos una posición del tirador. Podemos conseguirlo simplemente llamando a posición de transformación y necesitamos la pestaña de pantalla táctil o la posición de clic del mouse. En este método, obtendremos la carta de esta manera. Además, no necesitamos ese valor de acceso, por lo que establecer cero puede facilitar nuestros cálculos. Una referencia a la cámara principal se puede utilizar en la función de inicio. Es mejor para el desempeño. Entonces la dirección de disparo es la posición del ratón menos la posición de transformación. Esta fila hará que el objeto tirador vea en la posición del mouse o en la dirección de la pestaña. Podemos mover esta lógica a un método separado para mantenerla limpia. Ahora podemos trabajar en generar una bola que vamos a disparar. Ya tenemos lógica similar en el script del tablero, así que lo movería a un script separado y lo reutilizaría en lugar de simplemente copiar y pegar. Esta también es una buena práctica. Como es habitual, comenzará a partir de una fábrica de moles de objetos vacíos. Después crearé un script con el mismo nombre, pero sin espacio en blanco y lo asignaré al objeto. Al igual que en el guión de boll, necesitamos una referencia al prefabricado de bolas Este método tomará un vector de tres puntos como parámetro y creará una bola sobre él. podemos volver a nuestro guión de tirador Ya podemos volver a nuestro guión de tirador y usar la fábrica de bolas. Tenemos que recordar una pelota que nos estamos preparando para estar rodando. Entonces voy a crear un campo aquí, y estaremos creando otra bola sólo si no se establece esta referencia. Entonces, una bola por disparo. Por último, podemos verificar si ocurre un clic o un toque de pantalla táctil, y luego disparamos la pelota. Para eso, nuevamente necesitamos una dirección, pero esta vez, debería normalizarse. Esto significa la misma dirección pero en alcance de un cuadrado 0-1 Entonces podemos simplemente finalmente llamar al método de disparo de la pelota y despejar la referencia, voy a empezar a preparar otra pelota. Todavía tenemos que hacer algunos cambios desde el editor de Unity en la fábrica de boll Llenar el campo prefabricado de bolas. Y podemos cambiar la lógica de instanciación de bolas a nuestro nuevo uso de fábrica de boll Ya no necesitamos preferencia aquí. Ahorro. Vamos a ver cómo funciona. Oh, no, rompimos algo. Pero lo bueno es que el tiro de pelota funciona como se desea. Veamos qué pasa. La lógica de mover bolas alrededor del tablero está en los guiones de la palabra y bol. ¿Qué hemos cambiado en el guión de la junta? Si comparas la instanciación, podemos ver que antes estábamos creando bolas en la transformada de punto de ranura cero, pero ahora estamos usando solo posición de transformación de ranura cero Entonces, para arreglar eso, necesitamos establecer el padre de la transformada de bola en transformada de punto de ranura cero. Vayamos a verificar si la solución está funcionando. Fresco. Hay una cosa más que vamos a hacer en esta lección. Atrapa un momento en el que nuestra bola de tiro choca con cualquier bola en el camino Al igual que con el destructor de bolas, hoy podemos usar el disparador on enter Ahora comprobando si el objeto colisionado tiene una plataforma de ranura para tazón. En caso afirmativo, entonces usando la función Obtener componente, podemos usarlo como ranura para tazón. Entonces podemos verificar si no está vacío, y si es así, vamos a sacar algún mensaje. Cheque. Todavía no. La razón es que el prefabricado de bola no tiene un planeador circular para Entonces vamos a agregarlo y convertirlo en un disparador. Comprobando de nuevo. Podemos ver la salida incluso antes de disparar cualquier bola, y esto no es lo que se esperaba. Averiguemos qué pasa. Si le echas un vistazo a la ecuación aquí, no se comprueba si una de las dos bolas colisionadas es la bola de tiro Simplemente se activa cuando chocan dos bolas de hermanos en el pase Entonces voy a añadir ese requisito. Chequeo final. Genial. Se puede ver que a veces choca con dos bolas a la vez, pero no te preocupes Eso está bien. Y está funcionando como se esperaba. 9. S1L7: agrega diferentes colores: En la lección, agregaremos colores de bola roja y verde. Similar al estado del balón en las lecciones anteriores, vamos a crear otro um llamado tipo bola. Por ahora, tendremos bolas rojas, verdes y azules. Voy a añadir un tipo de campo al guión de bola. Y en el guión de fábrica de bolas, tendremos un método que crea un arco aleatorio en la posición dada. Estoy empezando por crear una matriz con todos los tipos de bolas disponibles. Le voy a nombrar colores. Rojo, verde, azul. Puede ser estático y rojo solo ya que no lo vamos a modificar. También, necesitamos referencia a sprites de bola. Este método ahora debería aceptar el tipo de bola como parámetro. Vamos a establecer el tipo de campo de una pelota. Y aquí necesitamos obtener el componente de render de sprite y establecer el sprite correcto Por ahora solo estableceré el sprite azul, pero vamos a crear un método que devuelva sprite basado en el tipo de bola Ahora podemos usar el método. Necesitamos una funcionalidad que cree una bola aleatoria. El método será muy similar al existente. Podemos usarlo en su interior. Pero tenemos que escoger un tipo de bola al azar. Estoy creando otro método privado. Aquí, asegúrate de impartir un motor aleatorio de Unity. Básicamente, solo elegimos un elemento aleatorio de la matriz, y ahora podemos llamarlo aquí. Reemplacemos el uso del método antiguo por uno nuevo. Parece que podríamos ser privado, así que no es visible fuera de la clase. Vamos a arreglar eso. Sustitución de métodos en tablero y guión de tirador. Lo terminamos con el bacalao. Ahora me estoy cambiando al editor de Unity. Vamos a mover este destructor de bolas hasta el final del camino. Lo último que tenemos que hacer es establecer los campos de precios de la fábrica de bolas. Y comprueba los sprites pixel por unidad de valor. Al inicio de la sección, cambiamos el valor del sprite de bola azul a 200 Entonces su tamaño equivale exactamente a una unidad. Podemos ver cómo se ve si no cambias eso. Entonces tenemos que hacerlo. Compruébalo de nuevo. Perfecto. 10. S1L8: bolas de tierra: Ayudemos a aterrizar las bolas de tiro. Comenzaremos agregando dos nuevos estados de bola, ranuras de aterrizaje e interruptor. En el script de jabalí, vamos a crear un método que se encargue del aterrizaje Necesitaremos conocer referencias a la ranura del colisionador y a la bola de aterrizaje Sería bueno tener todas las ranuras ordenadas por distancia aquí. Podemos simplemente copiar y pegar esta parte de una línea desde arriba por ahora. Y aquí necesitamos conocer el índice de la bola colisionada. Entonces encontremos el índice de la primera ranura vacía después de la ranura de bola colisionada Cuando la pelota de tiro aterriza, todas las bolas que están frente a la línea deben ser empujadas por una ranura hacia adelante. Podríamos simplemente tomar el primero y el último de ellos. Pero en caso de que haya una brecha entre ellos, necesitamos averiguar bien el índice de la última ranura que no está vacía o el índice de la primera ranura vacía. Simplemente iremos paso a paso y verificaremos si una ranura tiene una bola en ella. Si no es así, entonces recordaremos el índice y detendremos el bucle. Pero vamos a pasar esto a un método separado. Y como buena práctica, si no existe tal índice, volveremos menos uno. Tenemos los índices. Entonces ahora, cambiemos todas estas bolas por una ranura hacia adelante. Es más práctico hacerlo en orden inverso porque una ranura después de la última siempre estará vacía Aquí, deberíamos tomar una ranura por índice y poner una bola de la ranura anterior ahí dentro. Pero también tenemos que asegurarnos de que esta bola ya no se asignará a la ranura. Sería genial tener un método que manejara esta lógica. Voy a crear dicho método en los scripts de slot. A necesitaremos También necesitaremos una referencia a una ranura de un guión de bola. Entonces usemos este nuevo método. Y. Después de eso, tenemos que decidir qué queremos hacer con nuestra bola de aterrizaje. ¿Debería aterrizar antes o después del colisionado? Podemos hacerlo de esta manera usando la distancia más cercana a lo largo del camino. Devuelve una distancia en la trayectoria de cualquier punto de proyección a la misma. Entonces no esta y tampoco esta , sino la más cercana. Entonces, si la distancia recorrida de la bola colisionada es menor que la distancia proyectada de la bola de aterrizaje, entonces es mejor poner esa bola de aterrizaje antes que la colisionada De lo contrario, empujaremos la bola colisionada una ranura hacia adelante y colocaremos la de aterrizaje después de ella. Lo que hemos hecho es que acabamos asignar todas las bolas a las ranuras donde deberían estar. Ahora necesitamos moverlos físicamente ahí. Primero, vamos a crear un método de tierra en el guión de la pelota y llamarlo para la bola de aterrizaje. Será sólo un cambio de estado. Para el resto de las bolas, las bolas que no están aterrizando y desove, necesitamos crear otro, pero un método muy similar, pasar a la ranura Y también llamarlo para ellos. Y. Y agregaremos estos casos de fecha. Pero primero, llamemos a esa palabra y método de pelota. Lo llamaremos desde aquí. Necesitamos una referencia a la junta. Entonces el colisionador ranura esta bola. Volviendo a las cajas del interruptor. Estoy generando todos los casos de switch faltantes, pero voy a dejar sólo dos de ellos. Podemos usar torres vectoriales de tres movimientos para mover gradualmente la bola de aterrizaje a su ranura. Et puso cinco aquí como valor de velocidad y posteriormente lo trasladaremos a las propiedades del juego. Ahora, como de costumbre, necesitamos verificar si nuestro objeto está lo suficientemente cerca de su posición objetivo para que podamos terminar el aterrizaje. A pero tenemos que asegurarnos de que actualizamos el campo padre de la pelota transformar la pelota se moverá junto con la ranura. El caso de ranuras de conmutación será muy similar. Volviendo al guión de la barra, necesitamos colocar el nuevo método de asignación de pelota. En todas partes asignamos una pelota a una ranura. La búsqueda nos ayudará a encontrar el resto de esos lugares. Además, movamos esta fila a un método separado. Sustituyendo esta línea dos, supongo que es momento de comprobar lo que tenemos. Y tenemos algunas excepciones. Si mantienes un control o comando en Mac y haces clic en el enlace aquí, se abrirá el script justo donde se ha producido el error. Olvidé utilizar las palabras referencia. Ahora bien, funciona, pero no mueve otras bolas. La ecuación de bucle es incorrecta. Es mejor, pero a veces mueve una pelota que no debemos mover. Puede que arregle o no el problema, pero necesitamos manejar un caso que choquemos dos bolas a la vez Para solucionarlo, necesitamos desactivar el colisionador de bolas disparadoras cuando la pelota no está volando Intentemos si eso ayuda. No, necesitamos encontrar otra razón. Ya que está moviendo una pelota extra, entonces los problemas deberían estar en alguna parte de aquí. Se suponía que íbamos a mover bolas que van después de la colisionada, pero este bucle aún puede agarrar un índice de los colisionados. Vamos a arreglar eso. A 11. S1L9: destruye los mismos colores: Uh, eh. En este video, haremos que tres o más bolas coincidentes destruyan. Aquí, justo al final del método de la pelota terrestre, llamemos a una rutina, que crearemos pronto. Esta rotine destruirá tres o más bolas coincidentes en una secuencia Hagamos que espere hasta que las bolas estén listas. O el lote no tiene balón o el balón está en buen estado. Veamos cómo funcionaría. Necesitamos un parámetro de entrada aquí para encontrar bolas de hermanos a la que se aterriza Podemos pasar la ranura de bola aterrizado. Consigamos un índice de esta ranura. Estaremos buscando las bolas que necesitamos destruir, necesitamos alguna lista para mantenerlas ahí. Voy a crear dos bucles. El primer bucle irá hacia atrás hasta el inicio de la matriz de distancia basada en la ranura de bola, y el segundo irá al otro lado de la matriz. En estos bucles, buscaremos bolas que coincidan con la aterrizada, y en cuanto nos encontremos con una pelota equivocada, el bucle debería detenerse. El primero irá directamente desde la ranura después de la aterrizada y debe detenerse al menos al inicio de la matriz. Tenemos que asegurarnos no sumar la misma bola dos veces. Hagamos esta comprobación. Aquí, exigimos que el balón sea del mismo tipo que el aterrizado. Por último, sumando la pelota al array, si las condiciones están bien. De manera similar, debemos buscar las bolas en otra dirección. Después de recoger todas las bolas que deberían ser destruidas, podemos invocar la función de destrucción Pero primero, necesitamos crear un método para ello. Vamos al guión del balón. Esta vez, nuevamente, el método hará solo un cambio de estado. Y la fecha ya está implementada. Podemos retroceder e invocar este método. Además, necesitamos despejar la ranura de la bola. Comprobemos el cambio. Tenemos un problema. Aquí, cuando comprobamos si la ranura del tazón esa bola es del tipo adecuado, también necesitamos asegurarnos de que la ranura tenga la bola para que no sea nula. Y podemos detener la iteración si nos encontramos con la primera bola que no se ajusta a nuestros criterios. Comprobemos de nuevo. Aquí tenemos otro problema. Veamos qué pasa. Tenemos que verificar si la cantidad de las bolas coincidentes es mayor o igual a tres. De lo contrario, destruiría bolas aunque solo tengamos dos partidos. Además, como puedes ver, no funciona cada vez. Averiguemos la razón por la que. Probablemente, se nos olvidó agregar la bola de aterrizaje a los partidos. Y parece que incrementamos donde deberíamos haber decrementado Arreglemos eso e inténtelo de nuevo. Bien, está funcionando muy bien. Nos vemos en la siguiente lección. 12. S1L10: refactorización de la sección media: Vamos a conseguir nuestro código un poco más limpio. Primero, comenzaré quitando los troncos no utilizados. Además, ID sugiere factorizar esta línea. Podemos mover este código de búsqueda a otro método. También voy a poner un salto de línea aquí para que sea más legible. Todos estos códigos, también puedo pasar a un método separado. Una sugerencia más del ID es hacer modificadores de acceso explícitos También podemos eliminar estas dependencias no utilizadas. Se puede ver que están calificando si no se utilizan. Y este valor, podemos pasar al objeto de propiedades del juego. Y finalmente, podemos reescribir estas condiciones para que la estructura sea más plana 13. S1L11: mueve las bolas separadas hacia atrás: Después de destruir las bolas coincidentes, necesitamos eliminar la brecha y mover algunas bolas hacia atrás. Después de destruir y antes de mover las bolas separadas hacia atrás, necesitamos poner una pausa. 0.5 va a estar bien. Crearé un método privado de bolas separadas por movimiento vacío y lo llamaré justo después de la pausa. Lo que vamos a hacer es averiguar cuántas ranuras vacías hay entre el grupo de bolas y mover todas las bolas del grupo A a esas ranuras. Para ello, primero, en ranura de boll por distancia, podemos encontrar un índice de una primera ranura que está vacía Y segundo, podemos encontrar dónde termina esta secuencia de ranuras vacías. La primera ranura no vacía de la matriz. Pero a partir del índice previamente encontrado. Aquí está el número de ranuras vacías entre dos grupos de bolas. Ahora, vamos a mover bolas del segundo grupo a estas ranuras. El bucle inicia desde la primera ranura vacía y va en la dirección del final de la matriz, pero acepta el número de slots vacíos ya que van a estar vacíos. Esa parte de la matriz deberían ser nuestras ranuras vacías. Entonces necesitamos otro para ellos. A, pasemos a slot de cada bola que estemos moviendo. Comprobando el resultado. Tenemos algún error. Veamos de qué se trata. Tenemos que verificar si la ranura tiene una bola antes de llamar a su método. Vuelve a registrarte. Otro problema. Aquí, tenemos que asegurarnos de que realmente tenemos la brecha entre dos grupos de bolas. Si no hay ninguna ranura vacía, algunos de estos índices serán menos uno ya que no se encontrarán. Bonito. Parece que está funcionando, pero tendremos que arreglar un pequeño problema de animación. Como podemos ver, cuando las bolas se mueven a sus posiciones objetivo, se están moviendo fuera de la pista. Esto se debe a que estamos usando Torres de tres movimientos de Vector, lo que hace que las bolas se muevan directamente a sus puntos y en caso de ángulos, simplemente se están cortando. Lo que podemos hacer para arreglar eso es hacer que las bolas muevan por el camino como lo hacemos con las ranuras de bol. Vamos al guión de pelota y agreguemos campo de recorrido de distancia. También, necesitamos una referencia al creador del pase. Y aquí, donde le decimos a una pelota que se mueva a la ranura, necesitamos utilizar el campo de distancia recorrida. Como hicimos antes, usando esta función, podemos obtener la distancia recorrida en función de la posición actual de la pelota. Pasemos al manejo estatal y actualicemos la lógica aquí. Tenemos que mover la pelota hacia su ranura a lo largo del camino. En caso de que cuando la ranura esté más lejos que la pelota, solo podemos aumentar la distancia recorrida en el campo hasta que la pelota llegue a la ranura. Pero en otro caso, donde la ranura está en el otro lado, lo que significa que la distancia recorrida campo es menor que la que tenemos para la pelota, entonces necesitamos disminuir ese campo de la pelota. Entonces básicamente, si quieres que la pelota llegue a su posición de lote, en primer caso, necesitamos sumar algún valor positivo al campo de distancia recorrida de la pelota y en el segundo caso, necesitamos restar algún valor, lo que significa sumar algún valor negativo Podemos expresar la dirección en la que movemos la pelota esta manera y simplemente podemos multiplicar el delta que estamos sumando por esta dirección. Vamos a mover el valor de la velocidad a las propiedades del juego. Entonces para la posición de la bola, simplemente podemos usar Get boot a distancia. Y para comprobar si la pelota está lo suficientemente cerca de su ranura, podemos usar esta expresión. Vamos a revisar. Genial. 14. S1L12: movimiento → ciclo de destrucción: Hagamos que el juego se repita, destruyamos y retrocedamos ciclo hasta que no queden bolas coincidentes cerca de la pelota aterrizada. Voy a mover todo este código para hacer Wil Loop. Este bucle hace una iteración. Después comprueba la ecuación y con base en el resultado, se detiene o se repite de nuevo. Necesitamos saber cuándo parar, y vamos a detener el bucle cuando no haya suficientes bolas coincidentes para destruir. Voy a sacar esta definición del bucle para que sea posible acceder a la lista en el bucle condicional. Aquí podemos establecer un valor a esta variable. Nuevamente, comprobamos si había algunas bolas coincidentes pero no menos de tres. También en cada iteración, cambiará la bola con la que comparemos otras bolas, por lo que necesitamos otra variable para ello valor inicial será la ranura de bola aterrizada, y asegurémonos de que después de una iteración, todavía tengamos tal bola La idea sugiere revertir este bloque. Hará que el código sea más sencillo y plano. Entonces, después de destruir la bola coincidente, podemos establecer un nuevo valor para la ranura de bola colisionada Puede resultar confuso, pero será la primera ranura de esta lista. El caso es que después de que destruimos bolas en esas ranuras, esas ranuras se vacían. Entonces retrocedemos bolas que estaban frente a las destruidas. Así que la ranura de bola colisionada no vuelve a estar vacía, y podemos usar su nueva bola para compararla con ella Y si no hubiera bolas después de las destruidas, la ranura simplemente estará vacía. Para cubrir este caso, vayamos al método get similar balls y hagamos un cheque. Además, asegurémonos de que siempre devuelva resultados ordenados por la distancia recorrida. Y estamos listos para comprobar cómo funciona. Así que estamos listos para irnos. 15. S1L13: agrega bolas especiales: Hagamos una base para unas bolas especiales que vamos a agregar en las próximas conferencias. Por ahora, habrá tres de ellos. Bombardear cuando explota, destruye una o más bolas de hermanos. Revertir cuando explota hace que la pelota se mueva hacia atrás durante unos segundos. tiempo lento hace que las ranuras se muevan al 50% de la velocidad durante unos segundos. Comenzaremos agregando campos para tres nuevos sprites en el script de factor bola Si estás usando Credr, puedes presionar Control y D o comentar y D en Mac para duplicar la línea, y luego simplemente puedes cambiar el nombre del campo Necesitamos agregar nuevos tipos de bolas en el tipo de bola NM. Volviendo a la fábrica de bolas, vamos a crear una matriz que enumera todos los tipos de bolas especiales. Este método debe renombrarse para tener más claro qué tipo devuelve y podemos crear uno similar pero con tipos especiales Teniendo estos dos métodos, voy a crear el método Get Random ball. Nuevamente, pero ahora en algún porcentaje de los casos, devolverá un tipo especial. Entonces esta parte fija un valor aleatorio 0-1, y solo los valores que son mayores que 0.2 llevarán a devolver un tipo de color normal Esto básicamente sucederá en el 80% de los casos porque el 80% de los valores 0-1 son mayores que 0.2 Por lo que el 20% restante de los valores dará como resultado que se devuelva un tipo de bola especial. Usando la sugerencia de ID, estoy generando casos adicionales para que el bloque de switch devuelva sprites adecuados Hay un archivo con nuevo Sprite adjunto a esta lección Vamos al editor de Unity y agreguemos los nuevos archivos a la SprizFolder Después de eso, los asignaremos al objeto de fábrica Bol. Ahora, vayamos al Br Script y llamemos a nuestro nuevo método aquí. Además, aquí en el método get similar donde comparamos bolas por tipo, necesitamos hacer actualizaciones para soportar los nuevos tipos de bolas. Para ello, voy a crear un muro guion Util. Esta clase de utilidad será una estática publicada. Y vamos a tener un método para obtener color por tipo. Este método tomará un tipo negrita como parámetro y devolverá su color correspondiente como un valor num de tipo negrita. Básicamente, será un bloque de interruptores. Para los casos de color, solo devolveremos los mismos noms Pero para los tipos especiales, devolveremos sus colores. Podemos volver al método get similar bowls y usar una nueva utilidad aquí. Sólo voy a poner un salto de línea para alinear este código. Ahora podemos copiarlo pasarlo al segundo blog. Supongo que ya podemos probarlo. El problema de escala se puede resolver actualizando el valor de píxel por unidad de los nuevos sprites. Podemos ver que para los sprites de color normales, hemos establecido 200 Vamos a establecerlo para estos dos. Y aquí encontramos otro problema que no está relacionado con la actualización de este video, pero estaría bien solucionarlo. Primero, necesitamos desactivar el disparo de bolas por un periodo de tiempo en el que destruyamos bolas coincidentes. Entonces eso nos salvará de interferir en el proceso de destrucción. Para implementarlo, vayamos al script bore y agreguemos aquí un valor, que será falso por defecto. Ahora podemos configurarlo para que sea cierto al inicio de nuestra rutina. Y aquí, al final, esperaremos hasta que todas las bolas en pista, terminen sus ranuras de conmutación funcionen. Para que podamos volver a poner el campo a caídas. Por último, en el guión del tirador, necesitamos una referencia al tablero. Aquí, donde manejamos el clic de disparo, podemos usar el campo para asegurarnos de que sea falso. Ya podemos probar. Esto no ha arreglado completamente la espalda porque si haces clic dos veces realmente rápido, aún puedes disparar esta bola de tining Pero este comportamiento es aceptable por ahora, por lo que podemos arreglarlo más tarde y concentrarnos en las bolas especiales. Nos vemos en el siguiente video. 16. S1L14: agrega una bola tipo bomba: Un bache cuando explota destruye una o más balones civiles. En primer lugar, tenemos que comprobar si hay un poste de bache entre las bolas que vamos a destruir. Podemos hacerlo así. Entonces tenemos que averiguar qué bolas puede destruir la bomba. Entonces primero, encontraré un índice de amp ball en la matriz global. Por ahora, vamos a destruir una bola antes y una bola después de la bomba. Podemos hacer que sea un bucle y mover la radio bomp a una variable Índice de una ranura después del bache, solo lo nombraré índice izquierdo porque está en el lado izquierdo del bache si mira desde el borde de la pantalla. Y el índice del anterior la bomba será el índice correcto. Para los índices, necesitamos verificar si son válidos, por lo que no son menores que cero o mayores que el índice de la lista de matriz ordenada. Además, tenemos que asegurarnos de que este lote no esté vacío y que no tengamos ya este lote en nuestra lista de destructor Si todo está bien, entonces podemos agregar esta bola a la lista. Y la lógica muy similar que tendremos para el índice correcto. Podemos mover la bomba reducir valor a las propiedades del juego. Vamos a agregarle una referencia en el script de Bar. Ahora podemos usarlo aquí. Además, para hacer cada método más corto y limpio, debemos mover la lógica a un método separado. Vamos a probar. Genial. También podemos ver un error cuando las bolas llegan al final del camino, pero no debemos preocuparnos por este error porque más adelante haremos que el juego detenga cuando una pelota llegue a ese punto. Así que vea en el siguiente video, 17. S1L15: agrega bola de tipo inverso: Bien. Al revés, cuando explota hace que la pelota se mueva hacia atrás por unos segundos. Como en el video anterior, comencemos de verificar si hay una bola inversa en la matriz de destrucción. Desde esta época, no sólo se trata de agregar más bolas a la matriz de destructores, sino de cambiar el flujo de las bolas, necesitaremos una rutina de autos Voy a crear uno llamado Start reverse Co. Yo solo lo llamaré aquí para que no nos olvidemos después. Solo para estar seguros, nos aseguraremos que no pase nada específico cuando iniciemos esta carotina y no ensucie un flujo Por lo que esperaremos hasta que termine cualquier bola coincidente que destruya. Y todas las ranuras deben estar vacías o las bolas no deberían estar en lugar de aterrizar y no en lugar de cambiar ranuras. Para este flujo, necesitamos otro campo, reversa. En este punto, se hará realidad. Déjame generar este campo faltante. Entonces creó un campo aquí. Vamos a moverlo arriba a un campo similar. En la forma como hicimos que las bolas se movieran hacia atrás. En el video anterior, puedes voltear la dirección de las ranuras introduciendo un campo de dirección. Será uno por defecto. Tenemos que agregarlo aquí también. Entonces volvamos a nuestra rutina. Podemos crear un bucle y cambiar una dirección a menos uno para cada ranura de bola. Ahora esperaremos 2 segundos. Ahora pondremos la dirección de las ranuras y finalmente pondremos I reverse a caídas. Vamos a revisar. Un problema aquí. En este método, debemos hacer un cheque para I traseros y dejar de producir bolas También en ambas ranuras, donde cambiamos distancias en algún momento en el tiempo, puede convertirse en un valor negativo, que como pudimos ver, mueve las ranuras al otro extremo del camino. Entonces, para arreglarlo, tenemos que verificar aquí. Verificamos si la dirección es negativa y la distancia recorrida es menor a una. Entonces está lo suficientemente cerca del inicio del pase, y finalmente, la ranura no está vacía, entonces podemos empezar a destruir método aquí. Pero primero, si la pelota está realmente cerca del punto cero, es posible que la pelota no desaparezca lo suficientemente rápido hasta llegar a cero. Podemos comprobar si la distancia es menor que, por ejemplo, 0.5, entonces solo podemos destruir la pelota manualmente. De lo contrario, sólo podemos llamar a comenzar a destruir de la pelota. Y en cualquier caso, eventualmente, necesitamos despejar la ranura. Otra cosa que tenemos que hacer para cada ranura es que cuando la distancia recorrida alcance un valor negativo, entonces simplemente la pondremos a la longitud pasada, que está en su último punto. Volvamos a revisar. Es bueno por ahora. Solo movamos esta duración inversa a las propiedades del juego para mantener limpio el pelaje. Eso es. En el siguiente video. 18. S1L16: agrega bolas de tipo lento: tiempo lento hace que las ranuras se muevan al 50% de la velocidad durante unos segundos. Simplemente voy a copiar este bloque, pero cambiaré el tipo de bola a tiempo lento. Además, aún no lo hemos creado, pero llamemos a un cotin aquí con el nombre time slow co. Ahora, realidad vamos a crear esta orotina Será muy similar al reverso, así que sólo voy a copiar estos dos. Voy a quitar estas líneas aquí necesitamos para asegurarnos de que las orejas sean falsas. Aquí cambiaremos el valor de dirección a 0.5 y después de que termine el efecto lento de tiempo, lo restableceremos a uno. Vamos a las propiedades del juego y creamos un campo de duración lenta en el tiempo. Ahora podemos usar este campo. También, podemos ver que hay algo mal con el campo de dirección aquí. Esto se debe a que actualmente su tipo es un entero, vamos a arreglarlo. Pero antes de eso, debemos cambiar el nombre de este campo a multiplicador de velocidad porque va a ser más claro y cambiar el tipo a flotar. Ahora debemos actualizar este nombre de campo donde quiera que lo usemos. Y por último, podemos probar cómo funciona. El tiempo lento funciona como lo queremos, pero a veces podemos ver que no se está cerrando un hueco después de las bolas de dsteroide Pero nos centraremos en este error en el siguiente video. Debo decir que muchas veces podemos descubrir algún error de juego que no hemos previsto, y nos hace decidir ¿qué debemos hacer para solucionarlo? Y en algunos casos, la forma más fácil de evitar ese error es introducir una nueva regla de mecánica de juego que no impactará drásticamente la experiencia del usuario, sino que resolverá el problema De esta manera, podemos agregar una restricción más que nos ahorrará mucho tiempo. Desactivemos el disparo de pelota cuando cualquiera de los dos reversos sea cierto. De esta manera podríamos evitar muchos casos complicados cuando el aterrizaje ocurre cerca del inicio del camino, y eso es todo para este video. En la siguiente. 19. S1L17: refactorización de secciones y corrección de errores: Terminemos la sección con un poco de limpieza. Primero hagamos una pequeña limpieza. En ambos guiones, esta parte se repite, por lo que podemos moverla a un método separado. Vamos a llamarlo lugar en la transformación de ranura. Para que podamos reemplazarlo aquí también. En negrita guión destructor, podemos invertir este I bloques Siempre agrego corchetes aquí para que los operadores de retorno sean más visibles. En negrita, podemos revertir esta I. En script shooter, podemos agregar estos modificadores de acceso explícitos para iniciar y actualizar métodos Ahora arreglemos eso de nuevo. Podemos ver que a veces después de destruir algunas bolas coincidentes, otras bolas no se mueven a posiciones vacías. Esto sucede porque aquí, cuando buscamos un primer índice vacío, a veces devuelve cero porque en algún momento, la ranura cero está vacía y una bola nueva que se va a generar pronto aún no está asignada a esa ranura. Entonces, en lugar de un hueco aquí, terminamos moviendo todas las bolas por una ranura hacia atrás para cubrir la primera. Podemos arreglarlo solo por comenzar o buscar, no desde cero sino desde uno. Eso es todo para este video. Buen trabajo. 20. S2L1: agrega nuevos sprites: Añadiendo nuevos sprites para el fondo, las paredes y el tirador. He adjuntado algunos sprites nuevos a esta lección. Vamos a cargarlos, y ahora podemos importarlos a nuestra carpeta Sprite simplemente arrastrándolos a ella. Ahora, comencemos nuestra actualización de sprites grises desde el fondo Entonces el tirador. Entonces podemos dar click en la fábrica de Bolas y reemplazar a Sprite ahí Para que podamos comprobar lo que tenemos. Primero, podemos ver que el sprite de bola es demasiado grande. Puede probar diferentes valores en el píxel por unidad de entrada. Por ejemplo, si pones 200, veremos que es demasiado pequeña y la forma más rápida de averiguar qué valor necesitamos es llevar una pelota prefab a la escena, acercar y cambiar su sprite Así podemos ver su tamaño comparado con el colisionador circular con el tamaño Entonces de esta manera, encontraremos el valor. En nuestro caso, será de 135. Seleccionaré todos los nuevos sprites de bola y actualizaré su píxel por unidad a 135 Así que ahora podemos sacar este objeto bola de la escena. Volvamos a correr. Genial. Vamos a continuar. Podemos ver que el tirador no se ve bien. Vamos a moverlo al centro de esta plataforma de fondo. Además, me gustaría que las pelotas aparecieran no en el centro del tirador sino de esta parte. Podemos agregar un objeto vacío como hijo del tirador y ahí podremos generar bolas. Se le puede nombrar punto de disparo. Para ese objeto, estoy agregando un nuevo campo en el guión del tirador, y podemos usarlo aquí. Aumentaré el orden de los tiradores en capa, por lo que será sobre una bola de tiro. Asignemos el campo del punto de disparo y lo probemos todo. Y tenemos que mover este punto de rodaje hacia arriba. Veamos qué tenemos. El balón no se mueve junto con el tirador así que necesitamos que sea un hijo del tirador. Pero podemos ver que necesitamos despejar el valor padre justo después de que se haya disparado el balón. En otra vez. Fresco. Nos vemos. 21. S2L2: sprites de bolas activadas: Mejoremos la experiencia del jugador reemplazando el sprite de tazón normal por activo De la misma manera que para los sprites regulares, necesitamos un conjunto de campos para sprites activos Simplemente voy a copiar estos y renombrarlos. Además, necesitamos un método como este. Pero vamos a usarlo desde fuera de esta clase, así que deberíamos hacerlo público. Ahora podemos ir a la bola Script y crear un método que cambiará el sprite de perno Para acceder al sprite de bola, necesitamos una referencia al render de sprite Y en el método, simplemente establecemos el sprite en uno nuevo. Vamos a abrir el guión del tablero, ir a destruir bolas coincidentes ir y mover este código a un método separado que tendrá el nombre destruir todas las bolas en la lista. Aquí en la primera línea del bucle, llamemos o actualicemos el método Sprite Para acceder a la fábrica de boll desde este método, el método no debe ser estático Usando la fábrica de bolas, podemos obtener un nuevo sprite para la pelota. Bueno. Ahora podemos cambiar al editor de Unity. Vamos a poblar nuevos campos de spride. Y estamos listos para probar. Primero, sería mejor modificar o destruir animación para dejarnos ver mejor el precio activado. Podemos ir a la bola destruyendo el caso del interruptor. Aquí en cada actualización, disminuimos o bajamos el contador en algún valor pequeño Vamos a llamarlo substrhand cómo podemos hacer la mano de pelota se vaya más larga por algún tiempo y luego comenzar a desaparecer Podemos tomar el subsuelo y hacerlo aún más pequeño por algún tiempo Entonces podemos tener otra variable que si el contador downscale es mayor que 0.5 será 0.1, y de lo contrario, será uno Y podemos multiplicar el susahand por este valor. Como resultado, dado que el subsahand será diez veces menor hasta que el contador de downscale alcance 0.9, el contador de downscale disminuirá diez veces más lento por Veamos cómo funciona esto. Podemos ver que el valor 0.1 da como resultado una velocidad demasiado lenta. Entonces cambiémoslo a 0.3. Además, hagamos que la pelota aterrizada tenga la misma rotación que otras bolas en la pista. Comprobando. Bonito. 22. S2L3: sprite activo para disparar: Similar a la lección anterior, reemplazaremos el sprite tirador por uno activo Tenemos que dividir el estado de desove en dos, desove en pista y desove Y cuando una pelota termine de desovar para disparar , estará lista para disparar Esto nos ayudará a establecer diferentes sprites de tirador basados en el estado de la bola de tiro Arreglemos el código después de cambiar el nombre del estado que responde. Así que el primero juega en la palabra. Puedes ver estas marcas rojas en la barra de desplazamiento. Indica que una línea tiene un error. Siguiente en negrita. Esta vez, otros errores fueron causados por el primero. Ahora podemos ir al guión del tirador y agregar dos campos para sprites activos e inactivos Yo también, es mejor cambiar cómo tirador y tablero dependen el uno del otro. Voy a quitar una referencia al tablero. Actualmente, el tirador comprueba siempre que el tablero está revés o el tablero que destruye las bolas coincidentes son falsas o verdaderas. Pero podemos simplificar esto proporcionando un nuevo campo en el guión de tirador. Está discapacitado el tirador desde el exterior. Agregué desde fuera de la parte para subrayar que vamos a establecer este campo solo desde fuera del guión de los tiradores Entonces ahora podemos usar este campo aquí. Y necesitamos un método para actualizar el orgullo de los tiradores. Para cambiar el sprite, necesitamos una referencia de render de sprite. Entonces, si no está deshabilitado, será sprite activo, de lo contrario, inactivo Además, tenemos que verificar si la siguiente bola está lista para disparar para poder agregar una función de flecha aquí. Y tenemos que considerarlo en el método Update Sprite. Ahora en realidad podemos llamar a este método Updates Pride en cada actualización. También aquí, cuando creamos otro lanzamiento de cerrojo, necesitamos fijar su fecha para engendrar y disparar Creo que eso es todo el guión del tirador. Vayamos a la junta. Tenemos que agregar una referencia al tirador. Aquí al destruir el núcleo de cuencos coincidentes, desactivaremos al tirador al inicio del crotin y lo habilitaremos de nuevo al final de la misma Lo mismo está en la cotina inversa. Ahora, vayamos al guión del balón y agreguemos algunos casos para los nuevos estados. Sólo voy a copiar y pegar el desove uno con una diferencia Cambiará el estado a listo para disparar después de que termine de desove También, estoy generando casos para otros estados. No hacemos ninguna acción específica sobre ellos, pero es bueno solo enumerarlos aquí, incluyendo la predeterminada. Entonces más adelante en caso de que agreguemos un nuevo estado y nos olvidemos de implementarlo, verá una advertencia desde el IDE. Bueno. Ahora podemos ir al editor de Unity. Vamos a establecer el campo de precio de los tiradores, y podemos probar el juego Bueno por ahora. Nos vemos en el siguiente video. 23. S2L4: agrega música y SFX: Usemos música y efectos de sonido gratuitos de Unity Asset Store. He adjuntado todos los enlaces a la lección, para que podamos encontrar fácilmente los activos que vamos a utilizar. Vamos a agregarlos uno por uno. El primero son los materiales de la Tierra. Usaremos solo la lima de concreto de tierra blanda. El segundo es el RPG o kestrl. Añadiremos solo la lima de lente calentada. El tercero es el jefe épico. Tiene sólo un archivo. El siguiente es la fantasía aquí. Importaremos dos archivos desde aquí. Entonces necesitamos este épico paquete de celulares Och. Importamos solo un archivo de aquí. Y por último pero no menos importante, es este pack de efectos de sonido gratuito. Necesitamos estos tres archivos de él. Como puede ver, los archivos importados se encuentran en carpetas separadas. Esto no es realmente conveniente, así que vamos a moverlos a alguna carpeta común. Estoy creando una carpeta aquí en assets. Vamos a llamarlo audio. Ahora podemos mover todos estos archivos de audio a la carpeta de audio. Y las carpetas vacías se pueden eliminar. El audio está tomando mucha especia, así que podemos comprimirlo para guardar algunos. Además, podemos cambiar el tipo de lote para asegurarnos de que el juego flote rápido. El tipo de lote se establece en la carga de compresión por defecto. Pero el problema es que esto hará que el juego se cargue más lento, deberíamos configurarlo a streaming. Aquí, podemos ver que la compresión por defecto de este archivo es lo suficientemente buena. Pasemos al siguiente expediente. Estoy cambiando el formato de compresión a verbos y la calidad al 80%. Entonces en las salidas, tenemos menos del 18% de la luz original. Hagamos lo mismo con los demás archivos excepción de los pequeños. A ahora podemos seleccionar todos estos archivos y simplemente dragón dejarlos caer a la escena. Si bien todos están seleccionados en la escena, asegurémonos de que todos tengan la casilla de verificación de juego en un salario sin marcar Para organizar este objeto, vamos a crear un objeto de juego vacío y darle un nombre de administrador de audio. Podemos hacer que estos objetos sean hijos del gestor de audio. Es mejor asegurarse de que el gestor de audio y sus hijos estén posicionados en el punto cero. Voy a crear un script para el gestor de audio y asignarlo al objeto. Este guión controlará el audio en el juego. Entonces necesitamos enumerar los archivos de audio aquí. Una última para efectos de sonido y una lista para música de nivel. También, un campo separado para la música del menú. Vamos a asignar estas propiedades. Necesitamos algunos métodos para reproducir el audio. El primero reproducirá efectos de sonido. Como argumento, toma el índice de los efectos de sonido en la matriz. Cambiaremos aleatoriamente el tono del audio para que no sea demasiado repetible Para la música de nivel, solo tocaremos una pista aleatoria de la lista. Para la música del menú, simplemente necesitaremos reproducir una pista. Además, volvamos aquí y asegurémonos que no toquemos el mismo efecto de sonido dos veces. Ahora podemos ir al editor de Unity y como vamos a reutilizar este objeto, vamos a convertirlo en un prefab Ahora estamos listos para usar lo que creamos. Podemos ir al guión del tirador y agregar una referencia al gestor de audio. Entonces aquí, cuando disparemos una pelota, vamos a tocar el efecto de sonido con el Índice dos. Hagamos lo mismo en el guión Br. Aquí, cuando aterricemos una pelota, tocaremos un efecto de sonido con Índice cero. Y finalmente, cuando destruimos bolas coincidentes, tocaremos un efecto de sonido con Index one, y es hora de tocar algo de música. Vamos a tocar la música de nivel en el método de inicio del borscript Señorita Duke. Es el siguiente. 24. S2L5: agrega sprites de ruta y generador: Una pequeña pero necesaria mejora. Vamos a añadir un camino de bola y sprite sponno. Primero, agregaré este sprite de nivel a la escena del juego. Necesitamos establecer su orden en el valor de capa a algo que establezca el sprite entre el suelo y otros sprites Tres funcionarán para nosotros. Además, ya que está relacionado con el pase, lo colocaré debajo del objeto creador de pases. Podemos ver que el pase no está alineado con el sprite, así podemos corregir un poco el pase Yo Ahora agreguemos esta bola spon sprite. Es mejor renombrarlo para que sea consistente en el estilo de nomenclatura, y sería bueno colocarlo debajo del objeto level en la jerarquía Lo más importante, vamos a moverlo a la esquina superior izquierda así. Entonces, finalmente, podemos probarlo. Derecha. Bien, bien. 25. S2L6: agrega animación de destructor: Para mejorar la experiencia del usuario, creemos una animación para el audaz destructor Hay un archivo adjunto para esta lección que incluye los sprites de la animación que vamos a agregar Debería desempaquetarse aquí en la carpeta sprite así Vamos a la carpeta de creación y dirijamos este audaz archivo destructor 11 a la jerarquía de sintetizadores Ahora vamos a abrir la pestaña de animación. Por cierto, si esta pestaña no es visible, entonces la puedes encontrar en la animación Top Manu Windows En la pestaña de animación, hago clic en Crear. Después en esta ventana del Explorador, voy a la carpeta Activos y creo una nueva carpeta llamada Animaciones. En su interior, creo una carpeta llamada Bl Destroyer. Y finalmente, dentro de él, guardo este archivo de animación como creación. Ahora vamos a seleccionar todos los sprites esta carpeta y dirigirlos a la ventana de animación Mientras se seleccionan todos los marcadores, podemos simplemente arrastrar por esta barra y expandir el tiempo de la animación a 1 segundo. Ya podemos comprobar cómo funciona. Estableciendo el orden en capa para que sea ocho. Y podemos renombrar este objeto a boll destructor. Ahora vamos a crear otro clip para esta animación. El nombre será Idle. Ve a la carpeta llamada Idle, y como antes, selecciona todos los archivos y arrástralos a la animación toca la línea de tiempo y expandiéndola 1 segundo. Genial. Tenemos dos clips de la animación, así que hagamos que cambie de la creación del clip al clip Idle. Se puede hacer en la pestaña del animador. Solo necesitamos hacer clic derecho en Hacer transición. Y en el gráfico aquí, tenemos que arreglarlo de esta manera. Y algunas cosas más. Vamos a moverlo aquí al verdadero destructor de bolas en la escena Además, tal vez sea mejor renombrar esto a animación de destructor de bolas porque el verdadero destructor de bolas ya tiene este Pongamos la animación justo debajo de la real. Probando cómo se ve. Simplemente moviéndose un poco. Fantástico. 26. S3L1: menú principal: En esta lección, vamos a crear una escena de menú principal con sólo tres botones. Hay sprites de hombres adjuntos a las lecciones, así que puedes cargarlos y después de eso, agreguémoslos aquí a la carpeta Sprite Entonces vamos a crear una nueva escena usando archivo, nueva escena, dos D básicas, y crear es mejor para guardar la escena de inmediato. Debe guardarse en la carpeta de pecados con el nombre menú principal. Ahora vayamos a la carpeta Sprite y dirijamos el sprite de mazmorra Bground a la escena hi Renombrarlo a Fondo. Además, como hicimos en el video de configuración de Cursin, estableceremos el tamaño de la cámara principal en 9.5 Para que el fondo sea un poco diferente al de la escena del juego, hagámoslo más oscuro. Ahora vamos a implementar un lienzo de menú. Primero, necesitamos agregar un lienzo vacío. Ahora, agreguemos un botón de malla de texto p. Haz clic en Importar aquí. Necesitamos mucho los botones de selección y los tamaños de fuente de 80 serán más adecuados Este botón será el nuevo juego. Me gustaría que el botón transparente con el texto blanco, cambiando el color a completamente blanco. Para los fondos de los botones, estoy borrando este sprite predeterminado seleccionándolo y presionando el espacio posterior Después cambiando esta opacidad de color a cero. Volvamos nuevamente al texto, cambiando el material por conjunto a contorno, poniéndolo en negrita y aumentando el grosor del contorno. El estilo de botón está listo. Hagamos algunas copias de este botón. La primera copia será un botón continuo y el segundo será un botón de salida Debería cambiar el nombre de estos botones según el texto. Podemos seleccionar los tres botones y moverlos juntos. Ahora, agreguemos una ranura de imagen vacía y seleccionémosla. Necesitamos dirigir el orgullo de los logotipos al campo de imagen de origen y hacer clic en Establecer tamaño nativo. Lo voy a mover a la parte superior de la pantalla y además sería bueno cambiar el nombre del objeto a logo. Será muy conveniente tener estos objetos en el mismo orden en que se muestran en la escena. Voy a mover esto a la cima aquí también. Ya casi terminas con la parte de la interfaz de usuario y por lo tanto podemos crear un script con el nombre del menú principal. Fijándolo a la lona. El primer método será para el botón continuo. Aquí, solo necesitamos cargar la escena del juego. El nuevo botón de juego tendrá el mismo por ahora. Y el botón de salida saldrá de la aplicación. Solo una advertencia de que el botón de salida no hará nada al ejecutar el juego en el editor, así que no te preocupes cuando lo notes. Podemos ver este punto culminante afirmando que necesitamos agregar la escena del juego a la configuración de compilación. Así que vamos ahí. Se puede hacer simplemente arrastrando y soltando el juego y las escenas del menú principal aquí. Y ahora simplemente podemos cerrar la ventana. Tenemos botones en la interfaz de usuario y tenemos un script asignarlo al lienzo. Ahora vamos a conectarlo todo. Arrastraré lienzo aquí y seleccionaré el método correspondiente del manuscrito principal Similar en los siguientes dos botones. Un buen menú principal debe tener su música. Volvamos al guión. Necesitamos el gestor de audio. Entonces podemos simplemente llamar a este método. Volviendo al editor de Unity para agregar el prefab del administrador de audio a esta jerarquía Por último, podemos probarlo. 27. S3L2: menú de pausa: Ahora, agregaremos una funcionalidad de pausa y pausa a nuestro juego. Voy a crear un lienzo, agregarle un botón. Este botón tendrá un sprite específico para que podamos eliminar el texto aquí Dirijamos el sprite a la entrada de imagen de orden de este botón Haga clic en el tamaño nativo establecido. Podemos colocar este botón en la esquina superior derecha, fijando el punto de anclaje a esto, y la posición debe ser igual aproximadamente a la mitad del ancho y alto del botón, pero con un signo menos. Ahora, agreguemos un panel que oscurecerá la escena del juego, así quedará claro que estamos en algún tipo de menú Voy a renombrarlo al panel de POWs y el botón al botón Powe Duplicemos este botón, así tendremos uno separado para hacer una pausa Ahora, agreguemos un botón para ir al menú principal. Lo anclaremos al centro inferior y el resto será similar a lo que hicimos en el video anterior. Necesitamos un nuevo guión. Vamos a llamarlo Menú Pausa y asignarlo al Canvas. En el script, necesitaremos una referencia al panel POS para desactivarlo cuando pulsamos en Pausa. Necesitamos un método para ir al menú principal. Y necesitamos dos métodos para hacer una pausa y una pausa. Entonces simplemente deshabilitan y habilitan el panel de pausa, que debería estar deshabilitado por defecto. Además de esto, necesitamos una referencia al tablero para decirte que la pausa está habilitada. Vamos a crear nuevos campos de toros para esto. Podemos configurarlo en nuestros métodos de pausa y pausa. Además, para detener el conteo de tiempo cuando estamos en el menú Pausa, vamos a establecer el tiempo que escala de tiempo cero aquí y pongamos de nuevo en uno aquí. Ahora podemos ir al editor de Unity y asignar el campo del panel Pausa y también los botones. Contestada. Aquí hay tres problemas. Primero, tenemos que detener la rotación del tirador cuando la pausa está habilitada. Entonces estoy agregando una referencia al tablero aquí y envolviendo estos dos métodos con una declaración if. Segundo, cuando hacemos una pausa o unpause, el tirador lo toma como un clic y dispara una pelota en la dirección del botón de unpause Para evitar esto, podemos cambiar el método del botón G Mouse hacia abajo aquí para obtener el botón del mouse arriba. Se activará nodo cuando hagamos clic en el botón del ratón, pero en su lugar cuando soltemos el botón. Nos da algo de tiempo para establecer el campo de espouse true y podemos agregar este cheque aquí Y cuando nos unbounce, no debemos ponernos a espouse a caídas enseguida. Pero más bien, podemos esperar 1 segundo y desatarlo. Aquí vamos a usar un código. El tercer problema es que si presionamos la pausa, establecerá la escala temporal Y si queremos ir al menú principal y hacer clic en Continuar, la escala de tiempo sigue siendo cero porque no presionamos en pausa, así que no restablecemos la Para arreglar esto, podemos simplemente configurarlo aquí. Volvamos a probar. Nosotros los Hombres. Genial. 28. S3L3: agrega niveles: Agreguemos sistema de niveles y guardemos la última jugada a nivel para que podamos continuar el juego. Primero, vamos a crear un panel de interfaz de usuario de juego. Este botón de pausa se puede mover aquí ahora. También necesitamos mostrar el tiempo de nivel, agregando una nueva malla de texto p aquí. El texto se verá así. El tamaño del teléfono es 80. El punto de anclaje es el centro superior. Y la alineación del texto es el centro, y se verá mejor si es negrita. Además, dupliquemos esto para mostrar el nivel actual. Para programar esto, necesitamos un nuevo guión. Vamos a darle el nombre del juego UI Canvas, y podemos asignar el script al lienzo. En el guión, necesitamos referencias al nivel tiempo y número de nivel. Y necesitamos un método para actualizar el tiempo de nivel. Es parámetro tomará un número de segundos que pasaron desde el inicio del nivel. Podemos tomar la parte de las medias dividiendo el valor por 60. Y tomando una parte entera de ella. La segunda parte, podemos obtener de un sobrante de tal división, y nuevamente, tomamos una parte entera de ella El tiempo se verá así. Minutos dos puntos y segundos formateados a un número de dos dígitos. También necesitamos un método similar para actualizar el número de nivel, pero será mucho más sencillo. Simplemente prefijamos el número con una palabra de nivel. Ahora podemos ir al guión Br y llamar a estos métodos. Simplemente pondré estos valores para comprobar si está funcionando correctamente. Sí. Se ve bien. Es hora de almacenar el último valor de nivel de placa, así que sigamos jugando a partir de él después de cerrar el juego. Podemos implementar esto en el script de propiedad del juego. Vamos a crear un nuevo campo, último nivel. Lo haré privado para que no sea accesible desde fuera del guión, y vamos a controlar estrictamente lo que hacemos con este campo. Primero, dejaremos leer este valor proporcionando esta función de flecha. Entonces dejaremos incrementar este valor usando este sencillo método Ahora vayamos al guión de la junta y utilicemos esto. Primero, necesitamos rastrear un tiempo de nivel, así que voy a crear un nuevo campo aquí. Actualizaremos este campo a medida que pase el tiempo y actualizaremos el Gami con este valor. Si el tiempo de nivel alcanza los 60 segundos, incrementaremos el valor del último nivel, actualizaremos el número de nivel en la interfaz y reiniciaremos el contador de tiempo de nivel a cero Además, en la etapa de inicio aquí, necesitamos obtener el último valor de nivel de las propiedades del juego y el tiempo de nivel será cero por defecto. En cuanto a la duración del nivel, será bueno tenerlo también en las propiedades del juego. Vamos a hacerlo. Lo pondré en 10 segundos por ahora, así que será más fácil de probar. Podemos usar este valor ahora en el método de actualización de placa. Probemos cómo funciona. Bueno. Ahora, vamos a guardar el último valor de nivel en la memoria de mucho tiempo Solo de una manera básica, podemos usar las prefs del jugador aquí. Usaremos esta clave personalizada para el último nivel antes de que se llame al método de inicio de placa, podemos usar el método despierto aquí para cargar el último valor de nivel de la memoria. Quizá mejor sacar la K a algún campo. Asegurémonos de que digamos un valor predeterminado para el último nivel cuando ejecutemos el juego por primera vez. Cuando estamos probando el juego y necesitamos restablecer todos los valores guardados, podemos ir a editar, borrar todas las prefs del jugador Ejecutemos el juego y probemos lo que tenemos. Derecha. Comienza desde el nivel guardado. Dado que aumentamos la velocidad de la pelota en todos los niveles, debemos asegurarnos de que efectos como tiempo lento también tomen en cuenta esta velocidad. Entonces, vamos a moverlo a un método separado. Este método tomará un parámetro para el multiplicador de efecto, y vamos a estar pasando este valor aquí. Además, no debe ser estático. El valor de velocidad será el multiplicador de efecto, multiplicado por la velocidad de nivel. Supongamos que la velocidad del nivel básico será uno más el número del último nivel multiplicado por 0.3. En realidad, deberíamos mover este método a las propiedades del juego. Debe ser público aquí, y el 0.3 se puede iniciar como un campo. Las ranuras se aceleran por nivel. Debería ser flotante en lugar de entero. Volvamos a las palabras y usemos este método. También debes establecer la velocidad inicial cuando iniciemos ambas ranuras Así es como funciona. Podemos ver que esta pelota no puede llegar a la velocidad de los demás. Entonces agreguemos este multiplicador en el aterrizaje y otros lados de la pelota. Podemos partir del estado destructor. El aterrizaje. Las ranuras de conmutación, creo que ya es suficiente. Vamos a probar. Por qué, por qué, por qué. Parece que este multiplicador de nivel de 0.3 es demasiado grande, así que probemos 0.1. También debemos asegurarnos de que lo cambiemos aquí en el editor de Unity, limpiando las prefs del jugador y comprobando de nuevo Fresco. 29. S3L4: agrega un escenario de juego: Definamos y activemos un desbordamiento del juego. Cuando un jugador pierde un juego, el mensaje de juego sobre no debe aparecer abruptamente, sino que debemos dejar el jugador se dé cuenta de que algo anda mal Necesitamos un corrupto aquí. También, necesitaremos un campo para ese estado. Vamos al cotin. Entonces primero, desactivamos al tirador y establecemos el juego sobre campo en true. Entonces esperaremos 2 segundos. Y tendremos que mostrar el mensaje en la interfaz de usuario del juego. Vamos allí y creamos un método vacío para ello primero. Puede llamarlo después de 2 segundos aquí. Volviendo al gamei, no necesitamos este código, así que lo voy a quitar. Necesitamos una referencia a un juego sobre panel, que necesitamos crear más adelante. Oh, sí, tenemos que iniciar Mt. Entonces al inicio, deshabilitamos el juego sobre panel, pero lo habilitamos cuando se acabó el juego. Vamos al editor de Unity y creamos un nuevo panel en el lienzo. Será el juego sobre panel. Debería ser más oscuro. Necesitamos agregar un mensaje de texto. El estilo será similar a lo que hemos hecho antes. Pero el tamaño del teléfono será más grande. Además, necesitamos algunos botones, así podemos simplemente ir al panel de Encendido, duplicar este botón y moverlo a nuestro panel. Este botón volverá a ser la jugada. Necesitamos otro botón para el menú principal. Vamos a crear metales para estos patrones. El botón de juego del jugador solo recargará la escena, y el menú principal cargará la escena del menú Además de esto, necesitamos desactivar el panel del juego I cuando mostramos el juego sobre panel, agregando una referencia al panel del juego I y cambiando su sit aquí y aquí. Ve al editor de Unity y asignando los paneles. Y podemos asignar nuestros metales a los botones. Por último, podemos ir al guión real más atrevido y desencadenar el juego sobre escenario Necesitamos una referencia a la junta. Cuando el destructor de bolas choca con la pelota en pista, comprobamos Si aún no ha terminado el juego, lo iniciamos. Además, sería bueno que aceleráramos todas las bolas cuando se active el juego terminado. Encontremos este lugar en el código. En realidad, se duplica en unos pocos lugares para que podamos moverlo a un método separado. Acelera las ranuras. Debe tomar como parámetro el multiplicador de efectos. Ahora podemos usarlo en el juego sobre cotin aquí. Además, podemos colocarlo en lugar de duplicaciones, pero necesitamos asegurarnos de que pasamos el valor del parámetro correcto Vamos a probarlo. Podemos ver que mientras estábamos viendo el juego sobre pantalla, el nivel de alguna manera saltó 12-14 Para solucionar este problema, solo necesitamos colocar una declaración I aquí donde contemos el tiempo de nivel. Entonces dejará de contar cuando termine el juego es verdad. Volvamos a probar. Genial. Y 30. S3L5: comienza un nuevo juego: H. En esta lección, agregaremos funcionalidad al nuevo botón de juego en el menú principal. Si ya estás cansado, déjame animarte porque este video será realmente sencillo Entonces vayamos al manuscrito principal y creemos dos mates vacíos Confirma nuevo juego y cancela nuevo juego. Necesitamos una referencia a las propiedades del juego y al campo público para el panel de confirmación, que crearemos más adelante. Voy a mover esta línea al nuevo método de confirmación de juego. En lugar de hacerlo aquí, haré activo el panel de confirmación. Vamos al script de propiedad del juego y creamos un método para establecer el último nivel. En este método, estableceremos el último nivel para que sea igual a uno y guardaremos este valor en las prefs del jugador Vamos a llamar a este método desde el de confirmación. En el método cancel, solo activaremos el panel de confirmación. Olvidé inicializar las propiedades del juego aquí, hagamos esto En el editor de Unity, agreguemos un nuevo panel al lienzo y le pongamos el nombre del panel de confirmación. Lo estoy haciendo lo suficientemente más oscuro como para cubrir la mayor parte del impuesto de fondo, y necesitamos un texto aquí. ¿Estás seguro de que quieres comenzar desde el nivel uno? Lo haré más grande y lo centraré. A Ahora, podemos duplicar el botón de salida y hacer un botón sí a partir de él. Una vez más, duplica el botón sí y haz un botón no. Ahora, podemos asignar estos botones. Y quedará más limpio si movemos todos estos elementos del menú a un panel separado y lo deshabilitamos cuando mostramos este mensaje de confirmación. Entonces agregaré este panel del menú principal. Y más todos los artículos relacionados debajo de él. Ahora podemos crear un campo para el panel del menú principal. Podemos asignar estos paneles. Y aquí lo hacemos así. Habilitar conformación, desactivar principal. Desactivar confirmación, habilitar principal. Desactivar la confirmación por defecto. Menos prueba. H. Tenemos un error. Es porque el objeto de propiedades del juego no existe en la escena del menú principal. Así que vamos a guardar la escena, ir a la escena del juego y convertir las propiedades del juego un prefab arrastrándolo a la carpeta prefab Podemos guardar y volver al menú principal ahora y agregar este nuevo prefabricado a la escena aquí aquí. Volvamos a probar. Genial. Mm hmm. 31. S3L6: corrige errores y optimiza: U. Este video, arreglaremos la mayoría de los errores que podríamos notar antes. Empezaremos a partir de este error. Al invertir, a veces, podemos ver pequeñas bolas que retroceden más allá del punto de desove Vamos al guión del balón y creamos un matón que comprobará si la pelota está ubicada cerca del inicio del camino, que es nuestro punto de desove para las bolas en Podemos usar esta función para obtener la distancia en pista para esa pelota. Digamos que si esta distancia es inferior a 0.2, entonces esta pelota está lo suficientemente cerca. Cuando destruimos una pelota, podemos verificar si la tabla está en reversa y la pelota está realmente cerca del punto de desove En ese caso, inmediatamente destruimos la pelota. Vamos a probar algunas veces. Parece que lo arreglamos. El siguiente error es que podemos filmar una secuencia de bolas pequeñas, a pesar de que esto podría ser una característica si lo deseas. Tendríamos que hacer muchos cambios para que se vea bien. Por ahora, supongamos que esto es un bug y vamos a arreglarlo. Podemos ir al guión del tirador y dentro del método de disparar siguiente bola, podemos agregar un cheque. Si no hay siguiente bola o este estado de bola no está listo para disparar, regresa. Probándolo. que necesitamos mover el defecto dentro del método y después de la comprobación que acabamos de agregar. Comprobando de nuevo. Genial. Lo siguiente no es totalmente una espalda, sino más bien agradable tener característica. Si las bolas vuelven a la inversa, después de ella, las nuevas bolas son completamente diferentes a las de antes. Pero podemos recordar las bolas que destruimos inversa y las generamos de nuevo después de ella. Para esta característica, necesitamos una pila porque funciona usando el primer principio perdido. Lo haré leer solo porque lo inicializaremos solo una vez y agregaremos o eliminaremos elementos de la misma instancia Simplemente quitando el código no utilizado. Cuando generamos bolas en pista, podemos llamar a este método para obtener un tipo de bola aleatoria. En este método, comprobaremos si hay algún tipo en esa pila. En caso afirmativo, entonces devolveremos el último artículo de él y automáticamente, se elimina de la pila. Además, necesitamos un método que usaremos desde fuera, que agregará un tipo a la pila. Dado que la funcionalidad que destruye las paredes los conductores se encuentra en el script de la ranura de bolas, vayamos allí vamos a necesitar una referencia al Aquí vamos a necesitar una referencia al factor bola, por lo que es. Y agreguemos modificadores de acceso explícitos a estos métodos. Podemos ver que aquí hay un poco de lógica complicada. A lo mejor podemos simplificarlo primero, este bloque comprueba si la distancia recorrida es mayor que la longitud del camino. Es similar al bloque de abajo donde comprobamos si la distancia es menor a cero, así podemos juntar estos dos bloques. Entonces podemos mover la lógica dentro de este gran bloque a un método separado. Podemos nombrarlo destruir bola por lo que realmente hace. Vamos allí y podemos ver que podemos agregar un parámetro a este método para mover la lógica relacionada con la distancia recorrida. Y aquí debería estar 0.5, pero solo voy a mover esto para separar método mientras recuerdo. Lo único que hacen estos dos bloques es que la distancia recorrida para no rebasar el rango de la longitud del camino Por lo que podemos nombrarlo recortar distancia recorrida. También, deberíamos poner s aquí para que sean más claros para entenderlos. Volviendo aquí, podemos agregar el tipo de muro que vamos a destruir a la pila. Y no debemos olvidar poner 0.5 aquí. Probándolo finalmente W. W W. Se ve muy bien. La otra cosa que podemos arreglar es que cuando la bola inversa se encuentra aquí, no está claro que si la destruimos, las bolas retrocederán porque la flecha en la bola realmente apunta en una dirección completamente diferente. Vamos a arreglarlo. Deberíamos hacer algo aquí en la actualización de la ranura de bola. Eventualmente moveremos tal lógica a un método separado. Hagámoslo al revés y llamemos primero a un método aquí. Digamos que se mirará por encima de la dirección del camino. Ahora podemos crear este método. Para obtener la dirección correcta, necesitamos dos puntos A y B. Si el punto B es el punto en el camino donde se encuentra la pelota, que es este, entonces el punto A es algún otro punto que es una unidad atrás en el camino. Para que podamos obtener el vector de dirección así. A menos B, y podemos establecer el punto de transformación hacia arriba de la ranura el punto en esa dirección. Hacer ese eje se puede omitir ya que es al juego. Además, en realidad es opuesto en lugar de torres. Ahora vamos al guión de la pelota y hagamos que la pelota transforme eso arriba, igual a su lote arriba vector aquí y aquí. Probando podemos ver que la pelota está volteando en este punto Probablemente, podemos escoger un vector más pequeño porque si la distancia recorrida es menor a uno, entonces el vector de dirección será así. Podemos establecer 0.1 aquí. Inténtalo de nuevo. Fresco. El siguiente dólar ocurre cuando hay algunas bolas tipo bomba que van a ser destruidas, entonces solo la primera bomba realmente explota y el resto se cuenta como bolas simples Podemos facilitar la reproducción de este caso yendo a la fábrica de bolas y editando esta línea. Ahora veamos qué podemos hacer para arreglarlo. En el script del tablero, este código solo busca el primer bache y luego verificamos si este bache existe, luego finalmente agregamos bolas de hermanos a la lista de destruir y simplemente podemos hacer que sea un bucle Primero, filtramos todas las ranuras que tienen una bomba en su interior. Luego iteramos sobre cada uno de ellos usando un para cada bucle. Sólo tenemos que asegurarnos de que el nombre de la variable es correcto, y luego estamos listos para probarlo. Genial. No olvides revertir este cambio El siguiente error es que en algún nivel, necesitamos que la bola de tiro se genere más rápido. Entonces arreglemos estos dos. Sólo tienes que ir a la ranura de la bola, copiar esta línea, pasarla aquí, y aquí, está en ella Hecho. El siguiente problema ocurre cuando disparamos una pelota fuera del tablero. Podemos ver que no están siendo destruidos. En cambio, solo son más y más de ellos. Entonces lo que podemos hacer es crear algún objeto fuera del tablero que destruya estas bolas. Vamos a crear un objeto vacío y nombrarlo bola llenar pan. Después le agregamos un colisionador de borde a D. Tenemos que asegurarnos de que su posición esté puesta a cero en cada eje. Ahora podemos editar el colisionador. Además, necesitamos agregar un cuerpo rígido a D y cambiar el tipo de cuerpo a cinemático porque las bolas no tienen cuerpo rígido a D y necesitamos al menos algunos de los objetos colisionantes para Podemos colocar este dolor para estar por debajo del contenedor de ranura de bola en la jerarquía. Ahora vayamos a la carpeta de scripts y creemos un nuevo script. Bola llenar el dolor. Vamos a asignarlo al objeto dolor. En el guión, podemos limpiar esto. Solo necesitaremos el disparador on enter al método. Entonces estamos comprobando si el objeto con el que colisionamos tiene la bola tag Entonces destruimos su objeto de juego. Y aún no tenemos esta etiqueta, así que necesitamos ir al editor de Unity, hacer clic en capas en la parte superior derecha, y luego editar capas. Una nueva pelota tecnológica. Entonces tenemos que ir a los prefabricados, hacer doble clic en el prefabricado de bola y asignarle esta etiqueta Podemos regresar y estamos listos para probarlo. Genial. Lo siguiente, sería bueno recompensar a un jugador por terminar un nivel destruyendo todas las bolas que actualmente están en pista en el momento en que el nivel cambia al siguiente. Además, será consistente con el caso cuando cargues un nivel haciendo clic en continuar desde el menú principal. Esta vez, será sólo un cambio de línea. En el script de la barra, el método de actualización, llamaremos a destruir todas las bolas en el método de lista. El valor del argumento serán todas las ranuras de ambas ranuras por distancia donde el campo de pelota no esté vacío. Podemos hacerlo. Mañana. Genial. Y por último, pero no menos importante, pensemos, vamos a afinar algunas propiedades del juego. Entonces, fijemos la duración del nivel en 60 segundos, y la bola a baja velocidad en 1 segundo. No olvides cambiarlos aquí, también. Y necesitamos aplicar anulaciones para asegurarnos de que los cambios se guarden en el prefab para Estamos listos para probar sit Buen trabajo.