1 00:00:00,240 --> 00:00:08,140 Ya, pues nada, yo os voy a presentar mi proyecto que se trata de un proyecto basado en un videojuego 2 00:00:08,140 --> 00:00:13,519 que mezcla tanto estilos 2D como 3D y en el que pues cambio de jugabilidad en cada nivel. 3 00:00:13,900 --> 00:00:21,280 Se compone de cuatro niveles que son estos de aquí. 4 00:00:26,579 --> 00:00:30,600 Bueno, el caso, primero os voy a comentar un poco cómo es el juego, en qué consiste, 5 00:00:30,600 --> 00:00:34,159 qué metodología utiliza para programar cada nivel. 6 00:00:34,939 --> 00:00:39,859 y bueno, temas de optimización, seguridad, todo lo que he aplicado a lo largo del proyecto 7 00:00:39,859 --> 00:00:43,259 y luego ya os enseñaré el juego en sí funcionando 8 00:00:43,259 --> 00:00:51,460 los cuatro niveles se dividen en dos estilos principales 9 00:00:51,460 --> 00:00:56,640 los primeros dos niveles son 2D y los otros dos son en 3D 10 00:00:56,640 --> 00:01:02,719 el primero es un top-down RPG, es decir, es una cámara que se ve desde arriba 11 00:01:02,719 --> 00:01:08,739 y básicamente tenemos que ir avanzando por el nivel, interactuando con distintos objetos como palancas, 12 00:01:09,340 --> 00:01:13,400 recogiendo corazones para no morir y luchando contra enemigos. 13 00:01:14,019 --> 00:01:19,579 Una inteligencia bastante básica en la que simplemente te acercas, te atacan e intentas matarlos antes de que te maten a ti. 14 00:01:20,099 --> 00:01:28,359 En el segundo se trata de un nivel que intenta parecerse a los juegos de rol japoneses 15 00:01:28,359 --> 00:01:33,459 En el que cuando chocas contra un enemigo cambia de escena y tienes un combate por turnos. 16 00:01:35,920 --> 00:01:50,019 En ese combate por turnos, lo típico, primero empieza el jugador, puede atacar o curarse y luego ya le toca al enemigo que también tiene una inteligencia bastante basiquita en la que solo ataca o solo se cura. 17 00:01:50,560 --> 00:01:56,079 En el tercer nivel ya pasamos a otro género que es el de terror en el que me centro en resolver un puzle. 18 00:01:56,079 --> 00:02:01,400 el objetivo del jugador es conseguir salir del escenario que he montado 19 00:02:01,400 --> 00:02:03,159 que es una casa encantada 20 00:02:03,159 --> 00:02:05,500 y pasar al siguiente nivel 21 00:02:05,500 --> 00:02:08,699 que es el último, el First Person Shooter 22 00:02:08,699 --> 00:02:10,560 gracias 23 00:02:10,560 --> 00:02:14,319 que se trata de un juego de disparos en primera persona 24 00:02:14,319 --> 00:02:16,340 el cual a este paso no vamos a ver 25 00:02:16,340 --> 00:02:18,120 no os lo imaginamos 26 00:02:18,120 --> 00:02:22,770 a ver, el tema de la persistencia 27 00:02:22,770 --> 00:02:26,009 pues bueno, obviamente como todos los juegos tiene que tener persistencia 28 00:02:26,009 --> 00:02:30,050 ya que a los jugadores no les gustaría empezar la partida cada vez que inician el juego. 29 00:02:30,650 --> 00:02:39,370 En ese caso, como es un juego bastante cortito, lo que guardo es el nivel en el que se ha quedado el jugador por última vez. 30 00:02:40,129 --> 00:02:44,469 Eso hablando de la persistencia local, es decir, lo que guardo en el propio ordenador, 31 00:02:44,889 --> 00:02:52,969 que lo guardo en un simple archivo JSON, ya que no se trata de una información delicada, por así decirlo. 32 00:02:52,969 --> 00:03:05,370 Es decir, no guardo contraseñas o información personal del jugador, sino que son simplemente la última hora de guardado, por ejemplo, o la escena en la que se ha quedado, el nivel. 33 00:03:06,229 --> 00:03:13,650 Cosas así, en las que puedo decir que no me importaría que el jugador lo modificara. Es decir, estaría haciendo trampas, pero es un juego, al fin y al cabo. 34 00:03:14,469 --> 00:03:22,069 Luego después tenemos la persistencia tanto en Windows como en Android, en las que utilizo distintas bases de datos según la plataforma. 35 00:03:22,069 --> 00:03:33,409 En Windows utilizo MongoDB Atlas y en la de Android utilizo Firebase y de Firebase hay dos bases de datos. 36 00:03:33,629 --> 00:03:37,030 Está tanto FireStorage, si no me equivoco, como Database RealTime. 37 00:03:38,090 --> 00:03:45,909 RealTime no me hace falta en este caso, aunque más adelante explicaré en qué otros casos se podría utilizarla, pero he utilizado la de FireStorage. 38 00:03:45,909 --> 00:03:51,169 más allá, el menú principal 39 00:03:51,169 --> 00:03:53,750 el menú principal no tiene mucho 40 00:03:53,750 --> 00:03:55,689 he hecho un efecto parallax de fondo 41 00:03:55,689 --> 00:03:57,729 para que se vea bonito 42 00:03:57,729 --> 00:03:58,710 más adelante lo vais a ver 43 00:03:58,710 --> 00:04:00,689 y simplemente he hecho 44 00:04:00,689 --> 00:04:02,969 nada más entrar en el juego 45 00:04:02,969 --> 00:04:05,289 tienes una pantalla de inicio de sesión o registro 46 00:04:05,289 --> 00:04:06,789 según si tienes cuenta o no 47 00:04:06,789 --> 00:04:09,789 la segunda opción es 48 00:04:09,789 --> 00:04:12,669 ya una vez hayas iniciado sesión 49 00:04:12,669 --> 00:04:13,550 que es obligatorio 50 00:04:13,550 --> 00:04:16,009 porque si no la presistencia no funcionaría 51 00:04:16,009 --> 00:04:18,250 es decir, si no está registrado 52 00:04:18,250 --> 00:04:32,639 no puedes guardar datos en la nube, al fin y al cabo la clave que utilizo es el propio Gmail del usuario, si me quedo así igual, bueno, luego al iniciar la partida 53 00:04:32,639 --> 00:04:43,519 primero compruebo si existe ya anteriormente un archivo de guardado, en caso de que no exista desactivo tanto las opciones de continuar partida como la de subir datos guardados a la nube 54 00:04:43,519 --> 00:04:45,560 ya que no existe localmente 55 00:04:45,560 --> 00:04:48,480 no tendría sentido que estuviera activado 56 00:04:48,480 --> 00:04:50,519 si existen 57 00:04:50,519 --> 00:04:52,180 pues obviamente el jugador ya puede hacer lo que quiera 58 00:04:52,180 --> 00:04:53,199 puede iniciar sesión 59 00:04:53,199 --> 00:04:56,079 luego hay otra 60 00:04:56,079 --> 00:04:58,420 opción que es entrar en un menú multijugador 61 00:04:58,420 --> 00:04:59,920 que va aparte, es una escena aparte 62 00:04:59,920 --> 00:05:02,139 donde él entra y ya de primeras 63 00:05:02,139 --> 00:05:04,139 le aparece un menú donde puede seleccionar la sala en la que 64 00:05:04,139 --> 00:05:04,620 quiere entrar 65 00:05:04,620 --> 00:05:07,060 ese también lo veremos más adelante 66 00:05:07,060 --> 00:05:08,839 aunque al final 67 00:05:08,839 --> 00:05:12,139 el engine, el motor que utilizo 68 00:05:12,139 --> 00:05:14,120 para el multijugador ha dado algunos que otros 69 00:05:14,120 --> 00:05:16,000 problemas, las opciones 70 00:05:16,000 --> 00:05:18,019 las opciones son muy basiquitas, he puesto solo 71 00:05:18,019 --> 00:05:19,980 opciones de sonido aunque podría haberlas 72 00:05:19,980 --> 00:05:22,019 aplicado a sensibilidad del ratón 73 00:05:22,019 --> 00:05:23,980 en los juegos 3D en primera persona 74 00:05:23,980 --> 00:05:25,699 también podría haber metido 75 00:05:25,699 --> 00:05:28,279 algo de tema de gráficos 76 00:05:28,279 --> 00:05:30,100 pero eso no lo he tocado mucho, he intentado 77 00:05:30,100 --> 00:05:32,120 tirar por rendimiento 78 00:05:32,120 --> 00:05:33,800 es decir, todos los 79 00:05:33,800 --> 00:05:35,899 niveles están optimizados para que vayan al máximo 80 00:05:35,899 --> 00:05:37,959 de rendimiento y no me he metido 81 00:05:37,959 --> 00:05:39,420 en que se vean espectacular 82 00:05:39,420 --> 00:05:41,980 porque me ha importado más que estén 83 00:05:41,980 --> 00:05:44,060 disponibles para distintos dispositivos 84 00:05:44,060 --> 00:05:47,620 luego 85 00:05:47,620 --> 00:05:49,500 lo último, la conexión a la nube 86 00:05:49,500 --> 00:05:50,680 hay dos botoncitos 87 00:05:50,680 --> 00:05:53,819 para el tema de subir los archivos 88 00:05:53,819 --> 00:05:55,899 es decir, no es 89 00:05:55,899 --> 00:05:57,420 algo automático para 90 00:05:57,420 --> 00:05:59,019 no ralentizar 91 00:05:59,019 --> 00:06:01,800 mientras que esté jugando el jugador 92 00:06:01,800 --> 00:06:03,480 por ejemplo que se esté subiendo 93 00:06:03,480 --> 00:06:05,399 o esté haciendo conexiones a la base de datos ya que podría 94 00:06:05,399 --> 00:06:07,920 ralentizarle la conexión si por ejemplo está en el multijugador 95 00:06:07,920 --> 00:06:09,360 entonces lo que hago es 96 00:06:09,360 --> 00:06:11,199 simplemente en el propio menú 97 00:06:11,199 --> 00:06:13,980 tiene un botón para subir datos, otro para bajarlos 98 00:06:13,980 --> 00:06:15,920 y ya está, y como ya he iniciado 99 00:06:15,920 --> 00:06:18,360 sesión previamente, compruebo 100 00:06:18,360 --> 00:06:19,980 a partir de esa 101 00:06:19,980 --> 00:06:21,139 información que ya tengo de él 102 00:06:21,139 --> 00:06:23,240 si puedo subir datos o si puedo 103 00:06:23,240 --> 00:06:24,860 bajarlos o lo que sea 104 00:06:24,860 --> 00:06:27,420 la página web 105 00:06:27,420 --> 00:06:28,600 la página web es 106 00:06:28,600 --> 00:06:31,319 básicamente no está 107 00:06:31,319 --> 00:06:33,279 en condiciones de 108 00:06:33,279 --> 00:06:35,259 mandarse a producción, porque es 109 00:06:35,259 --> 00:06:37,300 básicamente una página de pruebas 110 00:06:37,300 --> 00:06:39,740 simplemente 111 00:06:39,740 --> 00:06:41,060 se compone de tres campos 112 00:06:41,060 --> 00:06:45,560 que son el nombre de usuario, el correo electrónico y la contraseña 113 00:06:45,560 --> 00:06:49,399 y poco más, compruebo que obviamente 114 00:06:49,399 --> 00:06:53,259 la persona introduzca todos los datos y una vez veo 115 00:06:53,259 --> 00:06:57,259 que las haya introducido, encripto la contraseña, la mando para arriba 116 00:06:57,259 --> 00:07:01,060 y mando también la otra información a MongoDB 117 00:07:01,060 --> 00:07:03,939 que es donde luego hago la autenticación 118 00:07:03,939 --> 00:07:08,800 ¿Qué más? Pues nada, lo que mencioné anteriormente 119 00:07:08,800 --> 00:07:13,220 que sí o sí tiene que iniciar sesión el jugador. 120 00:07:14,439 --> 00:07:18,180 Entonces, desde el propio menú de Unity, 121 00:07:18,360 --> 00:07:20,459 doy las opciones de iniciar sesión y registrarse. 122 00:07:20,540 --> 00:07:22,160 En caso de que no tenga cuenta, le da registrarse 123 00:07:22,160 --> 00:07:25,300 y ya yo le abro una ventana del navegador 124 00:07:25,300 --> 00:07:26,620 que tenga por determinado. 125 00:07:30,060 --> 00:07:30,720 Nivel 1. 126 00:07:30,720 --> 00:07:34,360 En el nivel 1, algo destacable, 127 00:07:34,480 --> 00:07:36,399 ya se ha hablado más o menos del estilo artístico, 128 00:07:36,500 --> 00:07:39,300 es un estilo RPG clásico, el estilo Game Boy. 129 00:07:40,560 --> 00:08:03,660 Y aquí lo que intenté utilizar es dos cosas interesantes que son los ScriptableObjects y la programación orientada a eventos de Unity, que básicamente creo objetos, GameObjects, dentro de la propia escena que lo que están es esperando una señal específica. 130 00:08:03,660 --> 00:08:19,740 Yo al mandar una señal de, por ejemplo, acaban de golpear al jugador, esos listeners, por así decirlo, captan esa señal y ya se encargan de bajarle la vida y de llamar a otro script que se encarga de mostrar cómo le cambia la barra de vida, por ejemplo. 131 00:08:21,420 --> 00:08:31,959 Eso es interesante ya que a nivel industrial, de rollo proyectos de verdad, se utiliza prácticamente casi siempre la programación orientada a eventos. 132 00:08:31,959 --> 00:08:40,639 Y los ScriptableObjects, pues básicamente son clases serializables que no se pueden modificar durante la ejecución del videojuego. 133 00:08:41,240 --> 00:08:48,679 Es decir, sirven para guardar información que necesite acceder a ella en cualquier momento, desde cualquier sitio. 134 00:08:49,120 --> 00:08:51,899 Da igual donde haya instanciado el ScriptableObject. 135 00:08:52,419 --> 00:08:56,539 Esto lo utilizo, por ejemplo, de la salud máxima del jugador. 136 00:08:56,539 --> 00:09:01,139 La salud máxima del jugador, en principio en mi juego, va a ser siempre la misma, es decir, tres corazones. 137 00:09:01,960 --> 00:09:08,120 Y yo utilizo un scriptable object que dice que son tres contenedores 138 00:09:08,120 --> 00:09:12,279 que los divido entre dos para que pueda recibir de medio corazón a medio corazón. 139 00:09:13,360 --> 00:09:17,179 Y no se ve, por algún motivo, que no entiendo. 140 00:09:25,710 --> 00:09:26,230 ¿Esto qué es, broma? 141 00:09:34,879 --> 00:09:36,720 Bueno, pasando al segundo nivel. 142 00:09:38,059 --> 00:09:39,659 Bueno, vuelvo a repetir lo mismo. 143 00:09:40,200 --> 00:09:42,159 Es un juego de combate por turno, básicamente. 144 00:09:42,379 --> 00:09:45,559 Te acercas a un enemigo, cambias de escena, luchas, se acaba 145 00:09:45,559 --> 00:09:54,200 y en principio la idea es que te devolviera al mismo lugar que donde estabas antes con las mismas características, es decir, con los mismos enemigos derrotados que se quedasen igual. 146 00:09:54,720 --> 00:10:05,659 El problema de esto es que intenté hacerlo mediante una especie de archivo temporal que guarda Unity en el que podría guardar los enemigos que ya han sido derrotados, 147 00:10:05,659 --> 00:10:07,659 los cristales que ya han sido recogidos 148 00:10:07,659 --> 00:10:09,620 y la última posición del jugador 149 00:10:09,620 --> 00:10:11,679 por alguna razón 150 00:10:11,679 --> 00:10:13,779 no conseguí que se guardara esa 151 00:10:13,779 --> 00:10:15,659 información y al final cuando 152 00:10:15,659 --> 00:10:17,379 devolví al jugador a la escena anterior 153 00:10:17,379 --> 00:10:19,360 esa información se había perdido 154 00:10:19,360 --> 00:10:20,879 no he conseguido arreglarlo pero 155 00:10:20,879 --> 00:10:23,919 más o menos lo he arreglado haciendo que el combate sea opcional 156 00:10:23,919 --> 00:10:25,659 es 157 00:10:25,659 --> 00:10:27,480 una solución 158 00:10:27,480 --> 00:10:28,960 temporal 159 00:10:28,960 --> 00:10:31,779 lo podéis comprobar luego cuando lo enseñe 160 00:10:32,340 --> 00:10:33,960 en el nivel 3 161 00:10:33,960 --> 00:10:35,539 pues bueno ya hay un poco más de cambio 162 00:10:35,539 --> 00:10:46,799 En el nivel 3, ya empezamos con el estilo 3D, me baso en un ambiente más oscuro, más temeroso, por así decirlo, ya que al fin y al cabo se trata de un juego de terror. 163 00:10:48,159 --> 00:10:58,539 Tengo que ir disparando a los lados, puedan también fallar balas para que sea justo para el jugador también, ya que no se trata de hacer un juego injusto que aburra a la media hora. 164 00:10:58,539 --> 00:11:02,779 He colocado distintos enemigos 165 00:11:02,779 --> 00:11:04,960 Están en distintas posiciones 166 00:11:04,960 --> 00:11:07,580 Y se mueven siguiendo unas rutas 167 00:11:07,580 --> 00:11:08,259 Preterminadas 168 00:11:08,259 --> 00:11:10,340 Entonces, realmente, si el jugador quisiera 169 00:11:10,340 --> 00:11:12,740 Podría hacerlo sin tener que matar ningún bicho 170 00:11:12,740 --> 00:11:15,179 Si se aprenden las rutas 171 00:11:15,179 --> 00:11:16,379 Es decir, haciéndolo en sigilo 172 00:11:16,379 --> 00:11:19,580 De esa forma doy un poquito más de opciones 173 00:11:19,580 --> 00:11:21,019 En cuanto a la jugabilidad 174 00:11:21,019 --> 00:11:22,620 Cuando llega 175 00:11:22,620 --> 00:11:24,960 Es un nivel bastante pequeñito 176 00:11:24,960 --> 00:11:25,559 Hay dos salas 177 00:11:25,559 --> 00:11:54,500 y cuando llega a la última sala hay una pelea contra un enemigo más grande, un jefe final, como se suele decir, ese jefe final pues tiene más vida y pues es más grande y más llamativo, cambia un poco el diseño, los diseños de los enemigos de este último nivel en vez de cogerlos de internet tuve que improvisarlos un poco yo, como pude, aunque no sea lo mío el diseño 3D, y bueno, poco más que mencionar aquí, bueno, aparte de que me baso en este nivel para hacer el multijugador, 178 00:11:54,500 --> 00:11:56,659 es decir, el multijugador al fin y al cabo es 179 00:11:56,659 --> 00:11:58,460 este mismo nivel pero siendo 180 00:11:58,460 --> 00:12:00,240 varias personas, es decir, haciéndolo 181 00:12:00,240 --> 00:12:01,360 un modo cooperativo 182 00:12:01,360 --> 00:12:04,679 en el que se pueden unir, si no me equivoco, hasta 16 183 00:12:04,679 --> 00:12:05,679 personas, aunque 184 00:12:05,679 --> 00:12:08,360 el mapa es bastante pequeñito como para tanto 185 00:12:08,360 --> 00:12:12,519 luego, pues el tema del multijugador 186 00:12:12,519 --> 00:12:13,240 a lo que vamos 187 00:12:13,240 --> 00:12:16,519 para hacer multijugador he utilizado un 188 00:12:16,519 --> 00:12:17,379 motor que se llama 189 00:12:17,379 --> 00:12:20,139 Photon, que dentro de Photon 190 00:12:20,139 --> 00:12:22,100 pues existen varias 191 00:12:22,100 --> 00:12:24,320 APIs o frameworks, por así decirlo 192 00:12:24,320 --> 00:12:26,940 entre los cuales pues está Punt2 193 00:12:26,940 --> 00:12:31,659 Punt2 es un framework que ya se dejó de actualizar hace un par de añitos 194 00:12:31,659 --> 00:12:32,580 si no me equivoco, tres 195 00:12:32,580 --> 00:12:34,620 pero sin embargo sigue siendo funcional 196 00:12:34,620 --> 00:12:40,379 y es el mejor para utilizar el multijugador por salas 197 00:12:40,379 --> 00:12:44,179 los demás te ofrecen sobre todo multijugador por matchmaking 198 00:12:44,179 --> 00:12:45,940 es decir, te busca automáticamente la partida 199 00:12:45,940 --> 00:12:48,580 y te empareja según conexión, según región 200 00:12:48,580 --> 00:12:52,320 todas esas características que tú le vas asignando 201 00:12:52,320 --> 00:12:57,879 aquí también podemos añadirlos automáticamente 202 00:12:57,879 --> 00:13:00,779 pero al fin y al cabo se sigue manteniendo lo de las salas 203 00:13:00,779 --> 00:13:03,960 de 16 jugadores, normalmente se utiliza 204 00:13:03,960 --> 00:13:06,679 para jugador contra jugador, es decir, haciendo que sean 205 00:13:06,679 --> 00:13:09,879 de 8 contra 8 personas, pero en mi caso simplemente me he mantenido 206 00:13:09,879 --> 00:13:10,960 en hacerlo cooperativo 207 00:13:10,960 --> 00:13:15,539 el tema del multijugador presenta algunos problemas porque 208 00:13:15,539 --> 00:13:18,740 cuando a veces intento instanciar otro 209 00:13:18,740 --> 00:13:21,320 jugador dentro de la misma sala y 210 00:13:21,320 --> 00:13:38,379 Y a veces funciona y a veces no. El problema en sí es que no he logrado ver cuál es el problema. Sin embargo, como tal funciona. Para hacer que esto funcione he tenido que coger todo el nivel 4 y modificar lo que vienen a ser todos los personajes y todos los enemigos. 211 00:13:38,379 --> 00:13:50,740 Es decir, lo que antes aparecía y tenía asignado, por ejemplo, al jugador como objetivo, ya no puedo hacer eso porque al iniciarse el nivel no hay jugadores. 212 00:13:51,080 --> 00:13:53,519 Los jugadores van entrando poco a poco en la sala. 213 00:13:54,139 --> 00:13:58,399 Entonces lo que hago es, a medida que van entrando, ya asignarle los objetivos y todo eso. 214 00:13:59,340 --> 00:14:03,659 Además, a los jugadores hay que añadirles unas clases especiales que son las del PhotonView, si no me equivoco, 215 00:14:03,659 --> 00:14:09,759 que lo que le permiten es separar a lo que es el jugador local de un jugador que sea de fuera. 216 00:14:10,000 --> 00:14:15,100 Es decir, si yo me meto en una partida y Aaron se mete en mi partida también, 217 00:14:16,419 --> 00:14:20,779 si no se configura esto bien, si yo me muevo hacia un lado, Aaron también se movería hacia un lado 218 00:14:20,779 --> 00:14:23,600 porque el sistema no sabe detectar quién es quién, básicamente. 219 00:14:23,919 --> 00:14:25,659 Detecta que los dos somos el mismo GameObject. 220 00:14:25,659 --> 00:14:29,909 luego 221 00:14:29,909 --> 00:14:31,309 el tema de la versión Android 222 00:14:31,309 --> 00:14:34,090 me centré mucho 223 00:14:34,090 --> 00:14:36,149 en optimizar el juego lo máximo 224 00:14:36,149 --> 00:14:37,830 posible, porque 225 00:14:37,830 --> 00:14:40,049 como sabemos los teléfonos Android 226 00:14:40,049 --> 00:14:41,929 no destacan por potencia 227 00:14:41,929 --> 00:14:43,850 entonces he intentado 228 00:14:43,850 --> 00:14:45,889 que funcione básicamente en cualquier 229 00:14:45,889 --> 00:14:47,590 móvil, ya sea de gama baja, media, alta 230 00:14:47,590 --> 00:14:49,990 he hecho que 231 00:14:49,990 --> 00:14:51,809 muchos scripts 232 00:14:51,809 --> 00:14:53,490 funcionen según la plataforma 233 00:14:53,490 --> 00:14:55,870 vale, voy 234 00:14:55,870 --> 00:14:57,889 voy metiendo prisa, el caso 235 00:14:57,889 --> 00:14:59,549 que funciona muy sencillo 236 00:14:59,549 --> 00:15:01,129 en vez de utilizar Atlas 237 00:15:01,129 --> 00:15:03,909 la base de datos de Atlas, utiliza 238 00:15:03,909 --> 00:15:05,789 el Firestore, que no 239 00:15:05,789 --> 00:15:07,769 el Realtime Database, porque 240 00:15:07,769 --> 00:15:09,370 el Realtime Database al fin y al cabo 241 00:15:09,370 --> 00:15:11,809 hace que todos los usuarios 242 00:15:11,809 --> 00:15:13,830 que se registren sean una especie de listeners 243 00:15:13,830 --> 00:15:15,610 entonces cada vez que se produce una modificación 244 00:15:15,610 --> 00:15:17,909 se les avisa de que se produjo una modificación 245 00:15:17,909 --> 00:15:19,929 en la base de datos, eso pensé en utilizarlo 246 00:15:19,929 --> 00:15:21,970 más adelante cuando implemente un sistema de puntuación 247 00:15:21,970 --> 00:15:22,970 es decir, cuando 248 00:15:22,970 --> 00:15:24,990 alguien consiga un record 249 00:15:24,990 --> 00:15:29,669 se los notificará a todos los usuarios de que se ha conseguido un nuevo récord 250 00:15:29,669 --> 00:15:33,330 entonces se actualizaría la tabla de resultados, en ese caso si me serviría 251 00:15:33,330 --> 00:15:37,409 pero para lo que acabo de hacer no me daba tiempo para más y solo he utilizado Firestore 252 00:15:37,409 --> 00:15:41,070 los controles son distintos, obviamente he tenido que hacerlos a mano 253 00:15:41,070 --> 00:15:45,549 es decir que aparezcan en la pantalla y que tú los puedas mover con los dedos 254 00:15:45,549 --> 00:15:49,509 con los eventos que ofrece una pantalla táctil, las notificaciones 255 00:15:49,509 --> 00:15:52,049 funcionan en base a Firebase 256 00:15:52,049 --> 00:15:52,889 es decir 257 00:15:52,889 --> 00:15:56,190 las tendría que ejecutar 258 00:15:56,190 --> 00:15:57,750 yo a mano o establecer 259 00:15:57,750 --> 00:16:00,210 una especie de algoritmo en el que se envíen 260 00:16:00,210 --> 00:16:02,529 cada X tiempo o cuando se produzca X evento 261 00:16:02,529 --> 00:16:03,990 es decir 262 00:16:03,990 --> 00:16:06,269 que se envíe cada vez que haya 263 00:16:06,269 --> 00:16:08,009 luna llena, por ejemplo, pues podría 264 00:16:08,009 --> 00:16:09,669 programarlo para que 265 00:16:09,669 --> 00:16:12,309 cada vez se enviera una notificación a todos los 266 00:16:12,309 --> 00:16:13,990 jugadores que diga, el agiro 267 00:16:13,990 --> 00:16:16,230 necesita tu ayuda, entra para salvar al mundo 268 00:16:16,230 --> 00:16:18,289 por ejemplo, y pues bueno 269 00:16:18,289 --> 00:16:20,370 lo que os he estado diciendo, la optimización del rendimiento 270 00:16:20,370 --> 00:16:24,029 esto me gustaría mencionar 271 00:16:24,029 --> 00:16:25,909 tres cositas, que son primero 272 00:16:25,909 --> 00:16:28,450 las texturas y todo el tema 273 00:16:28,450 --> 00:16:30,649 de objetos 3D, sprites que utiliza Unity 274 00:16:30,649 --> 00:16:32,450 todo lo tengo capado 275 00:16:32,450 --> 00:16:34,269 para que no admita tamaños 276 00:16:34,269 --> 00:16:36,289 muy grandes, ya que eso ralentiza 277 00:16:36,289 --> 00:16:37,110 mucho el dispositivo 278 00:16:37,110 --> 00:16:40,409 también he desactivado todo lo que viene a ser sombras 279 00:16:40,409 --> 00:16:42,250 en tiempo real, que también afecta mucho 280 00:16:42,250 --> 00:16:44,230 a los dispositivos móviles, y por último 281 00:16:44,230 --> 00:16:46,610 el back-end 282 00:16:46,610 --> 00:16:48,190 compilation, que al fin y al cabo 283 00:16:48,190 --> 00:16:57,889 en Unity hay dos, que es mono y IL2CPP, que al fin y al cabo es un tipo de compilación 284 00:16:57,889 --> 00:17:04,549 que lo que hace es acercar el código de C Sharp a C++. A nivel de pruebas es lentísimo 285 00:17:04,549 --> 00:17:10,710 porque compila todo el programa antes de ejecutarlo, pero a nivel de luego sacarlo como tal, como 286 00:17:10,710 --> 00:17:14,589 un producto, para los usuarios es mucho más cómodo, ya que una vez carga y ya estás 287 00:17:14,589 --> 00:17:19,890 dentro del juego y ya va bien. Ya no tienes pantallas de carga y utiliza un tipo de compilación 288 00:17:19,890 --> 00:17:28,450 de Ahead on Time. Es decir, compila todo y luego ya va como un tiro. Bueno, como tal 289 00:17:28,450 --> 00:17:36,910 la presentación es esto. Ahora, bueno, esto luego por si queréis hacer preguntas. Como 290 00:17:36,910 --> 00:17:59,220 tal, bueno, sí. El juego en sí que tengo la build por aquí. Vale, aquí pues lo que 291 00:17:59,220 --> 00:18:01,119 os decía, lo primero que hace es pedirte 292 00:18:01,119 --> 00:18:03,160 que entres en tu cuenta 293 00:18:03,160 --> 00:18:05,019 si no tienes, supongamos que 294 00:18:05,019 --> 00:18:07,079 en este caso no tengo, le diré a 295 00:18:07,079 --> 00:18:08,140 register y aquí me abre 296 00:18:08,140 --> 00:18:10,980 la página web que está en un localhost 297 00:18:10,980 --> 00:18:12,660 como os he dicho no está desplegada 298 00:18:12,660 --> 00:18:14,859 ni está cerca de estar 299 00:18:14,859 --> 00:18:17,140 en su perfecto 300 00:18:17,140 --> 00:18:18,779 estado, digamos que 301 00:18:18,779 --> 00:18:21,220 ponemos un usuario aleatorio 302 00:18:21,220 --> 00:18:28,000 y decimos 303 00:18:28,000 --> 00:18:29,859 que lo dejamos así, en plan 304 00:18:29,859 --> 00:18:31,759 todo por favor la contraseña, la pones tú 305 00:18:31,759 --> 00:18:33,940 obviamente nos tira 306 00:18:33,940 --> 00:18:35,839 para atrás, ya ni siquiera llegamos al backend 307 00:18:35,839 --> 00:18:37,859 es decir, desde el frontend decimos, oye, esto no está 308 00:18:37,859 --> 00:18:39,359 completo, escríbelo bien 309 00:18:39,359 --> 00:18:41,519 para no estar haciendo llamadas todo el rato 310 00:18:41,519 --> 00:18:45,960 una vez 311 00:18:45,960 --> 00:18:48,039 te registras, pues te pone un mensajito súper 312 00:18:48,039 --> 00:18:49,359 bonito de, te has registrado 313 00:18:49,359 --> 00:18:52,059 podemos 314 00:18:52,059 --> 00:18:53,779 comprobarlo en 315 00:18:53,779 --> 00:18:55,839 en Atlas, que es donde 316 00:18:55,839 --> 00:18:56,559 lo guardo 317 00:18:56,559 --> 00:18:59,799 tengo dos colecciones, una que son 318 00:18:59,799 --> 00:19:01,839 de los archivos que guardan los usuarios 319 00:19:02,859 --> 00:19:04,140 desde el propio 320 00:19:04,140 --> 00:19:05,039 juego y otro de 321 00:19:05,039 --> 00:19:09,940 las cuentas de los usuarios, por ahora solo he hecho el registro de cuentas 322 00:19:09,940 --> 00:19:14,079 aunque más adelante podría implementar un cambio de contraseña, cambio de 323 00:19:14,079 --> 00:19:18,019 nombre de usuario o si un usuario quiere borrar su cuenta 324 00:19:18,019 --> 00:19:21,720 en este caso vemos que se ha añadido, aquí está, Alexander AP 325 00:19:21,720 --> 00:19:26,240 aquí está la contraseña encriptada utilizando el método 326 00:19:26,240 --> 00:19:29,920 de la encriptación de MD5 ya que 327 00:19:29,920 --> 00:19:34,200 también resultaba fácil hacerla en C Sharp 328 00:19:34,200 --> 00:19:36,240 anteriormente lo tenía con 329 00:19:36,240 --> 00:19:37,339 bcrypt 330 00:19:37,339 --> 00:19:39,960 pero la librería de bcrypt 331 00:19:39,960 --> 00:19:41,519 de .net no funciona en Unity 332 00:19:41,519 --> 00:19:44,619 ahora 333 00:19:44,619 --> 00:19:47,039 me vendría aquí al juego 334 00:19:47,039 --> 00:19:48,819 y diría 335 00:19:48,819 --> 00:20:02,920 y esto 336 00:20:02,920 --> 00:20:05,700 perfecto, lo he escrito mal 337 00:20:05,700 --> 00:20:09,819 bueno, esto se supone que tendría que mostrar 338 00:20:09,819 --> 00:20:11,440 un mensaje de error 339 00:20:11,440 --> 00:20:14,059 el cual hice que se escapara por la primera página 340 00:20:14,059 --> 00:20:15,779 pero al parecer no lo ha hecho bien 341 00:20:15,779 --> 00:20:50,779 Bueno, vale. ¿Puedo enseñar? Os lo enseño desde aquí directamente. Sí. En lugar de enseñar la 342 00:20:50,779 --> 00:21:01,609 diapositiva, abres el nivel y me lo vas contando. El juego lo has renderizado. Sí, se lo he renderizado, 343 00:21:01,609 --> 00:21:02,990 pero bueno 344 00:21:02,990 --> 00:21:04,430 si quieres lanzo 345 00:21:04,430 --> 00:21:06,349 tiro la build 346 00:21:06,349 --> 00:21:08,269 vale, tienes 347 00:21:08,269 --> 00:21:11,490 es que te has boicoteado tú mismo 348 00:21:11,490 --> 00:21:15,240 la interfaz 349 00:21:15,240 --> 00:21:16,660 la interfaz 350 00:21:16,660 --> 00:21:18,079 tiene tres cosillas 351 00:21:18,079 --> 00:21:20,500 el rom tiene tres cosillas 352 00:21:20,500 --> 00:21:23,420 es que te boicoteas tú mismo 353 00:21:23,420 --> 00:21:25,140 pero vale 354 00:21:25,140 --> 00:21:28,859 por el tema de optimización 355 00:21:28,859 --> 00:21:30,900 por un lado 356 00:21:30,900 --> 00:21:31,599 el tema de 357 00:21:31,599 --> 00:21:34,759 del videojuego, dices, has optimizado 358 00:21:34,759 --> 00:21:35,740 las texturas 359 00:21:35,740 --> 00:21:40,059 has optimizado las texturas 360 00:21:40,059 --> 00:21:42,099 para todas las plataformas igual 361 00:21:42,099 --> 00:21:43,859 no, es decir, para 362 00:21:43,859 --> 00:21:45,920 para Windows está limitado a 363 00:21:45,920 --> 00:21:48,279 2024 píxeles, si no me equivoco 364 00:21:48,279 --> 00:21:50,079 y para Android 365 00:21:50,079 --> 00:21:52,259 no sé a cuánto lo puse, pero creo que menos de la mitad 366 00:21:52,259 --> 00:21:52,940 creo que a 500 367 00:21:52,940 --> 00:21:56,380 2000 y pico 368 00:21:56,380 --> 00:21:56,779 tenía 369 00:21:56,779 --> 00:21:59,680 vale, luego he visto en el código que a veces 370 00:21:59,680 --> 00:22:06,099 ¿Me metes vector 3 y vector 2 en la misma clase? ¿Por qué? 371 00:22:06,700 --> 00:22:10,559 Sí, en algunas porque simplemente para las funciones que utilizo me exige un vector 3. 372 00:22:11,579 --> 00:22:15,380 Pero yo empecé trabajando con un vector 2 en los niveles que son 2D. 373 00:22:16,180 --> 00:22:20,279 Entonces, para arreglar eso lo que hice fue simplemente crear un nuevo vector 3 374 00:22:20,279 --> 00:22:25,200 utilizando el x y del vector 2 y metiéndole un 0 en el z o un valor predeterminado. 375 00:22:25,200 --> 00:22:28,099 luego has fakeado el juego 376 00:22:28,099 --> 00:22:30,039 para obtener todo el tema 377 00:22:30,039 --> 00:22:34,079 de que te lo fakea una vez 378 00:22:34,079 --> 00:22:35,960 y luego ya va más rápido 379 00:22:35,960 --> 00:22:38,279 que lo que haces eso, fakeas luces, sombras 380 00:22:38,279 --> 00:22:39,359 y texturas 381 00:22:39,359 --> 00:22:44,799 a nivel de 382 00:22:44,799 --> 00:22:47,119 alumno de 383 00:22:47,119 --> 00:22:48,880 RAM, programador 384 00:22:48,880 --> 00:22:51,000 ¿cómo has optimizado? 385 00:22:51,279 --> 00:22:53,599 ¿optimizas el código? ¿tú crees que optimizas el código? 386 00:22:54,259 --> 00:22:55,519 ¿o has ido creando script? 387 00:22:56,740 --> 00:22:57,339 ¿todos 388 00:22:57,339 --> 00:22:58,920 heredan de MonoBehaviour? 389 00:22:58,920 --> 00:23:05,059 En el nivel 4 390 00:23:05,059 --> 00:23:06,880 sí que ya empecé a optimizar un poco 391 00:23:06,880 --> 00:23:08,920 e hice alguna que otra 392 00:23:08,920 --> 00:23:10,920 clase abstracta para el tema de los 393 00:23:10,920 --> 00:23:11,980 interactuables, es decir 394 00:23:11,980 --> 00:23:13,980 por ejemplo el keypad 395 00:23:13,980 --> 00:23:16,240 es una clase abstracta 396 00:23:16,240 --> 00:23:18,900 que hereda de interactable 397 00:23:18,900 --> 00:23:20,599 junto con las puertas 398 00:23:20,599 --> 00:23:21,220 no sé si también 399 00:23:21,220 --> 00:23:23,200 que lo que hacen es que 400 00:23:23,200 --> 00:23:25,619 sí, porque 401 00:23:25,619 --> 00:23:30,599 sí, a ver 402 00:23:30,599 --> 00:23:39,299 esto sería más o menos el escenario 403 00:23:39,299 --> 00:23:41,279 he quitado enemigos para que sea más 404 00:23:41,279 --> 00:23:43,160 ligero, pero bueno, básicamente aquí hay una palanca 405 00:23:43,160 --> 00:23:45,279 que lo que hace es abrir la puertecita 406 00:23:45,279 --> 00:23:46,579 que te lleva al próximo nivel 407 00:23:46,579 --> 00:23:48,839 y sin embargo hay un lago de por medio 408 00:23:48,839 --> 00:23:51,220 y para pasar pues hay que activar otra palanca 409 00:23:51,220 --> 00:23:58,450 ¿y esa interfaz de usuario 410 00:23:58,450 --> 00:23:58,849 pues es 411 00:23:58,849 --> 00:24:01,609 ¿tienes pausa o algo? 412 00:24:02,109 --> 00:24:04,309 ¿paras el juego? ¿puedes pararlo en algún momento? 413 00:24:04,930 --> 00:24:06,109 no, porque lo estuve 414 00:24:06,109 --> 00:24:08,349 juguetando con el tema del 415 00:24:08,349 --> 00:24:10,150 del time scale 416 00:24:10,150 --> 00:24:12,109 pero el time scale es que 417 00:24:12,109 --> 00:24:14,049 he estado leyendo por todas partes y nadie recomienda 418 00:24:14,049 --> 00:24:15,230 utilizarlo para pausar un juego 419 00:24:15,230 --> 00:24:16,630 no 420 00:24:16,630 --> 00:24:21,769 lo que leí es que ofrecían 421 00:24:21,769 --> 00:24:23,710 hacer básicamente una variable en prácticamente 422 00:24:23,710 --> 00:24:25,849 todo el juego que es 423 00:24:25,849 --> 00:24:27,789 hace esto si no está 424 00:24:27,789 --> 00:24:28,230 pausado 425 00:24:28,230 --> 00:24:30,190 ¿y eso por qué es un error? 426 00:24:31,309 --> 00:24:31,609 ¿el qué? 427 00:24:31,970 --> 00:24:34,250 ¿lo del timescale? 428 00:24:34,569 --> 00:24:35,670 no, el timescale no 429 00:24:35,670 --> 00:24:38,609 el timescale te lo ofrece Unity, te digo yo que lo ofrecerá 430 00:24:38,609 --> 00:24:40,190 por algo, desde hace muchos años 431 00:24:40,190 --> 00:24:42,650 ya lo ofrece pero no paraliza 432 00:24:42,650 --> 00:24:43,349 todo 433 00:24:43,349 --> 00:24:46,349 no, todo lo que esté dentro 434 00:24:46,349 --> 00:24:47,650 de un update, si no me equivoco 435 00:24:47,650 --> 00:24:49,509 no sé si era dentro de un update o un fixed update 436 00:24:49,509 --> 00:24:50,829 se sigue ejecutando 437 00:24:50,829 --> 00:24:53,589 entonces, tú por ejemplo 438 00:24:53,589 --> 00:24:55,690 si yo tengo dentro de un update 439 00:24:55,690 --> 00:24:58,009 de una función update, todo el tema del movimiento 440 00:24:58,009 --> 00:24:59,750 yo puedo pausar el juego y que aparezca el pause 441 00:24:59,750 --> 00:25:01,849 y que los enemigos se pausen, pero yo seguir dando 442 00:25:01,849 --> 00:25:03,150 vueltas por el mapa como si nada 443 00:25:03,150 --> 00:25:04,809 entonces 444 00:25:04,809 --> 00:25:07,609 igual sí que podría mezclar 445 00:25:07,609 --> 00:25:10,009 de utilizar el tema scale 446 00:25:10,009 --> 00:25:12,130 y dentro del update utilizar la variable 447 00:25:12,130 --> 00:25:14,190 de estar en pausa el juego 448 00:25:14,190 --> 00:25:16,230 pero 449 00:25:16,230 --> 00:25:18,890 no lo planteo 450 00:25:18,890 --> 00:25:20,549 ¿Tú crees que es mejor usar un condicional 451 00:25:20,549 --> 00:25:21,990 en todos los updates? 452 00:25:22,109 --> 00:25:22,869 No, la verdad que 453 00:25:22,869 --> 00:25:26,509 es que también me suele, me huele regular 454 00:25:26,509 --> 00:25:29,599 pero ya 455 00:25:29,599 --> 00:25:30,779 Unif 456 00:25:30,779 --> 00:25:33,940 vale 457 00:25:33,940 --> 00:25:38,000 ¿Tema de 458 00:25:38,000 --> 00:25:39,779 corrutinas o cosas así? 459 00:25:39,900 --> 00:25:40,480 ¿Has usado algo? 460 00:25:40,700 --> 00:25:42,640 Sí, he utilizado corrutinas, por ejemplo aquí mismo 461 00:25:42,640 --> 00:25:44,640 bueno, aquí es que macho 462 00:25:44,640 --> 00:25:45,819 que mala maldita 463 00:25:45,819 --> 00:25:48,599 aquí si lucho contra un enemigo 464 00:25:48,599 --> 00:25:50,460 utilizo corrutinas por ejemplo para el tema del 465 00:25:50,460 --> 00:25:52,299 knockback, es decir 466 00:25:52,299 --> 00:25:54,839 cuando yo golpeo al enemigo o cuando el enemigo me golpea 467 00:25:54,839 --> 00:25:56,539 a mí, se ejecuta una función de knockback 468 00:25:56,539 --> 00:25:58,660 que me empuja a mí o al enemigo 469 00:25:58,660 --> 00:26:00,539 y se ejecuta dentro de una corrutina 470 00:26:00,539 --> 00:26:02,680 para no paralizar al jugador 471 00:26:02,680 --> 00:26:04,660 mientras está siendo golpeado 472 00:26:04,660 --> 00:26:06,480 es decir, lo desplaza pero el jugador 473 00:26:06,480 --> 00:26:08,339 sigue pudiendo interactuar, no se queda 474 00:26:08,339 --> 00:26:09,759 estuqueado por así decirlo, ya que 475 00:26:09,759 --> 00:26:12,160 si por ejemplo se acerca un enemigo 476 00:26:12,160 --> 00:26:14,079 me empuja hacia una pared y de repente 477 00:26:14,079 --> 00:26:16,559 está todo el rato empujándome y yo no puedo ni moverme 478 00:26:16,559 --> 00:26:18,539 ni interactuar, sería una vez más 479 00:26:18,539 --> 00:26:19,359 injusto para el jugador 480 00:26:19,359 --> 00:26:21,440 a nivel de diseño 481 00:26:21,440 --> 00:26:29,599 lo veo como... 482 00:26:29,599 --> 00:26:31,700 ¿en el nivel 2? ¿el de JRPG? 483 00:26:31,799 --> 00:26:33,579 no, simplemente yo programé, o sea 484 00:26:33,579 --> 00:26:35,680 hice un algoritmo de pega y ya está 485 00:26:35,680 --> 00:26:36,700 ¿un algoritmo de? 486 00:26:37,099 --> 00:26:38,779 de que el enemigo pegue y ya está 487 00:26:38,779 --> 00:26:42,140 donde sí que utilicé la inteligencia artificial 488 00:26:42,140 --> 00:26:44,119 fue en 489 00:26:44,119 --> 00:26:46,960 bueno, aquí está cargando el nivel 490 00:26:46,960 --> 00:26:49,819 fue en el nivel 4, es decir, en el nivel de los disparos 491 00:26:49,819 --> 00:26:51,279 ahí sí que utilizo el 492 00:26:51,279 --> 00:26:52,819 NavMaze Agent y todo eso 493 00:26:52,819 --> 00:26:55,759 y ya baqueo todo el suelo 494 00:26:55,759 --> 00:26:57,400 para que ya se puedan desplazar 495 00:26:57,400 --> 00:26:59,700 además pongo los puntos que quiero que sigan 496 00:26:59,700 --> 00:27:01,299 en la ruta y les 497 00:27:01,299 --> 00:27:03,900 establezco una lista de puntos que tienen que seguir 498 00:27:03,900 --> 00:27:05,160 hacen una pausa 499 00:27:05,160 --> 00:27:07,980 luego se dan la vuelta y pues vuelven a hacer el recorrido 500 00:27:07,980 --> 00:27:12,609 ¿Para los enemigos? 501 00:27:12,750 --> 00:27:14,230 Sí, para los enemigos utilizo un 502 00:27:14,230 --> 00:27:14,990 ¿Para los enemigos y todo eso? 503 00:27:15,230 --> 00:27:18,210 Sí, utilizo un, no, a ver, utilizo un Raycast 504 00:27:18,210 --> 00:27:20,210 para que me detecte, y una vez me haya detectado 505 00:27:20,210 --> 00:27:21,490 instancia 506 00:27:21,490 --> 00:27:23,650 un GameObject de bala 507 00:27:23,650 --> 00:27:26,289 que puede ir 508 00:27:26,289 --> 00:27:28,109 hacia mí o puede ir como 509 00:27:28,109 --> 00:27:30,190 máximo en un rango que creo que 510 00:27:30,190 --> 00:27:32,410 le he puesto de no sé cuántos grados 511 00:27:32,410 --> 00:27:34,109 pero vamos, le puse un rango de grados 512 00:27:34,109 --> 00:27:35,289 para que pudiera fallar 513 00:27:35,289 --> 00:27:38,390 porque si lo hago en Raycast es que me va a dar siempre 514 00:27:38,390 --> 00:27:39,269 básicamente 515 00:27:39,269 --> 00:27:42,069 el Raycast es simplemente para que me detecte, me siga 516 00:27:42,069 --> 00:27:44,109 y ya si me pierde de vista durante X 517 00:27:44,109 --> 00:27:46,170 segundos ya puedo volver a 518 00:27:46,170 --> 00:27:46,730 escapar 519 00:27:46,730 --> 00:27:49,829 y bueno, intentar sobrevivir como pueda 520 00:27:49,829 --> 00:27:54,079 le puse también barras de vida 521 00:27:54,079 --> 00:27:56,859 a los enemigos que utilice el lucat 522 00:27:56,859 --> 00:27:59,180 para que estén siempre orientadas hacia el jugador 523 00:27:59,180 --> 00:28:01,180 para que él pueda ver cuánta vida le queda al enemigo 524 00:28:01,180 --> 00:28:04,420 ¿qué más? 525 00:28:05,160 --> 00:28:06,900 en la versión que te mandé a ti 526 00:28:06,900 --> 00:28:09,059 todavía no estaba configurado el tema del daño 527 00:28:09,059 --> 00:28:13,000 sin embargo en esto 528 00:28:13,000 --> 00:28:15,779 aquí ya lo he cambiado para que sea un poco más 529 00:28:15,779 --> 00:28:17,440 interesante a nivel jugable 530 00:28:17,440 --> 00:28:19,359 ya que en las pruebas que yo estaba haciendo 531 00:28:19,359 --> 00:28:21,759 pues le hacía por ejemplo yo que sé 50 de daño a un enemigo 532 00:28:21,759 --> 00:28:24,099 y le disparaba dos veces y ya desaparecía 533 00:28:24,099 --> 00:28:25,400 ahora lo he hecho un poquito más difícil 534 00:28:25,400 --> 00:28:26,940 que los enemigos también te hacen más daño a ti 535 00:28:26,940 --> 00:28:49,349 pero es de esa parte de desarrollo de los videojuegos 536 00:28:49,349 --> 00:28:50,410 entonces 537 00:28:50,410 --> 00:28:51,809 ¿cuál es la interfaz? 538 00:28:54,400 --> 00:28:56,339 porque esto que aquí por ejemplo 539 00:28:56,339 --> 00:28:57,559 en esto que nos estás enseñando 540 00:28:57,559 --> 00:28:59,180 lo que nos estabas enseñando antes 541 00:28:59,180 --> 00:29:01,680 ¿cuál es la interfaz de usuario? 542 00:29:02,240 --> 00:29:03,480 la interfaz como tal 543 00:29:03,480 --> 00:29:05,859 está, o sea no hay interfaz 544 00:29:05,859 --> 00:29:07,759 porque es que no tengo nada que mostrar en la interfaz 545 00:29:07,759 --> 00:29:09,420 aquí ahora mismo lo que tengo que es 546 00:29:09,420 --> 00:29:11,680 que escapar, si acaso podría mostrar una misión 547 00:29:11,680 --> 00:29:13,319 o la de la linterna 548 00:29:13,319 --> 00:29:15,599 que apareciera, pues yo que sé 549 00:29:15,599 --> 00:29:17,359 un iconito aquí abajo a la izquierda 550 00:29:17,359 --> 00:29:19,019 que estuviera negro si 551 00:29:19,019 --> 00:29:21,500 está apagada y en blanco si estuviera 552 00:29:21,500 --> 00:29:21,900 encendida 553 00:29:21,900 --> 00:29:23,700 no hay sonido, no hay 554 00:29:23,700 --> 00:29:26,079 el usuario como tal 555 00:29:26,079 --> 00:29:27,980 para lo que vale una interfaz 556 00:29:27,980 --> 00:29:29,339 ahora mismo lo tengo apagado 557 00:29:29,339 --> 00:29:31,799 pero hay, es que lo quité 558 00:29:31,799 --> 00:29:32,759 para que no molestara 559 00:29:32,759 --> 00:29:35,779 pero les puse musiquita turbia 560 00:29:35,779 --> 00:29:37,880 de fondo, además la puerta también tiene sonido 561 00:29:37,880 --> 00:29:44,119 vale, en este caso 562 00:29:44,119 --> 00:29:44,900 el código está aquí 563 00:29:44,900 --> 00:29:47,500 y ahora pues el jugador tendría que bajar 564 00:29:47,500 --> 00:29:48,920 volver a interactuar con 565 00:29:48,920 --> 00:29:52,220 con el tablero, bueno con esto 566 00:29:52,220 --> 00:29:58,150 y lo pondría 567 00:29:58,150 --> 00:29:59,569 mal porque soy medio tonto 568 00:29:59,569 --> 00:30:08,170 y ya podría salir 569 00:30:08,170 --> 00:30:10,690 y tendría que proseguir pues 570 00:30:10,690 --> 00:30:11,990 al próximo nivel que es el último 571 00:30:11,990 --> 00:30:14,529 que es pues 572 00:30:14,529 --> 00:30:16,890 este ya está hecho con mis increíbles 573 00:30:16,890 --> 00:30:17,569 modelos 3D 574 00:30:17,569 --> 00:30:19,630 que son estos bichos de aquí 575 00:30:19,630 --> 00:30:23,890 Y cuando lo disparo pues está el sonidito de las balas 576 00:30:23,890 --> 00:30:25,910 Ellos me están disparando a mí, están fallando todo ahora 577 00:30:25,910 --> 00:30:27,170 Ahora me han dado 578 00:30:27,170 --> 00:30:31,170 He hecho un tipo de feedback que es que se te ponga la pantalla en rojo cada vez que te dan 579 00:30:31,170 --> 00:30:35,349 Y cuando estás por menos de 30 de vida está permanentemente roja hasta que te puedas curar 580 00:30:35,349 --> 00:30:40,369 El caso es que no me doy tiempo a implementar botiquines que estén por ahí flotando 581 00:30:40,369 --> 00:30:43,750 Que tú puedas pasar sobre ellos y que te curen, yo que sé, 20 de vida por ejemplo 582 00:30:43,750 --> 00:30:48,089 Aquí tengo el teclado en el que debajo te aparece Use Keypad 583 00:30:48,089 --> 00:30:51,769 Le doy, también se cambia el texto 584 00:30:51,769 --> 00:30:53,210 Que es una tontería, pero bueno 585 00:30:53,210 --> 00:30:55,630 Y ya puedo proseguir 586 00:30:55,630 --> 00:30:57,009 Y aquí pues hay varios enemigos 587 00:30:57,009 --> 00:30:59,009 Ellos están siguiendo su ruta, este me ha detectado 588 00:30:59,009 --> 00:31:01,980 Y bueno 589 00:31:01,980 --> 00:31:04,619 Este también me ha detectado 590 00:31:04,619 --> 00:31:06,160 He puesto algunos obstáculos 591 00:31:06,160 --> 00:31:09,000 De por medio para que, yo que sé, sea un poquito 592 00:31:09,000 --> 00:31:10,880 Más variado el nivel, porque como tal 593 00:31:10,880 --> 00:31:11,900 El tamaño es pequeño 594 00:31:11,900 --> 00:31:16,549 Y aquí pues esto sería el jefe 595 00:31:16,549 --> 00:31:18,589 Que es lo mismo, pero un bicho más tocho 596 00:31:18,589 --> 00:31:20,390 Y que hace un poco más de daño 597 00:31:20,390 --> 00:31:21,990 si me vieran 598 00:31:21,990 --> 00:31:32,089 vale, vale, vale 599 00:31:32,089 --> 00:31:36,180 y eso es 600 00:31:36,180 --> 00:31:52,809 me llama la atención 601 00:31:52,809 --> 00:31:54,289 en que para 602 00:31:54,289 --> 00:32:02,759 elijas la base de datos 603 00:32:02,759 --> 00:32:05,759 el nombre del ciclo 604 00:32:05,759 --> 00:32:07,140 te lo pasas por el arco de triunfo 605 00:32:07,140 --> 00:32:10,680 eso de desarrollo de aplicaciones 606 00:32:10,680 --> 00:32:16,640 eso principalmente por el tema 607 00:32:16,640 --> 00:32:18,480 de las notificaciones, que como quería implementarlas 608 00:32:18,480 --> 00:32:20,599 en el móvil, al final, ya ves que no 609 00:32:20,599 --> 00:32:21,380 no he podido 610 00:32:21,380 --> 00:32:26,230 que Firebase me lo facilita muchísimo 611 00:32:26,230 --> 00:32:28,730 lo que te quiero decir es 612 00:32:28,730 --> 00:32:31,470 si nosotros delegamos todos los datos 613 00:32:31,470 --> 00:32:33,589 a una base de datos externa que no es nuestra 614 00:32:33,589 --> 00:32:36,210 ¿qué tenemos nosotros? 615 00:32:37,390 --> 00:32:37,569 yo 616 00:32:37,569 --> 00:32:39,769 sí, te entiendo 617 00:32:39,769 --> 00:32:41,690 es decir, ¿no crees 618 00:32:41,690 --> 00:32:43,369 que desde nuestra perspectiva 619 00:32:43,369 --> 00:32:44,650 los datos deberían de ser nuestros? 620 00:32:45,809 --> 00:32:47,529 ¿no crees que nosotros desde nuestra plataforma 621 00:32:47,529 --> 00:32:52,900 ¿no crees que deberías haber pensado 622 00:32:52,900 --> 00:32:54,019 en un tipo de base de datos? 623 00:32:54,140 --> 00:32:56,839 ahora tienes dos bases de datos y esto ¿cómo se pone? 624 00:32:59,559 --> 00:33:00,680 los que juegan en Windows 625 00:33:00,680 --> 00:33:02,640 están en un mundo y los que juegan en Android 626 00:33:02,640 --> 00:33:03,500 están en otro mundo? 627 00:33:03,880 --> 00:33:05,720 No, porque cuando hago el login 628 00:33:05,720 --> 00:33:08,000 lo hago sobre una misma base de datos. 629 00:33:10,940 --> 00:33:12,640 Lo único distinto 630 00:33:12,640 --> 00:33:14,160 que guardo es el tema 631 00:33:14,160 --> 00:33:16,299 de los archivos de guardado. 632 00:33:17,220 --> 00:33:18,160 Que los guardo unos en uno 633 00:33:18,160 --> 00:33:18,900 y otros en otro. 634 00:33:19,279 --> 00:33:24,000 ¿Y el login va a una otra? 635 00:33:24,160 --> 00:33:24,400 Sí. 636 00:33:26,519 --> 00:33:32,720 ¿Y es directamente, como siempre, 637 00:33:32,720 --> 00:33:34,279 es directamente desde el cliente 638 00:33:34,279 --> 00:33:36,500 el que tira contra la base de datos sin pasar por nada? 639 00:33:37,740 --> 00:33:38,180 No. 640 00:33:38,180 --> 00:33:49,440 De hecho, lo que hice fue buscar una librería que ofrece el propio Mongo Atlas para hacer la conexión 641 00:33:49,440 --> 00:33:53,920 Porque es todo lo que vi dentro de la propia documentación 642 00:33:53,920 --> 00:34:00,660 Ellos recomendaban para .NET utilizar una cosa que es el MongoDB Driver, creo que se llama 643 00:34:00,660 --> 00:34:06,880 Entonces, no estaba disponible para Unity y busqué específicamente un paquete que estuviera adaptado, un plugin 644 00:34:06,880 --> 00:34:16,190 simplemente por seguir un poco la documentación 645 00:34:16,190 --> 00:34:18,389 y intentar que funcionara 646 00:34:18,389 --> 00:34:18,889 en principio 647 00:34:18,889 --> 00:34:21,230 no lo pensé más a nivel 648 00:34:21,230 --> 00:34:25,320 ¿Habéis visto que os reza un servidor? 649 00:34:26,360 --> 00:34:26,800 No 650 00:34:26,800 --> 00:34:32,960 He visto que se puede hacer 651 00:34:32,960 --> 00:34:36,039 He visto que se puede hacer con Unity Networking 652 00:34:36,039 --> 00:34:38,280 pero es que no he tenido tiempo de investigarlo más allá 653 00:34:38,280 --> 00:34:46,650 en fin, me quedo un poco alucinado 654 00:34:46,650 --> 00:34:50,360 tendríamos una base de datos 655 00:34:50,360 --> 00:34:51,099 de base de datos 656 00:34:51,099 --> 00:34:58,329 pues ya está 657 00:34:58,329 --> 00:35:00,610 gracias a vosotros