Saltar navegación

Tutoría 8 - DEIM - UT4 - Curso 23·24 - 7 Marzo - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 7 de marzo de 2024 por Daniel M.

22 visualizaciones

Grabación de la tutoría del módulo de DEIM desarrollada el 7 de marzo

Descargar la transcripción

Vale, mira, tengo las siguientes dudas. En primer lugar, el tema es el... 00:00:02
Bien, he conseguido hacer sobre el juego anterior, sobre el de las plataformas de la bola, 00:00:06
he hecho una pantalla de inicio, sobre la pantalla de inicio he puesto varias opciones, 00:00:12
que es la... bueno, le he metido la música, he puesto varias opciones, 00:00:16
cuando pinchas en opciones, a través de la consola, pues... 00:00:20
Ah, bueno, he puesto un kit, para que me mande un kit desde la siguiente pantalla 00:00:25
Y me lo muestra en la pantalla de la consola 00:00:30
En la consola solamente 00:00:33
En vez del proyecto en consola 00:00:34
En donde está 00:00:37
Entonces yo entiendo que ahí se tiene que quedar 00:00:38
Esa parte se queda ahí 00:00:41
Luego, el tema de los corazones 00:00:42
El quitar las vidas es lo que peor 00:00:45
Vamos, que no consigo hacerlo 00:00:47
He metido el screen, me he estado viendo varias veces los tutoriales 00:00:48
Que vienen ahí en la aplicación 00:00:51
Y ya está, sí que es verdad que meto los sprites 00:00:53
Lo divido, lo corto 00:00:55
Los corazones en tres partes 00:00:57
Luego vinculo, hago los scripts necesarios para vincularlo 00:00:58
Pero no consigo que se me quiten los corazones 00:01:03
Cada vez que la bola, por ejemplo, cae a través de un trigger 00:01:06
Que cae en la parte de abajo, pues no consigo hacer que se quite 00:01:09
Y luego tenía una duda porque quería hacer un slider 00:01:12
Relacionado con la música, para subir y bajar el volumen 00:01:17
Entonces no sé si es, hay que hacerlo en la pantalla de inicio 00:01:21
o que se pueda bajar, subir y bajar en todas las pantallas 00:01:26
vale, bueno, en primer lugar 00:01:29
en ningún caso se hablaba de meter música 00:01:30
porque la música se da en un tema posterior 00:01:32
entonces, claro 00:01:34
el slider se debía usar para el nivel 00:01:36
de dificultad del juego 00:01:38
vale, entonces 00:01:39
lo del slider, si te parece 00:01:42
te lo explico, relacionado con lo que 00:01:44
se debería hacer en la práctica 00:01:46
y posteriormente realmente es 00:01:47
convertirlo a que el volumen 00:01:50
del audio se regule con eso 00:01:52
pero bueno, vale 00:01:54
Bueno, te hago una pregunta un poco obvia 00:01:56
No me puedes compartir el proyecto para que lo veamos 00:01:58
Junto, ¿verdad? 00:02:01
¿Sabes lo que pasa? Bueno, dentro de un rato sí 00:02:03
Porque voy a coger el tren para el aeropuerto 00:02:04
Y cuando esté en el aeropuerto ahí me voy a conectar con el portal 00:02:06
Que me lo he traído, para poder conectarlo precisamente 00:02:08
Pero que me pillase 00:02:11
A lo mejor en 20 minutos 00:02:12
Media hora sí 00:02:15
Aún así te puedo ir hablando 00:02:15
Digo, que vas a estar escuchándome 00:02:18
Sí, sí, estoy pendiente, estoy con el móvil pendiente 00:02:20
Vale, sí, lo digo porque voy a ir como preguntándote 00:02:22
cosas de vez en cuando, porque claro, yo sin verlo 00:02:24
me imagino lo que me está contando, 00:02:26
pero es complicado, vaya. 00:02:28
Entonces, claro, 00:02:30
volví. Yo me voy a ceñir un poco 00:02:33
a lo que es el enunciado del tema. Por ejemplo, 00:02:34
lo del volumen, en el último tema, 00:02:36
se va a ver clarísimamente, y si entendéis cómo hacer ese 00:02:38
slider con los niveles, 00:02:40
de hecho, para la música es más sencillo, 00:02:42
porque está comunicado. 00:02:44
Si no, más adelante ya lo veremos. 00:02:46
Sí, entiendo que más o menos lo que está 00:02:50
recreando es una ventana como esta, 00:02:52
En la que si das 00:02:54
Bueno, lo vimos en la última tutoría 00:02:55
De hecho, que si le das a jugar lanzaría el juego 00:02:57
No le doy, paso a la siguiente 00:02:59
En config tenemos este slider 00:03:01
Para el nivel de dificultad que ves que hay cuatro 00:03:03
Perdona, no puedo ver tu pantalla 00:03:05
No puedo ver ahora 00:03:08
Perdona, perdona, claro, es que la estaba compartiendo 00:03:08
Pero 00:03:11
Sí, ahora sí 00:03:11
Sí, sí, sí 00:03:21
Arranco el juego, ¿vale? 00:03:22
Y entonces la primera pantalla 00:03:26
Era esta que en principio 00:03:27
se pedía que se configuraran tres posibilidades, tres posibles botones. 00:03:29
Uno es el de jugar, que no le doy, para lanzar el juego. 00:03:33
Voy a jugar un poco para que se vean estas tres vidas. 00:03:39
Y fíjate que yo en el material, por lo que te he entendido, 00:03:43
en el material que proporcionaba para la práctica, había cuatro... 00:03:46
Bueno, no, de hecho había tres imágenes diferentes 00:03:51
que corresponden con las que estamos viendo aquí, 00:03:53
es decir, con las que ya están como sombreadas, las vidas que se han muerto. 00:03:56
No hay que trocearlas, en realidad sustituir, según el momento en el que nos encontremos, cada una de las imágenes, ¿vale? Ahora lo vemos, pero no había que trocear nada. Sí que es verdad que en el vídeo, si no me equivoco y estás haciendo referencia al de Álvaro, se juega con él con un solo corazón que se repite y se va, digamos, cambiando la anchura de los corazones porque se va tileando, ¿no? Se va como repitiendo. 00:03:59
Eso es, se mete 00:04:22
lo corta, lo convierte 00:04:24
primero en un sprite 00:04:26
que te diga cómo se tiene que hacer, luego lo corta 00:04:28
y luego ya a partir de ahí te lo va colocando en la pantalla 00:04:30
Claro, la cosa es que yo 00:04:32
en esta tarea, si te fijas, el enfoque 00:04:34
es un poco diferente 00:04:36
y más sencillo, ¿no? 00:04:38
Porque, bueno, voy por partes 00:04:40
¿vale? Para hacer ese HUD 00:04:42
ese, nunca sé si se dice 00:04:44
HUD, que se 00:04:46
pone como un overlay 00:04:48
¿vale? Como un overlay encima del juego 00:04:49
en los niveles que queramos que estén 00:04:52
lo primero que se sugiere en el enunciado es 00:04:53
que yo he generado un prefab 00:04:56
que luego podré ir arrastrando a cada nivel 00:04:57
con ya todos los elementos 00:04:59
dado que todos los niveles jugables van a tener 00:05:01
las mismas datos 00:05:03
de prefab, pues ya aprovecho 00:05:06
y que ya esté preconfigurado 00:05:07
incluso con algún script ya 00:05:09
los diferentes elementos 00:05:11
lo que iremos jugando a través del código 00:05:14
es que ponen 00:05:16
el nombre del jugador 00:05:17
cuantos 00:05:19
Bueno, pues cuántos corazones 00:05:20
Mejor dicho aquí 00:05:23
Cuántas vidas nos quedan, ¿vale? 00:05:24
En este caso, básicamente eso 00:05:27
Entonces, por ejemplo, en el tema de las vidas 00:05:29
Voy a ese caso concreto 00:05:32
Está 00:05:34
La propia imagen que se está cargando 00:05:35
Que aquí tenemos la de Livestress 00:05:38
Pero lo que te comentaba, en el material que os pasaba 00:05:39
A ver 00:05:42
De hecho 00:05:43
Sí, vienen diferentes 00:05:44
Es decir, que no 00:05:47
No, digo porque he entendido que tú lo que has empezado a hacer, que se podría también de otros modos, pero en este caso sería menos operativo y de hecho no es el modo que yo más sugeriría para algo así con tan pocas vidas, ¿vale? 00:05:49
No hay que trocear nada, ¿vale? Porque lo que habría que hacer es que la imagen que se está viendo aquí en el HUD, en este componente imagen, que empieza por defecto como el de las tres vidas, según vayan sucediendo cosas, pues se cargue la imagen de dos vidas, la de una vida, ¿vale? 00:06:01
Sin una duda. 00:06:18
Sí. 00:06:19
Es que lo he intentado, claro, en el script he metido un array, ¿no? 00:06:19
Y en el array he metido cada uno de estos tres, de estos cuatro. 00:06:22
Vale. 00:06:25
Metiendo de cero a cero, uno, dos y tres. 00:06:25
Entonces, lo he intentado, pero es que no me sale. 00:06:28
Vale. 00:06:30
Sí, sí, ¿no? 00:06:31
Bueno, que no pasa nada, para eso de la tutoría. 00:06:32
Vale, algo importante es que siempre, esto no es una regla 100%, 00:06:35
pero normalmente cuando creemos un canvas con diferentes cosas dentro, 00:06:40
si queremos manipular la información que hay dentro, ¿vale? 00:06:44
Los aspectos de los distintos inputs, imágenes, etcétera, se debería unificar normalmente en un... 00:06:47
Aquí es en el HUD, pero, por ejemplo, si voy al menú de configuraciones que tenía tres botones, 00:06:54
ese canvas también tiene, digamos, la configuración de las acciones de los botones ahí. 00:06:58
Ahora, de hecho, iremos. 00:07:03
Me voy a centrar en esta duda concreta. 00:07:05
Si te fijas, aquí lo que hay en este canvas es, por un lado, una referencia, ¿vale? 00:07:06
Y me voy a meter ya en el script también para tenerlo aquí abierto. 00:07:13
¿vale? Estás en el canvas 00:07:17
del menú de inicio, ¿no? Por lo que veo. 00:07:18
No, en el canvas del HUD 00:07:20
mientras se juega, que es un 00:07:22
prefab que yo ir arrastrando, 00:07:24
¿vale? Estoy yendo, 00:07:26
digamos, primero a por lo del HUD 00:07:28
porque es como una duda más concreta 00:07:30
que otras que me has hecho. Entonces, 00:07:32
para atajar esta. Yo cuando voy abriendo 00:07:34
los distintos niveles, 00:07:36
lo que he hecho, ¿vale? Es 00:07:39
arrastrar un prefab que es 00:07:40
ese HUD. Esto, ¿vale? Lo voy a volver a 00:07:42
arrastrar. En cada nivel puedo 00:07:44
ir arrastrando ya un prefab que he hecho 00:07:46
es decir, ese prefab es el que 00:07:48
me va a aportar lo que es 00:07:50
este canvas que se va a sobreponer 00:07:53
sobre los niveles de juego 00:07:54
no en el menú inicial 00:07:56
y en el de configuración no, porque ahí no 00:07:59
tenemos necesidad de 00:08:00
feedback de las vidas que nos quedan 00:08:03
al menos tal y como está planteado este juego 00:08:04
pero luego en cada nivel jugable sí 00:08:06
vale, entonces entiendo que 00:08:08
lo que has hecho es un canvas 00:08:10
sobre por ejemplo el de la escena número 1 00:08:13
has hecho un prefab y ese lo has arrastrado 00:08:15
a cada uno de los niveles que vas a ir a jugar 00:08:17
Mira, yo este es el nivel 1 00:08:18
y si pongo el nivel 2 00:08:20
pues ese HUD lo he arrastrado aquí 00:08:22
y el canvas está aquí y yo lo que hice 00:08:24
para guardarlo como un prefab fue poner 00:08:27
un parent, un empty 00:08:29
que se llamara HUD y dentro está todo 00:08:30
lo del canvas, incluido el event system 00:08:32
que tiene que estar siempre que hay un canvas 00:08:34
tiene que haber como mínimo un event system 00:08:37
en esa escena, ¿vale? Entonces 00:08:39
eso lo bueno que tiene es 00:08:40
que en realidad nosotros 00:08:42
vamos a ir jugando con este 00:08:44
HUD según el nivel, pero ya está 00:08:47
configurado siempre el mismo para arrastrarlo a todos 00:08:48
los niveles, ¿vale? 00:08:50
Entonces, ¿qué 00:08:52
tiene ese canvas? Pues lo que he dicho, 00:08:55
un campo de texto 00:08:57
que se irá rellenando con 00:08:59
el texto que nosotros vayamos diciendo, por defecto 00:09:01
pone player, ¿vale? Porque es lo que he puesto en el componente 00:09:03
de texto directamente y de momento 00:09:05
no se cambia, pero por código lo podremos 00:09:07
cambiar, está ahí preparado. Y luego 00:09:09
hay una imagen, ¿vale? Que 00:09:11
se ha situado, se ha ubicado en esta esquina superior derecha con, en este caso, a nivel 00:09:13
orientativo, vamos, a nivel que es como vamos a empezar el juego, las tres vidas, con esa 00:09:19
imagen, que es la que se está visualizando en este área, ¿vale? Que cuando vamos al 00:09:24
canvas, pues ahí está ese área de la imagen, ¿no? Ahí, a ver, me voy para atrás, ¿vale? 00:09:29
Ahí, epa, no quiere, ahí, ¿vale? Ahí tengo preparada esa imagen, ¿vale? Entonces, lo que yo he configurado directamente y voy dentro del prefab, ¿vale? Doble clic, a ver, en el prefab, doble clic, para que veas que coincide con lo que te estoy contando, ¿vale? 00:09:36
Entonces, yo ya en ese canvas, cada vez que meta este prefab, aparte en el canvas ya hay lo que yo he llamado un script llamado hood manager, un script como otro cualquiera, vaya, para que veas, está aquí, el hood manager, ¿vale? 00:09:53
Que yo lo he arrastrado al canvas. 00:10:08
¿Y eso qué es lo que nos va a permitir? 00:10:09
Tener más o menos centralizado todos los cambios o manipulaciones que hagamos dentro de ese canvas y los distintos elementos que tengamos, ¿vale? 00:10:11
Que aquí son uno de tipo texto y otro de tipo imágenes, pero en el menú configuración será uno tipo input de texto, ¿vale? De entrada de texto y otro de slider, ¿vale? Pero siempre van a estar dentro de este área que es el canvas, digamos, que marca el área de visualización de los elementos que vayamos introduciendo dentro, ¿vale? 00:10:18
¿Qué es lo que he hecho? Pensando en 00:10:38
Mismamente lo que tú has planteado 00:10:41
Es, vale, como tengo varias imágenes 00:10:43
Con los corazones según las vidas que me queden 00:10:45
Voy a hacer un array 00:10:47
¿Vale? ¿Y qué más cosas? 00:10:49
Yo, aquí es donde hay que irse planteando 00:10:51
Y ahora lo metemos por código, aquí ya está hecho 00:10:53
Pero es, yo en algún momento 00:10:55
Voy a querer manipular 00:10:57
El GameObject que tiene el componente 00:10:58
Texto, pues yo ya lo preparo 00:11:01
Mediante un 00:11:03
SerializeField o mediante un public 00:11:05
Ahora lo vemos en código. Una referencia a este texto que yo siempre podré cambiar por código. Es decir, que yo mediante código pueda entrar aquí, decir player y ponga Javi. Y ves que aquí ya se ve, se va actualizando. Lo he hecho ahora mediante el inspector, pero ya haciendo accesible estas áreas, estos componentes, puedo ir manipulándolo. 00:11:07
Igual he hecho con, digamos, la referencia, que esto es importante y puede que sea de hecho lo que te falte, la referencia al componente imagen, porque cuando cambiemos este componente imagen es cuando le diremos, oye, lo que tienes que cargar en este área que hay aquí es la imagen lives 2 o lives 1. 00:11:32
Entonces en algún momento vamos a necesitar referencia a esa imagen 00:11:53
Y luego hay otro preparado que esté menos importante 00:11:57
Que es uno de la bola de cada nivel 00:12:01
En cada nivel habrá un personaje al que vamos a influir 00:12:03
Según lo que guardemos en el nivel de dificultad 00:12:06
En menú configuración, esto ya es un poco más peleagudo 00:12:09
No sé lo que me voy a centrar ahora 00:12:12
Pues que esa pelota a través del código 00:12:14
Y habría que arrastrar en cada nivel 00:12:16
Luego habrá que arrastrar la pelota de ese nivel 00:12:18
Influimos en cosas como el peso de la masa 00:12:20
o la resistencia al aire que tiene su Rigidbody, ¿vale? 00:12:23
Esto te lo adelanto para enseñártelo aquí ahora a nivel de código, ¿vale? 00:12:27
Y empezamos. 00:12:32
¿Cómo es? 00:12:33
Porque creo que además es el punto menos complejo para mostrar esto, 00:12:34
que en el menú de configuración igual es un poco más... 00:12:39
Hay que dar más piruetas, que en realidad es lo mismo, 00:12:41
pero bueno, vamos a ir empezando aquí. 00:12:44
Si te fijas, los cuatro campos que yo ya he preparado en este prefab 00:12:47
del hud, el username, el lives array 00:12:53
el lives bola 00:12:55
yo ya los he preparado como cuatro variables 00:12:57
que son accesibles 00:12:59
desde el editor con esta serie de files 00:13:01
son privadas pero accesibles 00:13:03
desde el editor, esto ya lo hemos hablado varias veces 00:13:05
¿esto qué significa? que si yo voy a cualquiera 00:13:07
de los niveles y arrastro 00:13:09
al final yo 00:13:11
voy a tener estas áreas 00:13:13
y ves que en negrita está 00:13:15
este de bola porque es el único 00:13:17
digamos que yo he tenido que arrastrar la bola aquí 00:13:18
porque el resto, como siempre van 00:13:21
es decir, es el único elemento que no pertenece al canvas 00:13:23
como el resto 00:13:26
de elementos de la imagen 00:13:28
y de la entrada de texto, si van con el canvas 00:13:29
ya lo que se hizo es, en el propio 00:13:31
prefab 00:13:33
prepararlo, es decir, ya están asociados 00:13:34
el único que está vacío es el de la bola 00:13:38
¿vale? 00:13:39
entonces, ahí que es lo que se ha hecho, preparar 00:13:41
digamos todos los ingredientes que vamos a jugar 00:13:43
posteriormente 00:13:45
¿vale? hasta aquí me vas siguiendo 00:13:47
más o menos 00:13:50
un poco así 00:13:52
lo veo un poco complicado 00:13:52
pero 00:13:53
vale 00:13:53
pero vamos 00:13:55
más o menos 00:13:55
00:13:56
en resumen 00:13:56
la idea sí 00:13:57
la idea sí 00:13:58
la cojo 00:13:59
pero 00:13:59
vale 00:14:00
como conclusión 00:14:00
para seguir 00:14:04
en resumen 00:14:04
lo que he hecho 00:14:05
preparar 00:14:06
todo aquello 00:14:07
a lo que yo voy a querer 00:14:08
afectar 00:14:09
mediante el canvas 00:14:09
en algún momento 00:14:10
ya está 00:14:11
yo voy a querer 00:14:12
que ese hud 00:14:13
en algún momento 00:14:14
cambie el texto 00:14:15
que pone ahí 00:14:15
que cambie la imagen 00:14:16
vale 00:14:18
luego aparte 00:14:18
Sí que hay que crear uno tipo sprite para meter, que este no es ningún componente, digamos, visible aquí ahora mismo, pero para meter las posibles imágenes que luego se van a cargar en el componente imagen, ¿vale? 00:14:19
Que está en el HUD también y luego aparte la bola que sirve para, ya te digo, cambiar la masa y el drag del RigidBody, ¿vale? 00:14:31
lo que se ha hecho es 00:14:42
el planteamiento es cada vez 00:14:45
que se cargue este HUD 00:14:47
y esto pasará en el start una vez 00:14:48
cada vez que se cargue el nivel que tiene el HUD 00:14:51
es decir, cuando arrancamos un nivel 00:14:53
se han creado tres métodos 00:14:55
que estos los he creado yo 00:14:57
es decir, son métodos que he creado yo, no es ningún update 00:14:59
que venga como el que solemos usar 00:15:01
sino son tres métodos distintos 00:15:03
que lo que hacen es arranca el nivel, vale, pues voy a mirar 00:15:05
voy a chequear cuál es 00:15:07
el nombre que hay guardado del usuario 00:15:09
que tengo que mostrar, cuál es el número de vida 00:15:11
y cuál es la dificultad del juego 00:15:13
en relación a 00:15:15
eso, a 00:15:17
los valores que estamos cambiando en el 00:15:19
body de la bola, ¿vale? 00:15:21
Vale. 00:15:24
Aquí, si te fijas, a continuación 00:15:25
están los voids preparados 00:15:27
con correspondientes a cada uno. Esos 00:15:29
cajones que lo que hemos hecho es, mediante 00:15:31
tres líneas, aludir a tres 00:15:33
bloques diferentes, ¿vale? Para que se ejecuten 00:15:35
siempre, dado que están en el start, 00:15:37
en el momento, ¿vale? 00:15:40
En el momento en el que en cada nivel arranquemos. ¿Y esto por qué se hace? Porque cuando damos a jugar en el menú inicial, ¿vale? A ver, voy aquí un segundo, voy al menú configuración, al inicial, perdón, al dar yo a jugar querré que coja, por ejemplo, la información que yo he guardado en nombre de usuario que afecta a la bola según lo que yo tengo en dificultad, ¿vale? 00:15:41
Y si es la primera vez que juego, porque no he pasado el juego, que no lo estamos haciendo así, pues que arranque con las tres vidas. Quiero que al arrancar cada nivel, chequee eso y me muestre la información que yo necesito en ese HUD y afecte de la forma que a mí me interesa. 00:16:10
Vamos con el primero, que no va a ser el primero que tengo aquí, sino el de actualizar las vidas. Este método lo que hace es el que define cuántas vidas va a mostrar como imagen. Cuando decimos vidas, hay que tener bien claro que salgan tres corazones. 00:16:28
una duda, perdona, una pequeña duda 00:16:53
entonces por lo que veo 00:16:56
todo se ha metido en el mismo hook 00:16:57
todo se ha metido en el mismo lado 00:16:59
tanto el nombre como lo de las vidas 00:17:00
como lo del tema de la pantalla de inicio 00:17:03
pantalla que pasa, opciones 00:17:06
todo se ha metido en el mismo 00:17:07
y luego lo que has construido son prefabs 00:17:08
por el tema de las vidas, por ejemplo 00:17:10
y metiéndolas cada una en su escena 00:17:12
no, bueno 00:17:16
a lo mejor es lo que quiero decir 00:17:17
pero tú has dicho que luego hago cada prefab 00:17:19
no, yo en el propio prefab 00:17:21
¿Vale? Ya he preparado todo eso. Es decir, este prefab, cuando lo arrastre, ya tiene un array con las cuatro posibles vidas, si te fijas. 00:17:23
Vale, vale, vale. 00:17:32
¿Vale? Siempre, en todos los niveles, de momento, vamos a tener la posibilidad de usar estas cuatro imágenes, porque ya va, digamos, unido a este código en el propio prefab. 00:17:32
Porque lo guardan en un prefab, claro. Si yo hubiera generado esto en un nivel y luego voy a otro y creo otro canvas y tal, pues habrá que hacerlo todo de primeras. 00:17:41
pero el prefab lo bueno es que me está agrupando 00:17:48
por eso ese icono de caja 00:17:50
me está empaquetando 00:17:52
toda esta información y el único que 00:17:54
dejo sin vincular, que por eso 00:17:56
pone none, es este de rigidbody 00:17:58
este que 00:18:00
está aquí, ese es el único que digo 00:18:01
este sí que va a ir con 00:18:04
algún elemento concreto del nivel que va a ser 00:18:06
la bola, el resto se van a ir 00:18:08
gestionando a través de un game manager 00:18:10
que ahora vamos a eso 00:18:12
entonces fíjate 00:18:14
que yo lo que he hecho 00:18:16
es un poco redundante pero es que esto es importante 00:18:18
que quede claro, lo que he hecho ya desde el propio 00:18:21
prefab que voy a ir arrastrando los niveles 00:18:23
es decir, vale yo ya sé 00:18:24
el array que va a ser de cuatro 00:18:27
elementos y he metido una imagen 00:18:29
en cada una de las posiciones 00:18:30
y lo lógico es jugar a nuestro 00:18:31
favor en esto y he hecho 00:18:35
que además el orden, el índice 00:18:36
del array que corresponde 00:18:38
coincida con el número de vidas 00:18:40
es decir, el de cero que coincida con el 00:18:42
de cero vidas, el de uno uno 00:18:44
porque los arrays, como ya se veía en el tema 00:18:46
de introductorio, ¿vale? Y si no le damos 00:18:48
una vuelta, siempre empiezan a contar 00:18:51
desde el cero la primera posición, ¿vale? 00:18:53
Es el primer índice. Entonces, hemos 00:18:54
conseguido, ¿vale? Y si no, incluso 00:18:56
si no hubiéramos tenido la imagen, 00:18:59
por ejemplo, esta no existiera, 00:19:01
hubiéramos metido hasta una imagen, a lo mejor aleatoria 00:19:02
o algún placeholder 00:19:05
para hacer que coincida con estos números, porque así 00:19:06
es mucho más fácil luego a nivel de programación 00:19:08
nosotros saber que en todo 00:19:10
momento si apelamos a la imagen 00:19:12
en lives tres o la guardada, mejor dicho, en el orden, en la posición tres de este array, pues es la de las tres vidas, ¿vale? 00:19:14
Y yo he arrastrado también en este momento, ¿vale? Esto se ha arrastrado una vez porque lo que he hecho ha sido decir, vale, 00:19:23
lo que es este campo, ¿vale? Que hace referencia al campo texto, ¿vale? A un tipo de variable texto. 00:19:29
Y ojo, esto es importante también, que lo pone en el tema, para cuando vayamos a usar por código métodos o clases o cualquier cosa referenciada con la UI, con User Interface, con los componentes de User Interface, hay que cargar una nueva librería, bueno, nueva, una librería que hasta que no ponemos esta línea no se carga, para no sobrecargar los scripts, que es este UnityEngine.ai, ¿vale? 00:19:39
Ya lo he hecho más veces, pero si yo, por ejemplo, no hubiera introducido esa línea, ¿vale? Al principio, antes de la declaración de clase, ¿vale? Directamente estos tipos de variable no me los cogería. 00:20:06
Y esto cuando hablamos de los componentes, recordad que hay tipos de variables que en realidad son los componentes. Que si yo pongo un tipo de variable llamado text, luego lo que podría hacer con esta variable es acceder a todo lo que hay, a todos estos campos, a todas estas propiedades que tiene un componente tipo text. 00:20:19
De hecho, fíjate en el icono, en esta T, que yo cuando doy a Canvas, solo me permite arrastrar, fíjate que está esa T ahí otra vez, solo me permite arrastrar con lo que corresponde con esa caja, que es un componente de tipo text. 00:20:40
Es decir, yo sé que este GameObject, entre sus diversos componentes, hay uno de tipo text, pues yo cuando arrastre este GameObject me va a coger el componente text y voy a poder, por ejemplo, acceder al espacio de text, de escritura que hay y cambiarlo. 00:20:54
pero eso lo hacemos porque estamos 00:21:13
digamos, introduciéndonos en ese componente 00:21:16
si yo en este que tengo 00:21:18
aquí, que es el que muestra la imagen 00:21:20
que no tiene un componente tipo text 00:21:22
¿vale? por mucho que yo me empeñe 00:21:24
a arrastrar ese game object 00:21:26
a donde me pide un componente tipo text 00:21:28
no me lo coge, porque solo 00:21:30
busca objetos que dentro 00:21:32
tengan este componente ya aplicado 00:21:34
si no, no sabe que coger 00:21:36
¿vale? que eso de hecho es el tipo 00:21:38
que reclama en el paréntesis que tiene 00:21:40
cada uno de estos 00:21:42
¿Vale? Entonces, yo cuando he arrastrado esta variable, lo que estoy consiguiendo es meterme por código, ¿vale? Cada vez que haga mención a este username text, me estaré metiendo en ese componente que he, en este caso, cogido a través del editor. 00:21:43
Y aquí cuando, por ejemplo, pone username.text, con minúsculas el text, es dentro del componente que hemos capturado, que tiene que ser de tipo text, el .text es una de las propiedades que lo que permite es directamente meter un string con lo que tiene que poner. 00:22:01
¿Vale? Si yo aquí en vez de player desconocido dijera prueba probando, ¿vale? Si yo no cambio, ¿vale? Ahora vemos esto. Si yo no cambio el texto en ningún momento, vas a ver que yo cuando arranque el juego se estará, a ver, voy a un nivel y luego arranco. 00:22:21
Cuando arranco el juego, va a poner player probando. ¿Y esto por qué? Porque al arrancar el juego, recordemos que al hacer un start, aplica estos tres métodos. Y dentro del de username, lo primero que pone es, si no existe, esto ahora lo explico, lo del game manager. 00:22:42
Si yo no he introducido un texto en el menú configuración, este que hay aquí que te he enseñado antes, ¿vale? Este de aquí. Si tú en ningún momento has variado este dato, ¿vale? Entonces ponme directamente lo que yo, es decir, si no existe ese dato, introdúceme en ese texto este player probando, ¿vale? 00:23:03
Si no, ¿qué haces? Pues vas a escribir en esta variable, en su propiedad de texto, pues este texto que está compuesto de la palabra player siempre delante, porque lo que queremos es decir así, en plan, queremos que ponga siempre jugador, dos puntos y luego el nombre que hayamos introducido. 00:23:25
si no, en este caso 00:23:43
que lo dejábamos vacío, porque no había nombre 00:23:45
pues ponía player solo, pero si no 00:23:47
lo que hará será coger el nombre que hayamos 00:23:49
guardado en el game manager 00:23:51
ahora vamos a ello, ¿vale? 00:23:53
¿hasta aquí qué tal? 00:23:56
sí, bien, bien, lo voy entendiendo, bien 00:24:02
una cosa, bueno, bueno, sigue, sigue 00:24:03
no, no, sí, sí, sí 00:24:06
pregúntame mejor si puede ser 00:24:07
vale, pues mira, había una forma de convertir en 00:24:09
el tema de la 00:24:11
para convertir en strings 00:24:14
los datos 00:24:15
que era una fórmula me parece 00:24:17
un método 00:24:19
para convertir 00:24:20
para tener algo convertido en strings 00:24:22
simplemente 00:24:24
ah bueno, sí, ya sé 00:24:27
de lo que me hablas, pero bueno 00:24:29
componerlo entre dos puntos 00:24:30
entre comillas, ya es un string 00:24:33
si creamos un string, aunque sea 00:24:35
este 00:24:37
era para convertir datos numéricos 00:24:38
por ejemplo, en un string 00:24:41
claro, es que te voy a dar dos formas 00:24:42
una, la fácil que es esta 00:24:45
que es que tú en cuanto tienes algo de clara como string, 00:24:46
aunque sea este vacío y le sumamos un dato numérico, ¿vale? 00:24:50
Porque esto, bueno, este no es numérico, 00:24:52
pero si fuera numérico, cuando lo estamos, digamos, sumando, 00:24:55
que es una concatenación, lo convierte a string, ¿vale? 00:24:58
Pero si no, el que tú estás diciendo es el método, 00:25:01
y espera que te lo busco aquí para no equivocarme, 00:25:05
porque la verdad es que de memorieta igual no te lo digo bien, 00:25:07
se llama toString. 00:25:11
a ver, ahí está 00:25:13
lo vamos a poner en Unity porque esto además se usa 00:25:15
mucho el lenguaje de programación 00:25:17
¿vale? 00:25:18
tú, si pones ese 00:25:19
ese 00:25:23
tuString, ¿vale? aunque este ejemplo 00:25:26
no es el mejor 00:25:29
un segundo, tuStringFormatting 00:25:30
es que quiero que veamos un ejemplo, pero sí, es tuString 00:25:33
lo que hay que hacer es meter dentro 00:25:35
del 00:25:37
tuString 00:25:38
el string, ¿vale? 00:25:40
queramos que convierta. 00:25:43
A ver, ¿por qué soundflop 00:25:46
toString? Cogemos... 00:25:47
Bueno, pero es que este ejemplo 00:25:50
no es el mejor. Pero vamos, sí. 00:25:51
Este es el que yo creo que queremos. 00:25:54
¿Vale? 00:25:57
Convierte un dato 00:25:57
a un string. 00:25:59
¿Vale? Entonces... 00:26:02
Pero ya te digo que si 00:26:04
ponemos una apelación a un string 00:26:05
y luego lo concatenamos con ese 00:26:07
número, lo convierte todo a un string. 00:26:09
Es una forma más rápida quizá, ¿vale? Hasta aquí, si más o menos me vas siguiendo, aunque ahora volvemos, lo que estamos haciendo es eso, acceder en cada caso, ¿vale? A los tipos de variables que hemos declarado arriba que hacen mención a componentes que hay en el canvas, ¿vale? 00:26:11
Luego, importante, y esto es uno de los kits de la cuestión en esta práctica con respecto a otras, ¿vale? 00:26:35
Porque es, digamos, la primera vez que lo ponemos en juego, que es el concepto de las variables estáticas, las static, ¿vale? 00:26:43
En el tema se explica que hay, de hecho, un tipo de variable que es tan representativo, a ver si me deja verlo, ¿vale? 00:26:50
que cuando llamamos 00:26:57
a ver, aquí lo tengo, a un script 00:27:00
igual que creamos los otros, lo llamamos así 00:27:02
escrito, ¿vale? Con G mayúscula y M 00:27:04
mayúscula, un script GameManager 00:27:05
hasta nos cambia el icono 00:27:07
y nos pone otro, ¿vale? Para tener bien 00:27:10
claro cuál es 00:27:11
porque es, digamos 00:27:13
la función que se debería dar, luego 00:27:15
cada uno escribirá dentro lo que quiera y 00:27:17
la tuerca está, pero digamos que este tipo 00:27:19
de script es una convención, este nombre de GameManager 00:27:21
para ir metiendo dentro 00:27:23
los comportamientos comunes del juego 00:27:25
a lo largo de todos los niveles, ¿vale? 00:27:30
Dependiendo del juego, a veces hay que hacer 00:27:32
mucho más scripts, digamos, game manager, 00:27:33
pero bueno, en uno como este, que es simple, 00:27:35
que tampoco alberga muchísimos datos, 00:27:38
pues se puede hacer en uno. 00:27:40
¿Y esto para qué lo usamos? 00:27:41
Ya os digo, esto de la tuerca es solo visual, ¿eh? 00:27:43
Cuando lo abro es igual que cualquier otro script. 00:27:45
Yo he borrado lo del start y el update, 00:27:48
pero es exactamente igual. 00:27:50
¿Y qué es lo que se ha hecho aquí? 00:27:51
Este script empieza igual 00:27:52
Se ha llamado GameManager 00:27:56
Y por eso lo llamaremos GameManager 00:27:57
Mientras lo usemos 00:27:59
Pero todas las variables que se han declarado 00:28:00
Son de tipo estática 00:28:02
Si te fijas 00:28:05
Y también las variables estáticas 00:28:06
Para que funcionen con el uso que les vamos a dar 00:28:08
Tienen que ser declaradas así 00:28:10
Static, public y luego ya el tipo de variable 00:28:12
Y el nombre, como siempre 00:28:14
¿Qué conseguimos con estas variables estáticas? 00:28:15
Que se pueda acceder a ella 00:28:19
a este script 00:28:21
siempre que queramos, ¿vale? Yo puedo ir 00:28:23
a cualquiera, a ver, 00:28:25
aleatoriamente estoy haciendo así, me meto en 00:28:27
Employer Manager o en Loves Things, ¿vale? 00:28:29
Y yo, si me meto en cualquier, 00:28:31
siempre hay que escribir, eso sí, dentro de un 00:28:33
método, ¿vale? 00:28:35
O de ejecución o un método que queremos nosotros, ¿vale? 00:28:37
Que si escribo aquí fuera, pues no 00:28:39
lo detecta. Si yo empiezo a poner 00:28:41
GameManager, me va a salir 00:28:43
GameManager como un objeto que ya existe, 00:28:45
¿vale? Como una clase 00:28:47
que alguien ha hecho 00:28:49
un programador, la vamos a tener 00:28:50
accesible siempre, ¿vale? Y cuando le demos 00:28:53
al punto, todas las variables 00:28:55
estáticas, aparte de otras que ya 00:28:57
vienen por efecto cuando tenemos una clase, 00:28:59
van a venir declaradas, y son 00:29:02
estas que tiene la cajita azul, las variables 00:29:03
si te fijas, ¿vale? Dificultad, 00:29:05
lives, username, coinciden 00:29:07
con las de, a ver, el game manager, 00:29:09
¿vale? Lives, username, dificultad, 00:29:11
¿vale? Para poder hacer esto, 00:29:13
es la única forma de poder acceder desde 00:29:15
cualquier punto sin tener que declarar 00:29:17
en el script completo, esa clase, ¿vale? 00:29:19
Es que las variables que tenga adentro sean de tipo static public. 00:29:23
¿Y esto para qué sirve? 00:29:28
Porque cuando, si vamos gestionando los juegos hasta ahora 00:29:31
en niveles independientes, aunque pasemos de uno a otro... 00:29:34
Una pregunta, una duda, te me acaba de surgir. 00:29:37
¿Tienen que ser siempre públicas o serializadas también? 00:29:39
No, tienen que ser públicas, ¿vale? 00:29:42
Porque vamos a recordar la diferencia entre el serialized field y el public. 00:29:45
Por ejemplo, y de hecho voy al que estaba enseñando antes, 00:29:49
cuando declaramos una variable así, que no pone public ni private, 00:29:52
no pone nada referente al ámbito, 00:29:57
lo que estamos haciendo es que se pueda ver en el editor 00:29:59
y poder arrastrar en el editor el tipo de variable, 00:30:02
pero sigue siendo privada. 00:30:05
Yo a esta variable no puedo acceder desde otros scripts. 00:30:07
Pero en este caso, yo sí voy a querer que se pueda acceder desde otros scripts. 00:30:11
básicamente este GameManager 00:30:16
no se va a aplicar 00:30:18
en ningún GameObject del juego 00:30:20
no es su función 00:30:22
este GameManager 00:30:24
al declararlo con variables 00:30:26
estáticas públicas, lo que va a hacer es ir 00:30:28
albergando información que vamos a poder ir guardando 00:30:30
digamos, por encima incluso 00:30:32
del juego, como por detrás 00:30:34
en otro punto, y que vaya guardando 00:30:36
siempre ciertos valores 00:30:38
entre los distintos niveles 00:30:39
para que aunque el juego 00:30:41
digamos, estamos en el nivel 1 00:30:43
arrancamos el juego, tened en cuenta 00:30:46
que eso, nosotros arrancamos el juego 00:30:48
y nos metemos en configuración, aquí hay un 00:30:50
dato que pone Daniel, que yo 00:30:52
esa información la tengo que guardar en algún sitio 00:30:54
para que cuando yo vaya a otro nivel 00:30:56
a otra escena que carga otras cosas 00:30:58
siga conservando la información guardada 00:30:59
¿vale? es como un guardado 00:31:02
aparte de los niveles 00:31:03
de manera independiente a los niveles 00:31:06
¿vale? por eso es útil 00:31:08
los game managers, porque aquí, por ejemplo 00:31:10
en tu caso, que estás intentando poner 00:31:12
el volumen de la música, cuando tú pones 00:31:14
la música, al ir cambiando de nivel 00:31:16
hay que ir, digamos 00:31:18
metiendo diferentes 00:31:20
variables, es decir 00:31:21
distintos componentes de música en cada 00:31:24
nivel, o hay que hacer 00:31:26
algunas operaciones de que no destruya ese componente 00:31:27
porque al cargar el nivel, si aquí no hay 00:31:30
objeto, un GameObject que tenga 00:31:33
el componente 00:31:35
del AudioSource, que entiendo que es el que 00:31:37
estabas poniendo, no se va a oír la música 00:31:40
y aunque tuvieras otro, a lo mejor el volumen 00:31:42
de cada uno se irá variando según cada nivel 00:31:44
con esto conseguimos que siempre 00:31:46
por código podemos decir 00:31:48
vale, yo en este nivel de configuración 00:31:49
he puesto Daniel y yo de alguna 00:31:52
manera lo que voy a hacer es 00:31:54
en este campo de static public 00:31:55
que la información que alberga 00:31:58
aquí es Daniel 00:32:00
y yo después desde otro script de otro nivel 00:32:01
pues puedo decir, oye 00:32:03
cárgame lo que en algún 00:32:05
en la última vez que se ha guardado algo 00:32:07
en esta variable estática 00:32:09
me lo muestras 00:32:11
sobre todo me interesa que estés entendiendo 00:32:12
el objetivo 00:32:15
de esto, de estas variables 00:32:17
estáticas, las variables estáticas 00:32:19
para que puedan ser accesibles 00:32:21
desde cualquier otro 00:32:23
desde cualquier otra clase 00:32:24
es decir, de cualquier otro script 00:32:28
es eso, dime 00:32:30
mira, entonces 00:32:31
porque si hay una variable estática que se crea 00:32:33
que va a funcionar durante todo el juego 00:32:35
en todas las escenas, porque se va a mantener siempre igual 00:32:37
¿por qué no se hace todo el script 00:32:39
de antes, el que más se ha hecho al principio 00:32:41
porque nos hace directamente la estática 00:32:43
y ya ese se arrastra a todos los demás 00:32:45
porque 00:32:47
nosotros, es decir 00:32:49
para empezar 00:32:51
estas variables estáticas se pueden 00:32:53
declarar también en otros 00:32:55
en otros scripts 00:32:57
pero lo que queremos es 00:32:59
centralizar sin tener que aplicar 00:33:01
el game manager, tú ten en cuenta que 00:33:03
y esto pasaba al principio 00:33:04
si hacíamos un script 00:33:06
y luego no lo arrastrábamos a un game object 00:33:09
no se aplicaba ese script, es decir, si yo a este 00:33:11
Kanban no le arrastro este script 00:33:13
¿vale? no va a hacer 00:33:14
nada de lo que hace, porque no está en el nivel 00:33:17
lo que sí se puede 00:33:19
hacer es que cuando tenemos variables 00:33:21
estáticas públicas, no hace falta, este GameManager 00:33:23
no lo estoy arrastrando a ningún GameObject 00:33:25
da igual, porque digamos que son variables 00:33:27
que están a otro nivel 00:33:29
por supuesto que también se podrían declarar 00:33:30
¿vale? es decir, yo también podría declarar 00:33:33
esas tres variables que tengo en el GameManager 00:33:35
en otro script 00:33:37
Pero es verdad que si lo centralizamos en un GameManager, todo lo que sea común al juego lo tenemos unido, ¿vale? Y si lo mezclamos con otros comportamientos que sí que tienen que estar aplicados al juego, estaríamos como mezclando, por un lado, lo que es universal para el juego con lo que en este caso, por ejemplo, afecta al HUD, que es un GameObject específico, ¿vale? Entonces, es mezclar cosas que no se deberían. 00:33:39
además es que esto no es referente a ningún nivel 00:34:03
concreto, lo del hood manager 00:34:06
por ejemplo este rigidbody, si es 00:34:07
concreto de cada escena que habrá que decirlo 00:34:10
y el 00:34:12
estos campos si que se están 00:34:12
digamos dando acceso a que se pueda 00:34:16
modificar por código lo que hay en estas 00:34:18
variables, pero si que hace referencia 00:34:20
a algo específico que está en la escena 00:34:22
esto son información que se 00:34:23
guarda y luego nosotros vamos a 00:34:26
cargar en algún punto 00:34:28
¿vale? 00:34:29
esto de momento lo que me interesa es que entendamos 00:34:30
hasta aquí 00:34:34
vale, vale, entonces 00:34:34
las variables estáticas realmente son 00:34:37
sencillas, porque tú haces este game manager 00:34:40
y empiezas a hacer las variables que tú quieras 00:34:42
sabiendo qué tipo de datos vas a necesitar 00:34:43
guardar a lo largo del juego 00:34:46
y las dejas ahí preparadas, vale 00:34:47
y vuelvo al hand manager 00:34:49
ahora que he explicado esto, porque 00:34:51
por ejemplo, si yo no 00:34:53
he cambiado nada, es decir 00:34:56
si yo no he introducido, bueno 00:34:57
importante, claro, cuando declaramos 00:34:59
estas variables estáticas, si aquí no le decimos 00:35:01
que esto valga 3, ¿vale? 00:35:03
3 vidas por defecto o lo que quisiéramos 00:35:05
recordad que 00:35:07
significa que valen 0 o nada 00:35:09
es decir, si son variables 00:35:11
numéricas como este int o como este float 00:35:13
valen 0 y si es un 00:35:15
string, no es que valga 0 00:35:17
sino que vale, esto ya lo hablamos un día, vale 00:35:19
esto, esto no es 00:35:21
un espacio, que sería esto, esto es 00:35:23
igual a nulo, ¿vale? 00:35:25
Se conoce como un nulo. 00:35:27
Esto significa que este campo, aunque la caja existe, 00:35:29
lo que está albergando es un valor nulo. 00:35:33
No tiene nada dentro, ¿vale? 00:35:35
Lo digo porque hay que entender que hasta que no se guarde una información, 00:35:37
vale o cero o nulo. 00:35:41
Entonces, aquí, por ejemplo, esto se podría hacer de otra forma. 00:35:43
He puesto lo de nulo aquí por ver cómo se hace. 00:35:46
Se podría hacer de otra forma. 00:35:48
Pero si al arrancar un nivel, uno de los niveles, 00:35:49
que son los que cargan este HUD, 00:35:53
se mete aquí en el start y dice 00:35:55
a ver, vamos a ver, actualizar el username 00:35:57
el nombre que yo le he puesto porque yo he decidido 00:35:59
se mete y dice, a ver, si 00:36:01
este GameManager 00:36:03
y ves que estoy referenciando directamente 00:36:05
a la variable estática pública esta que tenemos 00:36:07
en el GameManager, si 00:36:09
el username no hay nada 00:36:11
porque no se ha cambiado nada en ningún 00:36:12
momento, se ha guardado otro valor en el menú 00:36:15
config, lo que 00:36:17
voy a enseñar es 00:36:19
entrando 00:36:20
en este componente 00:36:22
que yo he referenciado aquí por el editor 00:36:25
me meto en su parámetro 00:36:26
text y pongo player 00:36:28
porque nadie ha cambiado nada, entonces pongo un valor 00:36:30
por defecto, por eso 00:36:32
aquí ahora cuando voy al juego 00:36:34
a ver 00:36:36
cuando voy al juego 00:36:37
no escribo nada y juego 00:36:40
pues pone player 00:36:42
lo que pasa es 00:36:43
que si yo por el contrario 00:36:46
ya he introducido algún valor 00:36:48
en este username 00:36:50
Lo que va a hacer es coger ese username text y lo que va a escribir ahí. Y cuando digo ahí, para que quede claro, por si acaso, me meto en un nivel que tenga el hud, que es lo que estamos viendo ahora. Me meto en el hud y lo que va a hacer es meterse aquí. 00:36:52
Y cuando hago ese test.text, lo que hago es directamente modificar lo que pone ahí. Es decir, aquí lo que estoy haciendo es meterme en ese componente y en su propiedad text, eso hace referencia a este text de aquí, lo que yo ponga a continuación del igual es lo que se escribirá en esa caja. 00:37:09
¿Y qué es lo que escribo? Pues este player, porque quiero que siempre ponga player, como hemos dicho antes, y aparte después, pues lo que se haya guardado, ¿vale? Que además es de tipo string, ¿vale? El username es de tipo string, ¿vale? Pues lo va a poner a continuación. 00:37:27
¿Con eso qué conseguimos? Evidentemente todavía no hemos configurado el menú configuración, pero significa que yo de algún modo lo que introduzca aquí, ¿vale? Pongo José Luis, por poner un nombre que no sean los que pongo siempre. 00:37:41
José Luis, ¿vale? Y cuando yo suelto, aquí hay otro script que está guardando en ese game manager, en su variable username, ¿vale? Pues está guardando José Luis. Y ahí está, ya no es nula el username, ahora es José Luis. 00:37:58
por eso cuando yo juegue me va a poner ese player 00:38:13
y aquí me está cargando 00:38:16
lo que se había guardado aquí 00:38:17
y de hecho también se ve 00:38:20
más fácil, por si acaso es más fácil 00:38:21
entenderlo así, se ve que en username 00:38:23
ha puesto player José Luis 00:38:26
porque es lo que hemos puesto aquí 00:38:27
¿vale? que lo escriba ahí 00:38:29
¿sí? 00:38:31
Sí, sí, eso lo he puesto yo también, eso me ha salido 00:38:35
cuando en los juegos que he hecho yo 00:38:37
lo he puesto 00:38:39
Es decir, que tú lo que es el game manager 00:38:40
y el funcionamiento del texto 00:38:42
Sí que lo tenías dominado, ¿no? 00:38:44
Por ir 00:38:46
Sí, eso 00:38:46
Vale 00:38:47
Sí, eso 00:38:47
He puesto bien eso 00:38:49
He puesto en las opciones 00:38:50
Me pasa a una siguiente pantalla 00:38:51
Vale 00:38:53
Y entonces, bueno 00:38:54
Ahora te lo enseñaré cuando pueda 00:38:54
Y luego el return 00:38:56
Vuelvo otra vez para atrás 00:38:57
Luego de un kit 00:38:58
Lanzaconsola 00:39:00
Vale, sí 00:39:02
Ese 00:39:03
Ese 00:39:03
Lanzaconsola 00:39:04
Eso es 00:39:07
Vale, sí 00:39:08
Eso del application 00:39:10
Sí, eso es 00:39:11
Lo que te he comentado 00:39:11
Ya lo ponía 00:39:12
Ya pone que es hasta que no se te ocurra 00:39:12
tenga el build, el juego no 00:39:14
funciona, ¿vale? Pero bueno, que se puede dejar 00:39:16
preparado. Entonces, vamos a ir, si te parece, 00:39:18
con el de los sprites, 00:39:20
¿vale? Que es el que tenía dudas. 00:39:23
¿Sí? 00:39:25
Vale. El HUD Manager, 00:39:27
según arranca el juego, 00:39:29
¿vale? El número 00:39:31
de vidas está en cero, 00:39:32
¿vale? Porque, de hecho, estas vidas 00:39:35
que es un int, 00:39:36
en el config no hay ningún punto, ¿vale? 00:39:38
Tal y como está estructurado en el enunciado 00:39:40
y tal, no hay ningún punto que nosotros decidamos 00:39:42
con cuántas vidas se departen y cuántas 00:39:44
vidas son máximas, ¿vale? Nosotros estamos dando por 00:39:46
sentado que son un máximo 3. 00:39:48
Es la mecánica de juego que queremos. Y aquí, 00:39:50
cuando declaramos esta variable, que alberga 00:39:52
la información global que hemos dicho, 00:39:54
¿no? De supra... 00:39:56
por encima del juego, ¿no? La forma de decirlo 00:39:58
esto vale 0, ¿vale? Así que cuando 00:40:00
arrancamos el juego, vale 0 en lives. 00:40:02
¿Cómo se ha hecho esto? 00:40:05
Pues que al... 00:40:07
A ver... 00:40:08
No, este no es. Este. 00:40:09
Al actualizar las vidas, lo primero que se dice, vale, 00:40:12
si las vidas que hay en el GameManager son cero, es decir, 00:40:14
como está por defecto, directamente yo quiero que el valor del GameManager 00:40:18
vidas valga tres, ¿vale? 00:40:22
Y lo que se hace es, ¿vale? 00:40:24
Ya vale tres. 00:40:26
Es decir, aquí se ha creado una variable nueva, ¿vale? 00:40:27
Esta no existía, de tipo in, que son las vidas, ¿vale? 00:40:30
Es decir, esta variable solo va a existir en este ámbito de lives. 00:40:33
¿Y qué es lo que va a hacer esto? 00:40:36
guardar el número 00:40:38
que tengan las vidas en cada momento 00:40:41
¿vale? cuando empezamos 00:40:43
GameManagerLives vale 3 00:40:44
así que lives pasa a valer 3 00:40:47
¿qué es lo que estamos haciendo? 00:40:49
y esto seguramente sea la parte liosa y ahora 00:40:51
le damos las vueltas que haga falta, pero 00:40:53
tengo aquí 00:40:54
una referencia ¿vale? que teníamos 00:40:56
aquí al componente imagen 00:40:59
que es el que carga la imagen ¿no? 00:41:00
es el que está en el GameObject y aparte 00:41:02
hay que meter 00:41:05
el sprite, es decir 00:41:06
si yo voy a lives image 00:41:09
el punto sprite se refiere 00:41:10
al source image, es la imagen que metemos 00:41:13
aquí, que es un sprite, hay que meterlo como un sprite 00:41:15
entonces 00:41:17
lo que estamos haciendo aquí es diciendo 00:41:18
dentro de la variable que hemos 00:41:21
arrastrado aquí en el editor 00:41:22
dentro del sprite que muestra 00:41:24
méteme la imagen 00:41:26
correspondiente al array que yo he configurado 00:41:28
antes, este que tenemos 00:41:31
aquí, hay un 00:41:33
tipo de clase que de hecho 00:41:35
no es del arte.y porque se usa 00:41:36
en más contextos, a diferencia de text o image 00:41:39
que son componentes de la UI 00:41:41
propiamente dicha, los sprays 00:41:42
se usan como contenedor de 00:41:45
imagen, ¿vale? Y esta se usa 00:41:47
también en 2D, etc. Se ha hecho 00:41:48
este array, ¿vale? Que ya en el propio 00:41:50
prefab del hub, ¿vale? 00:41:53
En el propio prefab, ya habíamos 00:41:55
que esto también lo habías hecho tú por lo que me has comentado 00:41:57
habíamos arrastrado 00:41:59
a ver, en el canvas 00:42:01
habíamos arrastrado los cuatro posibles 00:42:02
prefabs vale la posición cero de la raíz es muerte la de uno es una vida la de vale así hasta tres 00:42:05
el componente imagen va a servir para cargar en cada momento una imagen la que sea yo por 00:42:11
defecto vale como yo porque sé que estoy creando el juego no tú en tu caso sé que 00:42:30
la imagen que quiero que haya cuando arrancó el juego sea la de 3 no pero 00:42:36
nosotros aquí lo que vamos a ir es de las imágenes vale este de hecho este 00:42:41
iconito que aquí es el de sprite vale aquí podemos ir arrastrando sprites 0 1 00:42:46
ves que aquí la imagen y voy a poner un nivel para que lo veamos aplicado 00:42:51
Nivel 1, ¿vale? Esta imagen va a ir variando según la que yo arrastre a esa imagen. Digamos que el componente image lo que hace es cargar una imagen y lo que vamos a hacer es jugar con el array para decirle cuál tiene que cargar de las que hemos metido en ese array. 00:42:58
¿vale? 00:43:13
entonces 00:43:15
para 00:43:15
a ver, voy aquí 00:43:18
eso, yo aquí puedo ir arrastrando 00:43:20
y ves que aquí se verá, y de hecho en la ejecución 00:43:23
del juego, cuando se muera y se quite 00:43:25
una vida, en el image 00:43:27
va a ir mostrando un diferente 00:43:28
un diferente 00:43:30
sprite, ¿vale? 00:43:32
una cosa es el componente image y otro 00:43:34
el sprite que se mete como 00:43:36
imagen que se muestra, son dos cosas 00:43:38
distintas, ¿vale? 00:43:40
Y es verdad que al principio lía un poco. Yo cuando arranque este nivel, de hecho, vas a ver que automáticamente, aunque yo he arrastrado aquí el lives 0, ¿vale? Cuando le dé al play se va a poner el de 3, ¿ves? ¿Por qué? Porque yo tengo definido que cuando arranque el juego, al empezar este nivel, ¿vale? Si no he, recordemos, si no he variado en ningún momento y no lo he hecho, lo que guarda el game manager en su variable de vidas, como es 0, me pone 3, ¿vale? 00:43:42
Ahora mismo este dato lo que alberga es un 3, un int, un número entero 3, ¿vale? Cuando empieza el juego decimos el número de vidas, otra variable, son 3. ¿Y qué es lo que hacemos? Y esta es la clave, ¿vale? Y le damos, lo repasamos varias veces si quieres. 00:44:09
hay la alusión al componente imagen 00:44:24
y le decimos, vale, dentro de ese componente imagen 00:44:28
dentro del sprite, es decir, con esto 00:44:31
lo que estamos haciendo referencia ahora mismo es 00:44:33
a este hueco que hay aquí, a este campo 00:44:35
lo que pongamos después de este igual 00:44:38
significará el sprite que va a cargar aquí 00:44:42
y tiene que ser un sprite porque este tipo de parámetros 00:44:45
solo admite sprite, solo admite imágenes 00:44:48
seleccionar sprite, de hecho, lo pone ahí 00:44:51
entonces lo que habrá que hacer es cargar un sprite esto es muy importante 00:44:53
siempre saber qué tipo de variable es la que va en cada sitio dentro de el 00:44:59
componente imagen y el campo de search image que se escribe como sprite aquí 00:45:03
tiene que ir algo de tipo sprites por eso hemos creado aquí en algún momento 00:45:08
una variable de tipo sprites vale porque no carga imágenes imágenes es del 00:45:12
componente lo que carga son sprites que es como se llama las imágenes realmente 00:45:16
¿Vale? Entonces, aquí lo que se le dice es, cárgame de los sprites que he guardado dentro de la variable life array, ¿vale? Recordad que poniendo estas dos llaves después del tipo de variable se dice que puede albergar varios valores porque es un array, ¿vale? 00:45:20
Y luego, para llamar al contenido que hay aquí, hay que poner el nombre de esa variable y dentro de las llaves la posición o índice, ¿vale? Del array que vamos a cargar. 00:45:41
Entonces, ahora mismo, cuando arrancamos el juego, estamos diciendo, vida son tres, ¿vale? Tres, tres. Este es el valor que se está guardando, ¿vale? 00:45:54
Y entonces, como aquí tengo albergado un 3, va a decir, en este momento, ¿vale? Cárgame en la imagen del array de sprites que tengo el que esté en la posición 3. Por eso al arrancar el juego siempre me va a enseñar la imagen que esté en el elemento 3, ¿vale? 00:46:02
Si yo aquí dijera, cárgame, ¿vale? Lo manipulo, ahora esfuerzo que siempre enseñe el 1, ¿vale? Pues ahora siempre que arranque, siempre que arranque el juego, incluso aunque aquí yo he cargado en el editor antes de darle al play y antes de que se haga todo lo que está en el start del script, ¿vale? 00:46:21
Yo arrastré el lives cero, lo que va a hacer es mostrar el de solo una vida, porque le estamos forzando a que del array que hemos configurado solo me enseñe el de una vida. Lo que vamos a ir haciendo en cada momento es que cada vez que se reinicie el nivel, ¿vale? En este start, al hacer estas operaciones, me va a ir enseñando lo que esté guardado en la variable lives. 00:46:39
y siempre va a coincidir con el número de vidas 00:47:01
porque si empieza el juego 00:47:04
vale 0 y lo pasa a hacer 3 00:47:06
¿vale? pero 00:47:08
nosotros lo que tendremos que ir haciendo es que 00:47:09
cuando nos vayamos 00:47:12
muriendo en el precipicio 00:47:14
lo que vamos a hacer es cada vez que nos caemos 00:47:15
el game manager vidas 00:47:18
le resta una vida 00:47:20
entonces ahora en ese 00:47:21
game manager si nos hemos caído una vez 00:47:23
game manager lives 00:47:26
valdrá 2, se guarda en todos los niveles 00:47:27
resetea el nivel y el hand manager 00:47:30
cuando vuelve a leer todo lo que 00:47:31
está aquí, todos los métodos 00:47:34
que tiene que arrancar al principio 00:47:36
que tiene que interpretar al principio 00:47:37
pues va a decir, vale, vale 00:47:39
dos, si game manager lives 00:47:42
vale cero, le pongo esto, no, vale 00:47:43
dos, así que sigo, y aquí 00:47:46
lo que hace es guardar en lives lo que valga 00:47:48
en ese momento, que es dos 00:47:50
y que es lo que va a hacer aquí, mostrar 00:47:51
la posición dos de la array 00:47:53
de imágenes, de sprites 00:47:55
¿vale? que es la de 00:47:58
las dos vidas, porque aquí esto 00:47:59
en ese momento pasará a valer 00:48:01
dos, que me vuelvo a caer 00:48:03
y se reinicia otra vez el nivel 00:48:05
pues nuevamente en precipicio de las 00:48:07
dos que había se restará una 00:48:09
¿vale? y aquí volverá a hacer 00:48:11
otra vez toda la operación, a ver 00:48:13
¿vale cero o no? ¿vale? pues entonces 00:48:15
lo que guardo es uno, que muestro 00:48:17
la raíz de sprites que 00:48:19
tenía, el que corresponde con uno 00:48:21
que me vuelva a caer y vuelvo a 00:48:23
restarle uno y se encuentra con cero 00:48:25
Pero ya está configurado para que si ese Game Manager vale cero, ¿vale? Para empezar, cuando volviera a cargarse el nivel, las vidas serían tres, volvería, nunca mostraría la vacía, ¿vale? Pero aparte es que ya está forzado para que cargue el nivel de inicio, ¿vale? Voy a jugarlo un segundo y lo vemos. 00:48:27
espera, voy a empezar de hecho 00:48:48
desde el menú de 00:48:52
inicial, bueno, he cambiado 00:48:54
el sprite que hay por defecto 00:48:57
aunque como por código se actualiza 00:48:59
pues se cambia solo, pero 00:49:00
yo ahora mismo al jugar 00:49:02
como el número de vidas era cero, me lo ha puesto 00:49:04
a tres, ¿no? por lo que hemos visto antes de 00:49:06
esto que tenemos 00:49:08
aquí, ¿vale? y me ha cargado 00:49:10
el array tres, por consecuencia, si yo me 00:49:12
caigo 00:49:14
choco con un 00:49:15
con un 00:49:19
collider 00:49:21
que está configurado con otro script 00:49:23
para que reinicie el nivel y le reste una vida 00:49:26
al lives del 00:49:28
game manager 00:49:30
ya me ha puesto dos, que yo me vuelvo a caer 00:49:31
me pone uno 00:49:34
que yo me vuelvo a caer no me va a poner cero vidas 00:49:35
lo que hace es que como un game over 00:49:38
yo ya me he salido del juego 00:49:39
ahora mismo habría cero vidas 00:49:41
realmente en el game manager lives 00:49:44
cuando arranco otra vez como vale cero 00:49:46
me lo pone en 3 y así infinitamente 00:49:48
entonces ya 00:49:50
lo bueno es que si yo pierdo una vida 00:49:52
gracias a esa variable estática pública 00:49:53
yo ahora mismo tengo 2 vidas 00:49:56
y al cambiar de nivel lo que me carga 00:49:58
son las 2 vidas y no las 3 00:50:00
que pasa cuando tengo 0 00:50:02
¿vale? lo que hemos hablado es que va 00:50:04
entre niveles guardando 00:50:06
los valores 00:50:08
¿vale? ¿qué tal hasta aquí? 00:50:09
bueno yo si sigo jugando 00:50:13
pues eso 00:50:14
Sí, sí. Vale, vale. 00:50:15
Sí, esa es la idea. 00:50:16
Entonces, cuando tú metes un image, 00:50:18
lo que se hace es, 00:50:19
búscame la referencia de estos sprites, 00:50:21
es lo que le estás diciendo más o menos. 00:50:22
Claro, el problema es la nomenclatura, 00:50:24
porque image parece que se refiere a imágenes, 00:50:27
y sí, se refiere más que a imágenes 00:50:29
al reproductor de imagen, vamos a decirlo así. 00:50:31
Las imágenes en sí, 00:50:34
lo que son las imágenes en sí, 00:50:36
se llaman sprites, 00:50:37
y tienen otro tipo de variable también, ¿vale? 00:50:38
Y eso es lo que hay que cargar 00:50:41
dentro del componente image, un sprite. 00:50:42
Pero no ha habido que, por ejemplo, en el vídeo de Álvaro lo que se hace es, que es otra forma de hacerlo, según lo que se va viendo, según lo que se busque en cada momento. 00:50:45
Pero yo puedo tener, claro, aquí lo que estamos haciendo es sombrear los niveles. 00:50:59
Él lo que hacía era, y voy a cargar el de tres, él lo que hacía era coger un sprite, a ver, por ejemplo, cogía esto y lo que él explicaba, si no me equivoco, 00:51:04
es que iba, que también se puede cambiar por código, 00:51:13
poner otro tipo de imágenes, que es como considerar 00:51:16
que todo el área de la imagen que hemos metido 00:51:19
se puede manipular y se puede hacer un recorte. 00:51:22
Entonces, cuando pierdo una vida, lo que hago, 00:51:25
en vez de cargar otra imagen que solo tiene los dos corazones, 00:51:27
no es otra imagen, estoy variando otro valor 00:51:31
que es que puedo recortar esta imagen hasta aquí. 00:51:33
Que pierdo otra vida, pues le digo, me meteré otra vez 00:51:36
en el componente image y me meteré en fill amount. 00:51:39
De hecho, mira, si yo, por ejemplo, me meto en livesImage, que es el que está referenciando a ese componente, habrá otro que se llama fillAmount. Y yo con esto puedo decirle que esto valga 0.75. Bueno, lo estoy escribiendo de pena. Igual a 0, que no estaba mirando. 0.75. 00:51:42
¿Vale? Si yo, de hecho, fíjate, ahora arranco el juego, ¿vale? Y lo pongo en 1, cuando arranque el juego, no me lo está haciendo porque no se estará cumpliendo la condición. 00:52:04
pero a ver, espera, la hicimos filamón, a ver, estoy accediendo a él, ah bueno, es que no he guardado, que leches, vale, a ver, ahora sí que debería hacerlo, vale, ves que se ha puesto por código, si es que lo bueno de poder acceder a los componentes es que ya podemos acceder a cualquier cosa que tenemos aquí, con saber, con ver cómo se llama cada cosa aquí, ya sabemos que se puede ir poniendo aquí, 00:52:16
Por ejemplo, yo que sé, yo sin tener ni idea digo fill method, ¿vale? Pues aquí habrá, como estoy dentro del componente image, ¿vale? Pues habrá un, ¿vale? Mira, aquí está. Habrá un tipo de propiedad que es fill method, luego hay que ver qué es lo que permite hacer, ¿vale? Pero eso permitirá entre estas opciones, pues cambiar entre estas en ciertos momentos que a nosotros nos convenga en tiempo de ejecución, ¿vale? 00:52:47
¿Qué tal hasta aquí? Más o menos se va entendiendo. A ver, simple, ¿vale? Simple porque lo que vamos a hacer es cargar imágenes una tras otra, varias, y entre esas se van cargando. 00:53:12
Vale, entonces 00:53:28
Esto resuelto más o menos 00:53:31
Espera que yo no sé si sigues estando 00:53:35
A ver 00:53:36
Vale, bueno, me pone que estás 00:53:38
No me contestas, pero 00:53:43
Voy a ir a 00:53:44
Por lo que me has ido diciendo 00:53:47
Los botones ya los tenías configurados 00:53:49
En el 00:53:51
Menú inicial 00:53:53
Voy al menú configuración 00:53:55
Que probablemente sea lo más complicado 00:53:57
¿Vale? 00:53:59
Si nos fijamos, esto ya no es el HUD, esto es otro canvas, ¿vale? Que hay aquí, pues que hemos configurado con un image que hemos cargado, otro sprite que es el de este fondo para que ocupe todo el fondo. 00:54:01
Hemos puesto un slider, ¿vale? De los distintos componentes que puede haber en la UI. Pues en el tema se explican, ¿vale? Aquí esto sería un slider, que es el slider. 00:54:12
Y esto viene del tema, tiene diferentes subapartados. Uno para configurar, por ejemplo, el handle que es, en este caso, esta bola, el manejador que sirve para identificar qué se arrastra. Luego, cuál es el área que está rellena. Si yo voy avanzando aquí, veréis que hay una zona roja y otra verde. 00:54:23
Pues el fil área es lo que está relleno, lo que se ha modificado y el background se refiere a la parte que está sin marcar del slider, ¿vale? Como va de izquierda a derecha, cuando digo sin marcar me refiero a que no se ha completado, ¿vale? 00:54:42
bueno 00:54:58
Javi creo que te has 00:55:00
desconectado, pero bueno, lo que me importa de esto 00:55:02
es que esos 00:55:04
diferentes 00:55:05
elementos 00:55:07
de GameObjects, de UI 00:55:10
¿vale? 00:55:12
tienen sus propias propiedades y esa es la gracia que tienen 00:55:14
que el botón, por ejemplo 00:55:16
este botón de volver, cuando nos metemos 00:55:18
tiene en la parte 00:55:20
inferior 00:55:22
unos métodos, digamos 00:55:23
por eso tiene esos paréntesis 00:55:26
que permiten hacer acciones sin tener que hacer mucho esfuerzo. 00:55:27
Por ejemplo, este onClick, lo que significa, los botones vienen así configurados, 00:55:31
es que cuando yo hago clic en ese botón, puedo arrastrar cualquier script, 00:55:35
que en este caso se ha arrastrado uno que se llama canvas, que se ha hecho aquí, 00:55:40
que se llama, no, perdona, loadScene, que básicamente lo que se ha hecho es arrastrar este script ahí. 00:55:45
Es un script que ni siquiera está aplicado a ningún object, 00:55:53
Se ha arrastrado directamente al botón y entonces ese botón, ese load the scenes, que lo abro aquí, está configurado simplemente. A ver, y aquí algo he tocado. Ah, bueno, estaba así. 00:55:55
Lo que configura es un método. Y ojo, para que lo detecte ahora en las posibilidades que ofrece este tipo de eventos, de métodos eventos que tienen las distintas interfaces, es que luego nos podemos meter dentro de las funcionalidades que tiene ese script que hemos adjuntado. 00:56:08
Y ahí, por ejemplo, uno referente a los métodos que hemos creado nosotros, ¿vale? Con un botón, por ejemplo, podemos decir que este GameObject, pues por ejemplo, se active o se desactive, ¿vale? Y entonces yo cuando le doy aquí, lo que puedo hacer es que se active o se desactive un nivel, ¿vale? 00:56:28
Porque lo que estamos haciendo es que este canvas, ahora por ejemplo he cogido el canvas y se ha arrastrado ahí, que esto haga que se active y se desactive el canvas. 00:56:48
Claro, cuando se activa y se desactiva el canvas, lo que sucede es que se deja de ver. A ver, cuando lo toque, pues se va y se ha desactivado todo el canvas. 00:56:56
Es decir, se puede manipular multitud de cosas diciendo que cuando se haga clic en ese botón, pues pasen cosas. 00:57:05
Por ejemplo, yo en este loadScenes se ha generado un método, y para que se vean, vuelvo a decir, tienen que ser métodos públicos, un método llamado loadScene, que se parece un poco al nombre de la clase, del script, pero no es exactamente igual. 00:57:12
Ahora nos fijamos que si la escena en la que estamos es la 1, cuando le damos a ese botón, lo que hará... 00:57:26
A ver... Ah, bueno, vale. Fijaos que lo que hemos hecho es ponerle un parámetro también. 00:57:39
Bueno, espera, es que no quiero adelantarme, pero cuando cargamos este load scene, cuando arrastramos este script load scenes, 00:57:45
¿Vale? Aquí nos va a permitir ver las funciones que haya declaradas públicas. Aquí ahora mismo, como da error, ¿vale? Pues no se ve. Pero si yo vuelvo aquí con esto bien arrastrado, a ver, ¿vale? Y ojo, ¿vale? Perdona, que esto no lo he dicho. Para poder arrastrarlo, primero tiene que estar en un GameObject, ¿vale? Tiene que estar en un GameObject. 00:57:55
Yo lo he arrastrado aquí, pero no tanto para que se aplique desde este GameObject, sino para poder arrastrarlo desde aquí, ¿vale? 00:58:18
Y aquí que pueda decir, vale, de los scripts que tengo aquí activos, que me cargue este, ¿vale? 00:58:27
Entonces, ¿qué es lo que estamos consiguiendo? 00:58:35
Al arrastrar este canvas, podríamos decir, por ejemplo, quiero que accedas a los métodos del otro script que hay aquí arrastrado, ¿vale? 00:58:37
Que es el config menu. 00:58:43
Pues yo, si busco aquí, habrá otra referencia, config-menu. Y aquí enseñará los métodos, que muchos ya vienen por defecto, son los que vienen, todos los métodos públicos que haya dentro de ese script que estemos referenciando. 00:58:44
En loadTheScene, si os fijáis, está el método loadTheScene que habíamos creado aquí. Por eso yo lo puedo buscar dentro de loadTheScene y ver loadTheScene. Se ven los métodos públicos que hay. También hay otro salir que está ahí creado, que también es público y por eso sale ahí. 00:58:58
Si yo pusiera esa función de salir, lo que hará este botón cuando le demos a volver es un application quit, que es que se quitaría el ejecutable. 00:59:14
Entonces, a ver, espero que borra algo que no debía. 00:59:27
Lo que se puede hacer es no solo decir que se ejecute lo que hay dentro como en este salir, sino, como ya vimos, incorporar un parámetro. 00:59:30
¿Y qué significa eso? 00:59:39
Que nosotros, en cualquier momento, con este script, cuando carguemos su método público, loadScene, nos va a permitir pasar un valor aquí. ¿Y qué valor es ese? Si no hubiéramos puesto este parámetro, aquí no saldría nada, como pasaba antes con salir, que simplemente ejecuta salir, no hay más opciones. 00:59:41
Si vamos, de hecho, y voy a hacer otro ejemplo, si yo voy poniendo aquí más parámetros, por ejemplo, int scene y aparte, no sé si va a admitir más de uno, flow número dos, yo que sé, en principio debería permitir, a ver, voy a load the scenes, vale. 01:00:01
Bueno, en otras funcionalidades se podría. 01:00:23
Solo permite un máximo de un parámetro, ¿vale? 01:00:26
Pero hay otras funcionalidades que se pueden incluso pasar varios parámetros y dejan distintos campos. 01:00:29
Esto pasa, por ejemplo, en los eventos de animación también se podrían hacer este tipo de cosas. 01:00:33
¿Pero qué permite esto? 01:00:38
Que cada vez que tengamos un botón y arrastremos un objeto que tenga este script cargado, ¿vale? 01:00:39
A ver, que no he debido de guardar. 01:00:49
Efectivamente. 01:00:51
Si yo en el botón arrastro el objeto canvas y yo busco dentro de lo que tiene el script loadScenes con su variable, con su método, perdón, loadScenes, ves que entre los parámetros hay uno que va a pedir de tipo int, que es ese que hemos creado que se llama escena, int escena. 01:00:52
y ahí nosotros 01:01:16
podemos ir diciendo 01:01:18
que vaya la escena, en este caso 01:01:19
cero, creo que si no me equivoco 01:01:22
porque la escena de las que tenemos aquí 01:01:23
la escena en los build settings 01:01:26
la cero es la del menú inicial, es decir, yo voy a 01:01:28
querer que vuelva al dar el botón 01:01:30
al menú inicial, que ojo 01:01:31
que si yo pusiera la uno, iría al nivel 01:01:34
uno, vamos a hacer la prueba 01:01:36
si yo le doy a 01:01:37
aquí, al botón 01:01:39
vuelvo al 01:01:42
menú inicial, si yo 01:01:43
rápidamente dijera que este botón 01:01:45
a donde me tiene que llevar es al nivel 1 01:01:47
porque es el índice de los 01:01:49
build settings, ¿vale? 01:01:51
Ahí estoy haciendo referencia al nivel 1 01:01:53
de los build settings, ¿vale? 01:01:55
Ahora cuando arranque el juego y le dé 01:01:57
al volver a donde me lleva es al 01:01:59
nivel 1, fijaos. 01:02:01
O si pusiera el 2, el 3, etc. 01:02:03
¿Y esto por qué? 01:02:05
Lo voy a poner 0, que es el que nos interesa 01:02:07
porque aquí 01:02:09
lo que pasamos es 01:02:11
un número, que es el que ponemos en el inspector 01:02:12
si la escena 01:02:15
es igual a 1 01:02:17
aparte quiero que en 01:02:18
este game manager 01:02:21
omnipresente 01:02:22
que hablamos, ¿no? siempre 01:02:25
si es la escena 1, recordad que es 01:02:26
la escena de que empieza el juego 01:02:29
y ahí siempre queremos empezar el juego 01:02:31
con las vidas a 3 01:02:33
guardaría ese nivel de vidas en 3 01:02:34
para que nuevamente 01:02:37
toda la lógica de esos sprites 01:02:38
pusiera la posición 3, el índice 3 de los distintos arrays. 01:02:40
Pero bueno, esto es como algo circunstancial en caso de que se diera esa condición. 01:02:46
Lo importante es que lo que va a hacer es, y recordemos, para el gestor de imágenes 01:02:49
hay que usar la librería de Scene Management, lo que vamos a decirle es que cargue la arcena 01:02:53
correspondiente al número que hemos escrito en el inspector, que en este caso será la 0, 01:02:57
que es la del menú inicial. Entonces es muy fácil con estos botones, con una configuración como esta, 01:03:02
Por ejemplo, ir al menú inicial y si os fijáis de los tres botones que se han puesto, dos, ¿vale? Si voy a los dos botones, dos tienen exactamente el mismo load scenes y lo que se va variando en cada botón sin más esfuerzo es la función que coge y según el parámetro va a un nivel o a otro cada botón, ¿vale? 01:03:08
El play uno, el play va al uno y además pondrá la vida a tres, que es lo que hemos visto antes en este config y al nivel cinco, que es este nivel, ¿vale? Según se ha configurado en los build settings. Y bueno, y el otro, el otro botón, el de kit, también con el mismo script de load the scenes, pues está aludiendo, hemos puesto que aluda al otro método, ¿vale? 01:03:32
Porque recordemos que en lo de scenes, aparte de verse el log que viene por defecto, pues también estaba el de salir. Entonces, con un solo script, que eso sí, recordad, hay que cargar en algún elemento, que es el que arrastramos aquí, ¿vale? Es decir, que hay que cargar algún game object, ¿vale? Hay que arrastrarlo. 01:03:57
no se puede arrastrar directamente 01:04:15
el script desde el inspector 01:04:18
no se puede hacer 01:04:19
a ver, esto por ejemplo no se puede coger 01:04:20
el loads of scenes que tengo aquí 01:04:24
¿vale? y decir 01:04:25
una pregunta 01:04:30
esto no debería funcionar 01:04:32
bien, dime 01:04:34
mira, una cosa 01:04:36
por ejemplo, he visto que 01:04:37
has arrastrado el canvas entero 01:04:40
¿puedes arrastrar 01:04:41
una parte del canvas o tiene que ser entero 01:04:44
todo. Hay que arrastrar 01:04:46
el elemento del canvas que tenga 01:04:48
el script que vas a usar. 01:04:50
El elemento del canvas. Si arrastras el 01:04:52
canvas entero, la pues le alfarda, 01:04:53
¿no? Entiendo. No, no. De hecho, estoy 01:04:56
arrastrando el canvas entero. 01:04:58
Esto es como 01:05:00
cuando antes arrastraba 01:05:01
en el HUD. Me estoy quedando sin voz, perdona, 01:05:03
que igual en algún momento empiezo 01:05:06
a ronquear. 01:05:08
Me voy al HUD, ¿vale? Que habíamos configurado. 01:05:10
Si te fijas, ¿vale? 01:05:12
Cada uno de estos elementos que vamos 01:05:14
arrastrando tiene un color, un 01:05:16
iconito, ¿vale? Esto depende 01:05:18
de que yo estoy arrastrando 01:05:20
un GameObject, pero yo de ese GameObject 01:05:21
luego cojo una parte, un componente 01:05:24
¿vale? Entonces da igual 01:05:26
que GameObject sea, si al final lo que va 01:05:28
a coger de ese GameObject es el script 01:05:30
load the scenes, fíjate en el icono este 01:05:32
del asterisco 01:05:34
Sí, sí, va a coger el que está asociado al script 01:05:34
Solo va a coger el asterisco, bueno, por defecto 01:05:38
coge todo el objeto, ¿vale? Mira, fíjate 01:05:40
yo arrastro el canvas y está 01:05:42
el objeto, lo que pasa es que como nosotros sabemos que 01:05:44
En ese canvas pusimos ese script, que esta es la clave de los botones. 01:05:46
Nosotros en la función nos podemos ir metiendo, fíjate, en todos los componentes que tenga ese objeto. 01:05:50
Es decir, estos son los distintos componentes, el transform que tiene siempre, red transform, canvas, quédate con los nombres. 01:05:57
Porque yo arrastré el objeto canvas y yo ahora aquí puedo meterme en red transform, canvas, en todos sus parámetros y cambiarlos. 01:06:04
entonces se pueden hacer un montón de cosas 01:06:12
la cosa es que también tenemos un script 01:06:15
con dos variables públicas 01:06:17
que permitan hacer eso 01:06:19
pero ojo, nuevamente, ¿vale? 01:06:20
como ejemplo 01:06:23
yo puedo, ese script 01:06:23
de, a ver que me 01:06:27
vuelvo loco a veces un poco 01:06:29
de load the scenes, ponerse la event system 01:06:30
por decir algo, ¿vale? se lo agrega ahí 01:06:32
¿vale? y yo lo que hago 01:06:34
en el botón es decirle, vale 01:06:37
yo quiero que cojas del event system 01:06:39
dentro de todo lo que tiene 01:06:40
load the scenes 01:06:42
y load the scene 01:06:43
la 5 01:06:45
y ya está 01:06:45
porque realmente 01:06:46
el game object 01:06:47
es algo 01:06:48
recordad 01:06:49
del primer día 01:06:50
que un game object 01:06:51
es simplemente 01:06:52
un empty 01:06:53
¿vale? 01:06:55
con un transform 01:06:55
eso sí tiene 01:06:56
lo del game object 01:06:57
y un transform 01:06:58
¿vale? 01:06:58
pero luego le vamos poniendo 01:06:59
los componentes 01:07:00
que es lo que hace 01:07:01
que un game object 01:07:01
se vaya convirtiendo 01:07:02
en unas cosas 01:07:03
o en otras 01:07:04
¿vale? 01:07:04
entonces da un poco igual 01:07:05
que está aquí 01:07:06
o en cualquier sitio 01:07:07
sí que hay que 01:07:08
Meterlo en algún objeto 01:07:09
Porque aquí solo permite meter objetos 01:07:12
Porque yo no puedo 01:07:14
Se puede, ¿vale? Pero va a dar problemas 01:07:15
No se puede cargar directamente 01:07:17
Desde el panel de proyectos 01:07:20
Los assets 01:07:23
Tiene que ser desde la jerarquía 01:07:23
¿Vale? De la escena concreta en este caso 01:07:26
¿Vale? Esto a diferencia del game manager 01:07:28
Si que alude a elementos que están 01:07:30
Dentro del nivel 01:07:32
Por eso el game manager 01:07:34
Ese script que está como afuera 01:07:35
Ese script sí que no hay que 01:07:38
No hay que vincularlo 01:07:41
Como componente a nada 01:07:43
Simplemente pues 01:07:44
Está guardando datos 01:07:46
Que son, como su propio nombre indica 01:07:48
Estáticos durante todo el juego 01:07:50
¿Vale? 01:07:52
Lo voy a poner aquí 01:07:54
5, vale 01:07:56
¿Qué tal hasta aquí? 01:07:57
Bien, bien, bien, perfecto 01:08:02
Entonces esto también nos da 01:08:04
Nos da 01:08:06
Para ir más allá, aunque no es lo que se 01:08:08
pide, nos da la posibilidad, fíjate, 01:08:11
de decir, mira, este fondo 01:08:13
si yo lo desactivo o lo activo, ¿vale? 01:08:15
Es el fondo de la imagen. 01:08:17
Imagínate, yo digo que cuando le dé al botón 01:08:19
config, en vez de ir a otro nivel, 01:08:21
lo que hago es que ese fondo, arrastro el game 01:08:23
object, ¿vale? Yo digo que 01:08:25
ese game object 01:08:27
haga un setActive, que es un método 01:08:27
que sirve para activar o desactivar, ¿vale? 01:08:30
Es análogo, ¿vale? Es análogo 01:08:32
a dar a este botón. setActiveTrue es 01:08:35
que está activo, setActiveFalse es que 01:08:37
está inactivo. Ves que aparece y desaparece. 01:08:39
y también digamos que se 01:08:41
desaparece aquí 01:08:43
digo porque tiene un montón de posibilidades 01:08:44
el setActive 01:08:48
como hemos visto 01:08:49
setActive tiene un parámetro de bool 01:08:50
según el bool es 01:08:53
true o false 01:08:55
lo que 01:08:57
conseguimos con esto es que 01:08:59
si yo arranco el juego 01:09:01
y le doy al botón config 01:09:03
que es en el que estoy poniendo esto 01:09:04
si yo clico lo que hago es poner en false 01:09:06
el SetActive de este objeto fondo. 01:09:09
Fíjate, yo le doy al juego, empieza, 01:09:12
porque como de momento no he clicado en ningún lado, 01:09:15
yo cuando le doy a Config no va a ir, 01:09:17
porque en ningún momento se lo estoy diciendo, 01:09:19
no estoy yendo a otro nivel. 01:09:20
Lo que estoy diciendo es que desactive, 01:09:22
ahora vas a ver qué ocurre, ese GameObject fondo 01:09:24
y por tanto se va a dejar de ver. 01:09:26
Fíjate, cuando le doy al botón, placa. 01:09:28
Desactivado, porque lo ha puesto en falso. 01:09:31
Ha puesto este SetActive en falso. 01:09:34
Con los botones se puede acceder a prácticamente todo. Es decir, los botones son una forma más o menos directa de ejecutar cosas. Es verdad que mediante el inspector, aunque hay que ir haciendo métodos, se puede acceder a cualquier valor de otro objeto, arrastrándolo ahí simplemente. 01:09:37
Diciéndole, vale, al darle a click, pues listo. 01:09:55
De hecho, hay un apartado, esto es bastante más, 01:09:58
no es más avanzado, pero es otra cosa, 01:10:04
que es en los botones sale el onclick, 01:10:06
pero nosotros podemos decir, ponerle un componente event trigger 01:10:08
y decirle que sea cuando, yo qué sé, cuando el puntero entre. 01:10:11
Y aquí lo que haremos será arrastrar un objeto. 01:10:17
Mira, de hecho, fíjate, voy a poner que en este botón, 01:10:20
y ya estoy añadiendo un comportamiento que no es propio del botón, 01:10:23
que sí que viene con el onclick, 01:10:27
le estoy diciendo que a este elemento, 01:10:28
que sí que se restringe a lo que es el botón, 01:10:32
a este config y ese área, 01:10:34
voy a decir que cuando entre el puntero, 01:10:36
pues que ahí sea cuando cambie de nivel. 01:10:39
Es decir, ahora mismo está configurado 01:10:42
que cuando clico en configuración desaparece el fondo. 01:10:45
Y le voy a decir que no. 01:10:47
Bueno, es decir, no que no. 01:10:49
Que cuando, yo qué sé, a nivel 5. 01:10:51
que cuando yo, el puntero 01:10:54
lo meta en config, ¿vale? sin tener que clicar 01:10:56
ya no me va a dejar de hacer lo otro 01:10:58
porque es que va a pasar directamente al nivel 01:11:00
5, a la escena 5, ¿vale? 01:11:02
de los build settings, vamos a ver si lo hace 01:11:04
yo estoy aquí, ¿vale? 01:11:06
el puntero se acerca, placa, placa, placa 01:11:08
y no voy a clicar, ¿eh? 01:11:10
fíjate, hace la acción que yo le vaya diciendo 01:11:12
y fíjate que aquí hay unas cuantas 01:11:14
¿vale? que se pueden ir diciendo 01:11:16
cuando se 01:11:18
cancela, que es cuando se suelta 01:11:20
cuando se da el click 01:11:21
Es decir, cuando el puntero entra por encima, cuando se arrastra, cuando se mantiene pulsado, cuando se selecciona, cuando se mueve. Hay muchos tipos de comportamientos que son eventos en sí con este event trigger, ¿vale? 01:11:24
Lo que hace la OSUIS es dar ya componentes con este tipo de eventos ya como predispuestos, porque se entiende que un botón la gracia que tiene es que lo pulsas, por eso es el onclick. Y aquí voy de hecho a lo siguiente, que es para ver la lógica de cómo funciona. 01:11:37
Bueno, no sé muy bien qué cambios he hecho, pero si yo me meto en otros tipos de componentes como son ese slider, cuando yo me meto en el slider, fijaos que es un poco la misma lógica, pero en vez de un clic lo que pone es cuando se cambia el valor. 01:11:56
Es decir, en cuanto yo haga algún cambio de valor arrastrando esto, pues se va actualizando un valor que hemos puesto en un script llamado configMenu, que de hecho está aquí, que es el que configura todo y guarda, entre otras cosas, la dificultad del slider. 01:12:14
Que la dificultad del slider no deja de ser este valor que hay aquí. Esto se conecta con eso. Entonces, con esto lo que hacemos es que actualizamos el slider. Hay un menú, hay un método, igual que hemos hecho antes, público, que sirve para cambiar los valores del slider. 01:12:34
Y que también guarde en la dificultad de juego del GameManager la dificultad de ese valor para que durante todo el juego tenga esa dificultad, ¿vale? Y por ver el otro ejemplo, cuando vamos al input de texto, lo que tiene aquí es otro evento que es cuando se cambia el valor. 01:13:00
Es decir, mientras yo no toque nada, no existe nada. Era un nulo, recuerda. Pero cuando yo empiece a escribir, cada vez que cambie ese valor, voy a aludir al método updateInput, que lo que hace es meter en el username de ese GameManager estático el texto que yo haya introducido en este input. 01:13:26
Está ejecutando este método. Cada vez que cambie un valor, se estará cambiando el valor del username y ya se irá cargando donde corresponda, como hemos visto antes. 01:13:47
Y luego, de hecho, hay otro que es que no sea, es decir, dejar esto vacío y que sea cuando deje de escribir y clique fuera, que sea cuando se guarde, para que no sea en cuanto pulse cualquier tecla ya que funcione. Es decir, este es un poco más, es decir, procesa menos. Tampoco son procesamientos muy complicados, pero hasta que yo no deje de escribir, pues no se guarda el valor de lo que se introduzca. ¿Vale? ¿Qué tal? 01:13:57
bien, sí 01:14:23
entiendo la mecánica 01:14:26
más o menos la entiendo, ahora hay que ponerla en práctica 01:14:28
pero bien, eso es lo que más me interesa 01:14:30
porque luego ponerla en práctica es verdad que tiene tela 01:14:32
es decir, tienes que darle vueltas 01:14:34
y poco a poco, etcétera 01:14:36
¿vale? pero sobre todo 01:14:38
es interesante ver 01:14:40
en base a qué funcionan los elementos 01:14:41
de la UI y en muchos casos 01:14:44
es por estos eventos que hay aquí, ¿sabes? 01:14:46
no sé si tienes alguna duda más, más allá de 01:14:49
en principio no, era simplemente 01:14:52
el tema este, luego 01:14:55
entiendo que luego, porque como ha habido un momento que se me ha ido 01:14:57
la cobertura, el nivel de 01:14:59
ahora ya estoy con el portátil 01:15:01
el nivel de dificultad 01:15:02
lo vas poniendo con 01:15:05
por ejemplo con el 01:15:07
drag, con la masa, con todo lo demás 01:15:08
entiendo 01:15:11
y eso además lo he puesto en el HUD 01:15:12
porque como va a ir siempre los niveles 01:15:15
que van con la bola, los jugables 01:15:17
pues lo he puesto en el canvas del HUD 01:15:19
Pero si me meto en el HUD Manager, por ejemplo, ¿vale? Se va actualizando esa dificultad, ¿vale? Y en el update peso, ¿vale? Lo que se ha dicho es, guárdame en una variable float de dificultad la dificultad que hay en el Game Manager, ¿vale? 01:15:20
La dificultad al final está unida al slider y va del 0 al 3, ¿vale? 01:15:37
Porque en el slider que te he enseñado antes, a ver, en el slider que te he enseñado antes, 01:15:42
se ha configurado para que vaya, a ver, espera, que tengo, no, el slider es este, perdón. 01:15:48
Sí, lo tenías de 0 a 3. 01:15:54
De 0 a 3, ¿vale? 01:15:55
Y aparte, bueno, esto es una tontería, pero para que, como estos son diversos niveles, 01:15:56
si se ponen whole numbers va de uno en uno, pero en realidad es un float, ¿vale? 01:16:00
Si te fijas aquí el valor, ¿vale? 01:16:04
Si se pone como whole numbers, pues hay como gradaciones, ¿vale? 01:16:06
Va de uno en otro, ¿vale? 01:16:10
Pero al final lo que guarda es un float, ¿vale? 01:16:12
Para que se te quede eso en la cabeza. 01:16:13
Mira, cuando leo los apuntes, te pone que a la hora de configurar 01:16:19
en el slider, tienen que ser íntegros, números enteros, ¿no? 01:16:23
Sin embargo, yo entiendo que se refiere a eso, 01:16:27
a poner un mínimo y un máximo, pero tiene que ser un float 01:16:30
porque lo guardan por decimales también, puede ser por decimales. 01:16:32
Mira, te lo enseño, ¿vale? Y además esto está muy bien que me lo hayas dicho. Perdóname, ¿eh? Vale, el UpdateSlider, que al final es el método que se ha generado, ¿vale? El UpdateSlider es este método que se actualiza al principio, pero luego se va actualizando según movemos el slider, ¿vale? 01:16:35
Fíjate que es el que tenemos. A ver, aquí, ¿vale? El que se está llamando es el updateSlider, ¿vale? Es ese método. Cada vez que mueva ese slider, se ejecuta esto, ¿sí? 01:16:59
Entonces, cuando se ejecuta, hemos hecho una variable que recoja el valor del slider. Pues si el slider está en la altura del 1, pues guarda un 1. 01:17:11
Pero fíjate que lo que está guardando es un float, ¿vale? Por lo que te he dicho, porque el slider tiene infinitos decimales, ¿vale? 01:17:20
Si no marcas este whole numbers, fíjate. 01:17:26
Eso me lo haría. 01:17:29
Sí. 01:17:30
Entonces, lo ponemos en whole numbers porque son cuatro niveles de dificultad lo que se configura. 01:17:31
Y para eso, de hecho, se ha hecho una string de textos de dificultad, 01:17:36
que luego se han generado los cuatro niveles de chupado fácil, normal y difícil. 01:17:42
Son cuatro posiciones y, por tanto, son números enteros. 01:17:47
No existe el chupado y medio. 01:17:51
Es o cero, o uno, o dos, o tres. 01:17:53
Entonces, aquí cogemos el valor del float, del slider, en el que estemos. Pero es verdad que para cargar uno de estos índices, aquí lo que va es un número entero. Son cuatro posiciones de números enteros. 01:17:56
Entonces hay que hacer lo que se llama una conversión implícita. No, implícita no, explícita de hecho. Esto ya lo dije en su día, pero normal que se os haya olvidado. 01:18:14
que es que nosotros podemos convertir un float en un int, es decir, lo que hace es redondearlo, ¿vale? 01:18:28
Haciendo esto, este parámetro. Ahora se ha hecho aquí una especie de variable nueva que es un int, ¿vale? 01:18:36
Y lo que hace es guardar como un int realmente el valor del slider que era un float, pero convertido a int, ¿vale? 01:18:42
Realmente redondea la baja, si no me equivoco. Si tiene un decimal, se lo carga y ya está. 01:18:50
¿Y qué es lo que hace? Que el slider, el texto que hemos puesto aquí a la derecha, este texto digamos que se ha añadido como otro texto, es decir, es un texto normal que se ha colocado vinculado a este script para que vaya junto, 01:18:54
pero en realidad esto es un texto, es un UI text. 01:19:14
Perdona si ya digo tonterías, pero es que llevo hablando tanto rato 01:19:22
que tengo la cabeza hecha un lío. 01:19:24
Nada, no te preocupes. 01:19:26
Una cosa, mira. 01:19:27
Vale, dime. 01:19:28
Y mira, otra cosa, perdona que pregunte tanto. 01:19:30
No, no, no, sin problema. 01:19:32
Que te iba a decir, y que te haga hablar tanto. 01:19:34
No, no, no, sí, pero bueno, que a veces me trabo ya porque, 01:19:36
pero bueno, sí, dime. 01:19:40
el tema está en que 01:19:40
haces un array también con el tema del nivel de dificultad 01:19:43
es decir, lo vinculas 01:19:46
a cada parte del slider 01:19:47
con un array según una cadena de texto 01:19:49
no, es más simple 01:19:51
realmente no se crea un array 01:19:53
relacionado con el 01:19:55
decir, sí y no 01:19:58
el array que se hace es de los cuatro 01:19:59
de los cuatro nombres 01:20:01
que tienen que mostrar 01:20:03
no tiene nada que ver con números 01:20:04
el array son de cuatro strings 01:20:06
que es lo que estaba explicando, que es el texto que va a poner aquí. 01:20:09
Si el slider tiene un valor de 1, pone fácil. 01:20:13
Si es el de 0, es chupado. 01:20:16
De hecho, fíjate, yo a medida que voy moviendo ese slider, 01:20:18
se va cambiando el texto para que el usuario tenga una referencia 01:20:22
de qué significa cada nivel. 01:20:28
Entonces, lo que se ha hecho es un array de textos 01:20:30
y luego 01:20:34
lo que se vincula es 01:20:36
que lo que ponga en ese texto 01:20:38
porque aquí hay una variable de dificultad texto 01:20:39
que es lo mismo que hemos hecho antes 01:20:42
que es que en el canvas 01:20:44
dificultad texto se ha arrastrado 01:20:46
este texto que hay aquí, fíjate 01:20:48
y entonces accedemos 01:20:50
a este campo de texto 01:20:52
y le decimos que el texto que ponga ahí 01:20:53
que lo que haga es 01:20:56
cogerme el texto 01:20:59
y según el valor que tenga el array 01:21:01
vale, dificultad key, dependiendo 01:21:03
de eso, como ahora es número entero, me enseña 01:21:05
o chupado, fácil, o normal, o difícil 01:21:07
¿sí? es decir, si aquí 01:21:09
es texto dificultad y el valor 01:21:11
fuera de cero, me enseña chupado 01:21:13
si fuera de dos, enseñaría normal 01:21:15
es lo que está haciendo, vaya 01:21:17
y luego aparte, es decir 01:21:18
esta línea sirve para ese texto 01:21:21
para llegar al componente de texto y cambiar 01:21:23
el nivel 01:21:25
del texto que pone como nivel 01:21:26
pero realmente está cargando 01:21:28
en relación al slider porque 01:21:31
se lo estamos diciendo como 01:21:33
un array, pero vaya 01:21:34
que realmente donde estamos guardando el valor 01:21:36
del array como dato numérico 01:21:39
es nuevamente 01:21:41
en el game manager 01:21:43
y ese 01:21:44
dificultad 01:21:46
lo que hacemos luego en el 01:21:49
head manager es 01:21:51
lo que hace es 01:21:52
guardar en una variable 01:21:54
esa dificultad que se ha definido 01:21:56
según dejáramos el slider 01:21:59
Y según eso, los cuatro valores posibles, aquí también se podría hacer un switch, pero bueno, se ha hecho con ifs. Si la dificultad fuera cero, es decir, la de chupado, pues la bola, recuerda que habíamos accedido al rigidbody de esa bola, a su componente rigidbody, pues la masa, y vuelvo al nivel, la masa de esa bola que hemos referenciado, o el drag irá cambiando. 01:22:01
Y ya según eso, el comportamiento físico. 01:22:34
Entonces, con esto, dependiendo del nivel que hayamos guardado en el Game Manager, 01:22:36
cuando se cargue el HUD, al iniciar dice, a ver, ¿qué peso me ha llegado hasta este momento? 01:22:40
Y mira ahí, a ver, pues en el Game Manager me pone que es nivel 2. 01:22:46
Y entonces la bola tendrá una masa y un drag. 01:22:49
Y ahora más fácil o más difícil el juego, porque sobre todo en los niveles en los que la plataforma se gira, 01:22:53
no la propia bola, sino la plataforma 01:23:00
claro, dependiendo del peso y la resistencia al aire 01:23:02
caerá más o menos rápido 01:23:04
entonces pues si cae a toda leche 01:23:05
porque tiene más masa, la dificultad más alta 01:23:07
y además poca resistencia al aire, es decir 01:23:09
que no lo frena casi nada 01:23:12
pues va a toda leche, entonces es más complicado 01:23:13
meter la bola en el agujero 01:23:16
¿vale? 01:23:18
Sí, sí, vale, fácil 01:23:22
Vale, bueno 01:23:24
esto, es decir, es muy 01:23:25
complejo, yo lo sé, pero bueno 01:23:28
es que si no se explican el tema 01:23:30
y no se pone en juego, pero bueno, yo creo que 01:23:33
dándole vuelta así con lo que 01:23:35
estamos viendo hoy, sobre todo me importa, aunque no 01:23:37
lleguéis al 100% de lo que se pide 01:23:39
si llegáis a un 75% 01:23:41
pero lo estáis entendiendo bien 01:23:43
pues de lujo, sobre todo es que lo entendáis 01:23:45
pues ya está, muy bien 01:23:47
vale, no sé 01:23:49
si tienes alguna duda más 01:23:51
si quieres 01:23:52
te abro el trabajo que tengo 01:23:55
porque ahora sí que estoy con el perpátil 01:23:56
Vale, sí. Pero sobre todo, perdón, antes de que deje de compartir, lo esencial es saber que siempre podemos acceder a los componentes. Lo digo porque da mucho miedo lo de los scripts, pero realmente lo que estamos haciendo es, igual que si aquí pusiéramos 8, lo estamos haciendo por código. 01:23:58
Entonces es simplemente arrastrar, ¿vale? Pues en el HUD, arrastrar a qué vamos a afectar y ya a partir de eso, si apelamos a esa variable, es como entrar a los campos. 01:24:17
vale, mira, esta es la 01:24:30
para que lo vayas viendo 01:24:31
he hecho el canvas, juego de la pelota 01:24:33
le he titulado y tal, entonces yo le doy 01:24:36
aquí 01:24:37
empiezo 01:24:38
vale, entonces esto es como hasta ahora 01:24:40
los corazones has visto que los tengo arriba 01:24:44
lo que pasa es que 01:24:46
ya está, no se me quitan 01:24:47
no soy capaz de quitarlo, vale 01:24:49
hay que cargar, digamos 01:24:50
los sprites, lo que hemos visto 01:24:53
claro, yo lo que había hecho ahí era 01:24:57
bueno, luego la siguiente parte 01:24:59
el menú de opciones 01:25:01
con un retool 01:25:02
y entonces en consola 01:25:10
el kit por ejemplo 01:25:12
lo tengo aquí 01:25:15
lo he mandado a consola para salir 01:25:15
que entiendo que luego se podrá hacer 01:25:18
claro, ahí hay que poner el application.kit 01:25:19
método 01:25:22
eso aquí no se ve 01:25:23
hasta que no se tiene un ejecutable 01:25:26
no puede quitar el ejecutable 01:25:27
porque aquí sería que quita Unity 01:25:29
entonces no lo hace 01:25:30
Y la parte de opciones la he hecho 01:25:32
de la siguiente manera, como cuando 01:25:34
llegas a opciones, 01:25:36
te cambia 01:25:37
a otro canvas diferente, 01:25:40
lo he metido aquí en 01:25:42
opciones. 01:25:44
Lo suyo, a ver, se puede hacer con 01:25:46
un canvas, 01:25:48
pero lo suyo es que hagas otro nivel. 01:25:50
Otro nivel que sea otra. 01:25:53
O sea, yo cada vez que te iba enseñando... 01:25:54
Otra escena. 01:25:56
Y ahí la configuras. 01:25:58
porque así al cargar los niveles 01:25:59
en el start de cada nivel 01:26:02
si metes operaciones 01:26:04
puedes dar nuevas operaciones 01:26:06
porque si no, digamos que dentro de un mismo nivel 01:26:08
tienes como dos 01:26:10
menús distintos y se te pueden 01:26:12
ir liando, lo bueno de que 01:26:14
se conectan los dos es 01:26:16
que tiene su 01:26:18
start y se eliminan cosas que no quieres 01:26:20
y se crean, es más sencillo 01:26:22
que ojo, lo que tú has hecho por ejemplo 01:26:23
se podría hacer durante la ejecución 01:26:26
el juego, mientras se está con la pelota 01:26:28
cuando le das al escape por ejemplo 01:26:30
el pause y se sobrepone un canvas 01:26:32
y ahí se podría poner 01:26:34
pero hay un método 01:26:36
¿el qué? 01:26:37
hay un método especial para eso creo, según he leído 01:26:39
los apuntes, no, no, sería mostrar un canvas 01:26:42
pero aparte lo que se hace es 01:26:44
parar el tiempo de ejecución 01:26:46
se pone el time.time 01:26:47
que es a qué velocidad y se pone en cero 01:26:50
y digamos que el juego se queda suspendido 01:26:52
y luego tú enseñas ese canvas 01:26:53
y tú clicas y cuando vuelves al 01:26:55
juego, pues el time.time 01:26:58
es el time scale, se vuelve 01:27:00
uno otra vez. Entonces entiendo 01:27:02
que tengo que hacer una escena nueva, me cargo este 01:27:04
canvas que acabo de hacer, hago una escena nueva, le meto 01:27:06
un canvas y ya lo... 01:27:08
Eso es, y hacer 01:27:09
los elementos de ese canvas nuevo. 01:27:11
Una cosa que no he dicho y es importante y además esto 01:27:14
creo que no lo ponen los apuntes. 01:27:16
Compárteme otra vez el Unity, porfa. 01:27:18
Un momentito. 01:27:20
Ahí lo tengo. 01:27:21
Cuando juegas, dale a 01:27:24
reproducir el juego. 01:27:26
vale 01:27:26
¿ves eso de dejar de compartir? 01:27:30
¿no le des? 01:27:34
¿está compartiendo? 01:27:35
a la derecha hay un minimizar 01:27:37
dale a eso para que se quite eso 01:27:40
espera un momento voy a bajar el volumen 01:27:41
vale 01:27:44
tú tienes una música que yo no llego a oír 01:27:45
pero porque no estás compartiendo 01:27:49
el sonido pero el audio source 01:27:51
desactívalo 01:27:53
el game object a la izquierda 01:27:54
al penúltimo 01:27:57
Ahí, venga, dale 01:27:59
Y minimiza lo que te había dicho antes, porfa 01:28:05
Ahí, vale 01:28:08
Esto ya lo vimos el otro día 01:28:13
Espera, no de esa nada 01:28:15
Si es del panel de game 01:28:16
Para testear bien las cosas 01:28:18
Tú ahora mismo estás jugando 01:28:20
O estás reproduciendo el juego 01:28:22
Con unas medidas 01:28:24
Digamos adaptables a la pantalla 01:28:25
que tienes de game 01:28:29
es decir, si arrastras tú el game y lo haces más grande 01:28:31
se hace más grande 01:28:33
nosotros lo que queremos es simular, por ejemplo en este caso 01:28:34
el 16 novenos de los móviles 01:28:37
es como una referencia 01:28:42
entonces, lo primero 01:28:44
y esto ya lo vimos el otro día 01:28:46
donde pone scale encima 01:28:47
debería estar a 1 siempre 01:28:49
ves que pone scale 1.1 01:28:51
eso es para ampliar 01:28:54
y ver de cerca 01:28:55
detalles 01:28:58
Pero el 1x este es el nivel de reproducción del juego 01:28:59
Y luego donde pone a la izquierda Free Aspect 01:29:03
Esto, ¿vale? Dale a ese desplegable 01:29:05
¿Vale? Ahora mismo se está adaptando a la pantalla 01:29:08
Pero deberías poner las dimensiones que te interesen 01:29:11
¿Ves que hay algunas? Como esa que pone Full HD 01:29:14
Que te da unos píxeles concretos 01:29:16
¿Vale? Pero normalmente, si por ejemplo es para móvil 01:29:18
O para cualquier tipo de pantalla 16 novenosa paisada 01:29:21
Si lo pones ahí, selecciónalo 01:29:24
vale, te lo pone 01:29:25
de esa medida referente a ese 01:29:29
tamaño, ¿qué significa eso? 01:29:31
que ahora mismo 01:29:33
a ver, amplíe y desamplía 01:29:34
este panel, no, no 01:29:36
en escala no, vete a 01:29:39
a game, vale, el menú game 01:29:41
vete abajo y arrastra hacia abajo 01:29:43
por ejemplo, haz más grande la ventana de game 01:29:45
no, bueno 01:29:47
te voy a compartir yo, vale 01:29:50
que creo que va a ser más sencillo 01:29:51
Ah, tú decías que arrastrar la ventana de game 01:29:54
Vale, si quieres la arrastro 01:30:04
Que la haga más grande 01:30:05
Lo que sea la idea 01:30:08
Hazla más grande, arrastra 01:30:09
Se irá adaptando 01:30:15
Al tamaño de ese juego 01:30:17
Muevelo hacia la derecha 01:30:19
Ahora lo tienes a 16 décimos 01:30:21
Dale a 16 novenos 01:30:24
entonces para verlo con la medida que es 01:30:25
porque si no te lo adapta más 01:30:28
eso es lo importante 01:30:30
que tenga la proporción que va a tener 01:30:31
porque si no igual te está metiendo más o menos fondo 01:30:34
vale 01:30:36
entonces eso es importante 01:30:36
tenerlo en cuenta 01:30:40
sobre todo ahora que estamos jugando 01:30:41
está mirando que 01:30:43
casi todos son en 16 novenos me parece 01:30:46
sí, sí, sí 01:30:48
las pantallas de móvil normalmente 01:30:49
la verdad que ahora están 01:30:52
que si el desplegable, que son como dos 01:30:54
y tal, pero los monitores 01:30:56
los móviles y tal 01:30:58
la referencia normalmente es 16 novenos 01:30:59
entonces, ahora que sí que 01:31:02
tenemos que ir viendo cómo queda el juego 01:31:04
pues lo suyo es poner un aspecto y aparecer 01:31:05
de proporciones 01:31:08
adecuadas, vaya, ¿vale? 01:31:09
Muy bien. Pues nada 01:31:12
muchas gracias, y lo del audio sur se ve 01:31:13
en el último tema, ¿vale? Todavía no 01:31:15
todavía no... De todas maneras no lo voy a quitar 01:31:17
que me gusta la música, lo dejo ya puesto 01:31:20
Ya eso, lo que tú veas 01:31:22
Muchas gracias por todo 01:31:23
Nada, gracias a ti por asistir 01:31:25
Un saludo 01:31:28
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
22
Fecha:
7 de marzo de 2024 - 20:28
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
1h′ 31′ 35″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
867.02 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid