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.