1 00:00:06,769 --> 00:00:10,970 Hoy vamos a hablar de la User Interface o la UI de Unity. 2 00:00:11,230 --> 00:00:20,710 Es una forma de comunicarnos con el programa, pero a través de botones, textos que nos dan información sobre el estado del juego y lo que es una interfaz. 3 00:00:22,050 --> 00:00:28,710 Pero antes de hacerlo, antes de meternos de lleno en los componentes de la User Interface, vamos a ver cómo se gestionan las escenas. 4 00:00:28,710 --> 00:00:42,189 Algo aparte de crear y guardar, guardar y guardar escenas, algo que tenemos que tener muy en cuenta es que cuando vayamos a compilar el proyecto, cuando hacemos el build que llama Unity, tenemos que decirle qué escenas incluye. 5 00:00:42,350 --> 00:00:46,289 Aunque nosotros hayamos creado 20 escenas en nuestro proyecto, no significa que esas 20 vayan a estar. 6 00:00:46,289 --> 00:01:00,149 La versión 6 de Unity ha cambiado un poquito como funciona el añadir escenas en la build final. Sigue accediéndose igual en el menú de File y ahora llama lo que antes llamaba Build Settings, ahora lo llama Build Profile. 7 00:01:00,149 --> 00:01:16,170 Solo veamos que efectivamente estamos listos para hacer una build en Windows, pero aquí en la carpetita, en el panel donde dice qué escenas va a exportar, es decir, de todas las que tenemos en nuestro proyecto, cuáles se van a incluir en esa build final, pues estarán en esta lista. 8 00:01:16,290 --> 00:01:21,810 podemos abrirlo en este botón o en el atajo aquí que pone lista de escenas es lo mismo ahora 9 00:01:22,810 --> 00:01:27,969 podemos o bien añadir las que están abiertas en este momento por ejemplo o más fácil aún ir 10 00:01:27,969 --> 00:01:33,670 añadiendo desde nuestro proyecto por ejemplo yo tengo una escena inicial que es esta y pues los 11 00:01:33,670 --> 00:01:37,950 tres mapas de mi juego y las añado y ahí están y lo que es muy importante que tenemos que tener 12 00:01:37,950 --> 00:01:43,170 en cuenta es que uno la primera que se ejecutará cuando lance el juego es la que esté aquí al 13 00:01:43,170 --> 00:01:48,769 al inicio de todo, arriba del todo. Y dos, que siempre que añade una escena le pondrá un índice, 14 00:01:48,849 --> 00:01:55,269 un número, que la identificará de forma que podamos o bien preguntarle a Unity en qué está en estamos 15 00:01:55,269 --> 00:02:00,250 y nos devuelve un número entero, o bien decirle que cargue esa a partir de su número y no de su 16 00:02:00,250 --> 00:02:05,150 nombre. Es muy importante tener en cuenta que si no tenemos una escena añadida a esta lista, 17 00:02:06,269 --> 00:02:11,389 no podremos cargarla utilizando el método loadScene. No podemos, nos dará un error. Pues bien, 18 00:02:11,389 --> 00:02:14,169 ¿Cómo hago yo para pasar de una escena a otra? 19 00:02:14,349 --> 00:02:18,389 Eso lo haremos mediante código y para ello usaremos una librería específica 20 00:02:18,389 --> 00:02:22,050 que es la Scene Management, es decir, la gestora de escenas. 21 00:02:22,370 --> 00:02:24,530 Para hacer un ejemplo voy a crear un cubo. 22 00:02:24,870 --> 00:02:30,949 Pues bien, quiero que cuando este personaje atraviese esa puerta vaya a la escena 2. 23 00:02:31,330 --> 00:02:35,110 Y para que yo sepa que he cambiado la escena 2 incluso voy a pinchar en la Main Camera 24 00:02:35,110 --> 00:02:37,310 y le voy a quitar el Skybox. 25 00:02:37,310 --> 00:02:41,310 Me vuelvo a la escena 1 y a este cubo le voy a dar un script. 26 00:02:41,389 --> 00:02:51,280 PortalDimensional. Se lo asigno a este cubo y lo abro. Antes que nada voy a 27 00:02:51,280 --> 00:02:57,500 cargar la librería que necesitamos para manejar las escenas, que ya he dicho que 28 00:02:57,500 --> 00:03:08,699 se llama SceneManagement. Voy a borrar estos métodos, no los necesito, porque lo 29 00:03:08,699 --> 00:03:13,360 único que necesito es crear un OnTriggerEnter. Recordamos que esto nos 30 00:03:13,360 --> 00:03:19,520 lo desrellena automáticamente todo. Si yo llamo al método SceneManager y ahí 31 00:03:19,520 --> 00:03:24,139 tengo todos los atributos y los métodos a los que tengo acceso para haber cargado esas librerías. 32 00:03:24,960 --> 00:03:28,599 Hay muchos más de los que vamos a ver, es decir, me puede decir cuántas escenas hay, 33 00:03:28,699 --> 00:03:34,780 en qué escena estoy, cargar escenas en background de forma síncrona para hacer pantallas de cargando. 34 00:03:35,259 --> 00:03:38,300 Tenéis, como podéis ver, las opciones que me salen, los métodos. 35 00:03:38,620 --> 00:03:41,819 Es el de load scene, cargar escena, que es la que voy a usar yo ahora. 36 00:03:41,819 --> 00:03:45,800 Y ahora él me está pidiendo o el nombre de la escena, ¿vale? 37 00:03:45,800 --> 00:03:55,930 es escena 2 poner bien el nombre porque si no no va a funcionar entonces ahora mismo si yo lanzo 38 00:03:55,930 --> 00:04:01,729 el juego yo este personaje ya lo tengo controlado mediante mi mando entonces lo voy a dirigir hacia 39 00:04:01,729 --> 00:04:06,750 este cubo que se supone que en cuanto entre en contacto con él efectivamente cambiamos de escena 40 00:04:06,750 --> 00:04:14,210 que no quiero depender del nombre porque puedo cometer errores en la ortografía o porque a lo 41 00:04:14,210 --> 00:04:16,290 A lo mejor esa escena luego cambia de nombre y se me estropea todo. 42 00:04:16,449 --> 00:04:19,470 Pues entonces le llamo a su identificador. 43 00:04:20,730 --> 00:04:25,069 Que lo teníamos, recuerdo, en el Build Settings. 44 00:04:25,970 --> 00:04:26,449 Allá vamos. 45 00:04:26,949 --> 00:04:29,149 Y ahí está. Funciona exactamente igual. 46 00:04:30,569 --> 00:04:34,149 Bien, y quien dice al tocar, pues puede ser cualquier otra cosa. 47 00:04:34,149 --> 00:04:38,290 Es decir, cuando me matan, pasar a la escena de Game Over. 48 00:04:38,589 --> 00:04:42,089 Cuando le doy al botón de iniciar juego, pasar a la escena de nivel 1. 49 00:04:42,089 --> 00:05:05,550 Ahora, y antes de terminar, una cosa que nos va a venir muy bien. ¿Cómo conseguimos que unas variables estén disponibles en todas las escenas? Esto es muy habitual. Imaginemos que voy ahí con un jugador de nivel en nivel, pero necesito guardar lógicamente sus variables de tipo vida, energía, inventario, en fin. No puedo ser que cada vez que empiece una escena todas esas variables desaparezcan. 50 00:05:05,550 --> 00:05:21,310 Pues bien, para eso está la variable de tipo estática. Una variable estática, dicho así con la teoría, es básicamente que en programación orientada a objetos, cada vez que creamos una clase, y os recuerdo que cada vez que creamos un script estamos generando una clase, 51 00:05:21,970 --> 00:05:29,970 luego lo que hacemos es generar instancias de esa clase, lo que se llaman objetos. Y cada objeto tiene lo que se llama un encapsulamiento, es decir, que es independiente de los demás. 52 00:05:29,970 --> 00:05:40,310 Eso no nos permite que cada objeto reproduzca los métodos o los atributos de esa clase de forma independiente sin entrar en conflicto con los demás objetos o las instancias de esa clase. 53 00:05:40,589 --> 00:05:55,230 Pero cuando en una clase generamos una variable estática, y aquí viene lo interesante, cada vez que modificamos el valor de esa variable se verá modificado en todas las instancias de esa clase. 54 00:05:55,569 --> 00:05:58,329 Es decir, que se reproducirá en todos los objetos. 55 00:05:58,329 --> 00:06:01,870 lo vamos a comprobar aquí de una forma muy gráfica 56 00:06:01,870 --> 00:06:03,370 para ello voy a generar un nuevo script 57 00:06:03,370 --> 00:06:07,170 y le voy a llamar global bars 58 00:06:07,170 --> 00:06:09,930 voy a crear una variable pública 59 00:06:09,930 --> 00:06:14,329 pero en este caso le voy a llamar de tipo estática 60 00:06:14,329 --> 00:06:16,470 y va a ser de tipo número entero 61 00:06:16,470 --> 00:06:19,129 y le voy a llamar energy 62 00:06:19,129 --> 00:06:20,970 porque va a ser la energía de nuestro personaje 63 00:06:20,970 --> 00:06:22,930 voy a crear una función de update 64 00:06:22,930 --> 00:06:27,810 que lo que va a hacer es que cada fotograma le va a sumar uno 65 00:06:27,810 --> 00:06:37,389 ¿Y esto para qué lo hago? Para que veamos que cuando paso de una escena a otra, la energía no se va a resetear, sino que va a seguir por donde estaba, independientemente de la escena en la que esté hoy. 66 00:06:38,389 --> 00:06:55,790 Vamos a comprobarlo. Voy a crear un nuevo empty, que le voy a llamar InitGame, y me voy a ir a la escena 2, donde voy a crear otro script inicial y le voy a guardar también, le voy a adjuntar ese script. 67 00:06:55,790 --> 00:06:59,189 y en ese script no solo le voy a ir sumando 68 00:06:59,189 --> 00:07:01,970 sino que además le voy a decir que me lo muestre en consola 69 00:07:01,970 --> 00:07:05,009 guardar 70 00:07:05,009 --> 00:07:09,329 conclusión, ahora mismo si lanzo el juego 71 00:07:09,329 --> 00:07:11,269 veremos en consola 72 00:07:11,269 --> 00:07:14,750 que efectivamente está aumentando mi energía 73 00:07:14,750 --> 00:07:17,449 voy ahora mismo por 300, 400, 500 74 00:07:17,449 --> 00:07:21,269 pues bien, voy a pasar el portal dimensional y voy a ir a la escena 2 75 00:07:21,269 --> 00:07:23,610 y en la escena 2 volverá otra vez a lanzarse ese script 76 00:07:23,610 --> 00:07:25,170 diciéndome cuánto es mi energía 77 00:07:25,170 --> 00:07:28,889 la lógica nos dice que debería ser cero porque inicia una escena nueva 78 00:07:28,889 --> 00:07:31,790 pero al ser una variable estática, cada vez que la hemos modificado 79 00:07:31,790 --> 00:07:38,899 nos fijamos que la energía sigue 80 00:07:38,899 --> 00:07:42,160 esto nos permite ir creando variables estáticas 81 00:07:42,160 --> 00:07:45,459 que se van reproduciendo a lo largo de todas nuestras escenas