Saltar navegación

Activa JavaScript para disfrutar de los vídeos de la Mediateca.

Alexander - Videojuego - 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 21 de junio de 2024 por Mario S.

55 visualizaciones

Descargar la transcripción

Ya, pues nada, yo os voy a presentar mi proyecto que se trata de un proyecto basado en un videojuego 00:00:00
que mezcla tanto estilos 2D como 3D y en el que pues cambio de jugabilidad en cada nivel. 00:00:08
Se compone de cuatro niveles que son estos de aquí. 00:00:13
Bueno, el caso, primero os voy a comentar un poco cómo es el juego, en qué consiste, 00:00:26
qué metodología utiliza para programar cada nivel. 00:00:30
y bueno, temas de optimización, seguridad, todo lo que he aplicado a lo largo del proyecto 00:00:34
y luego ya os enseñaré el juego en sí funcionando 00:00:39
los cuatro niveles se dividen en dos estilos principales 00:00:43
los primeros dos niveles son 2D y los otros dos son en 3D 00:00:51
el primero es un top-down RPG, es decir, es una cámara que se ve desde arriba 00:00:56
y básicamente tenemos que ir avanzando por el nivel, interactuando con distintos objetos como palancas, 00:01:02
recogiendo corazones para no morir y luchando contra enemigos. 00:01:09
Una inteligencia bastante básica en la que simplemente te acercas, te atacan e intentas matarlos antes de que te maten a ti. 00:01:14
En el segundo se trata de un nivel que intenta parecerse a los juegos de rol japoneses 00:01:20
En el que cuando chocas contra un enemigo cambia de escena y tienes un combate por turnos. 00:01:28
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. 00:01:35
En el tercer nivel ya pasamos a otro género que es el de terror en el que me centro en resolver un puzle. 00:01:50
el objetivo del jugador es conseguir salir del escenario que he montado 00:01:56
que es una casa encantada 00:02:01
y pasar al siguiente nivel 00:02:03
que es el último, el First Person Shooter 00:02:05
gracias 00:02:08
que se trata de un juego de disparos en primera persona 00:02:10
el cual a este paso no vamos a ver 00:02:14
no os lo imaginamos 00:02:16
a ver, el tema de la persistencia 00:02:18
pues bueno, obviamente como todos los juegos tiene que tener persistencia 00:02:22
ya que a los jugadores no les gustaría empezar la partida cada vez que inician el juego. 00:02:26
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. 00:02:30
Eso hablando de la persistencia local, es decir, lo que guardo en el propio ordenador, 00:02:40
que lo guardo en un simple archivo JSON, ya que no se trata de una información delicada, por así decirlo. 00:02:44
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. 00:02:52
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. 00:03:06
Luego después tenemos la persistencia tanto en Windows como en Android, en las que utilizo distintas bases de datos según la plataforma. 00:03:14
En Windows utilizo MongoDB Atlas y en la de Android utilizo Firebase y de Firebase hay dos bases de datos. 00:03:22
Está tanto FireStorage, si no me equivoco, como Database RealTime. 00:03:33
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. 00:03:38
más allá, el menú principal 00:03:45
el menú principal no tiene mucho 00:03:51
he hecho un efecto parallax de fondo 00:03:53
para que se vea bonito 00:03:55
más adelante lo vais a ver 00:03:57
y simplemente he hecho 00:03:58
nada más entrar en el juego 00:04:00
tienes una pantalla de inicio de sesión o registro 00:04:02
según si tienes cuenta o no 00:04:05
la segunda opción es 00:04:06
ya una vez hayas iniciado sesión 00:04:09
que es obligatorio 00:04:12
porque si no la presistencia no funcionaría 00:04:13
es decir, si no está registrado 00:04:16
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 00:04:18
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 00:04:32
ya que no existe localmente 00:04:43
no tendría sentido que estuviera activado 00:04:45
si existen 00:04:48
pues obviamente el jugador ya puede hacer lo que quiera 00:04:50
puede iniciar sesión 00:04:52
luego hay otra 00:04:53
opción que es entrar en un menú multijugador 00:04:56
que va aparte, es una escena aparte 00:04:58
donde él entra y ya de primeras 00:04:59
le aparece un menú donde puede seleccionar la sala en la que 00:05:02
quiere entrar 00:05:04
ese también lo veremos más adelante 00:05:04
aunque al final 00:05:07
el engine, el motor que utilizo 00:05:08
para el multijugador ha dado algunos que otros 00:05:12
problemas, las opciones 00:05:14
las opciones son muy basiquitas, he puesto solo 00:05:16
opciones de sonido aunque podría haberlas 00:05:18
aplicado a sensibilidad del ratón 00:05:19
en los juegos 3D en primera persona 00:05:22
también podría haber metido 00:05:23
algo de tema de gráficos 00:05:25
pero eso no lo he tocado mucho, he intentado 00:05:28
tirar por rendimiento 00:05:30
es decir, todos los 00:05:32
niveles están optimizados para que vayan al máximo 00:05:33
de rendimiento y no me he metido 00:05:35
en que se vean espectacular 00:05:37
porque me ha importado más que estén 00:05:39
disponibles para distintos dispositivos 00:05:41
luego 00:05:44
lo último, la conexión a la nube 00:05:47
hay dos botoncitos 00:05:49
para el tema de subir los archivos 00:05:50
es decir, no es 00:05:53
algo automático para 00:05:55
no ralentizar 00:05:57
mientras que esté jugando el jugador 00:05:59
por ejemplo que se esté subiendo 00:06:01
o esté haciendo conexiones a la base de datos ya que podría 00:06:03
ralentizarle la conexión si por ejemplo está en el multijugador 00:06:05
entonces lo que hago es 00:06:07
simplemente en el propio menú 00:06:09
tiene un botón para subir datos, otro para bajarlos 00:06:11
y ya está, y como ya he iniciado 00:06:13
sesión previamente, compruebo 00:06:15
a partir de esa 00:06:18
información que ya tengo de él 00:06:19
si puedo subir datos o si puedo 00:06:21
bajarlos o lo que sea 00:06:23
la página web 00:06:24
la página web es 00:06:27
básicamente no está 00:06:28
en condiciones de 00:06:31
mandarse a producción, porque es 00:06:33
básicamente una página de pruebas 00:06:35
simplemente 00:06:37
se compone de tres campos 00:06:39
que son el nombre de usuario, el correo electrónico y la contraseña 00:06:41
y poco más, compruebo que obviamente 00:06:45
la persona introduzca todos los datos y una vez veo 00:06:49
que las haya introducido, encripto la contraseña, la mando para arriba 00:06:53
y mando también la otra información a MongoDB 00:06:57
que es donde luego hago la autenticación 00:07:01
¿Qué más? Pues nada, lo que mencioné anteriormente 00:07:03
que sí o sí tiene que iniciar sesión el jugador. 00:07:08
Entonces, desde el propio menú de Unity, 00:07:14
doy las opciones de iniciar sesión y registrarse. 00:07:18
En caso de que no tenga cuenta, le da registrarse 00:07:20
y ya yo le abro una ventana del navegador 00:07:22
que tenga por determinado. 00:07:25
Nivel 1. 00:07:30
En el nivel 1, algo destacable, 00:07:30
ya se ha hablado más o menos del estilo artístico, 00:07:34
es un estilo RPG clásico, el estilo Game Boy. 00:07:36
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. 00:07:40
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. 00:08:03
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. 00:08:21
Y los ScriptableObjects, pues básicamente son clases serializables que no se pueden modificar durante la ejecución del videojuego. 00:08:31
Es decir, sirven para guardar información que necesite acceder a ella en cualquier momento, desde cualquier sitio. 00:08:41
Da igual donde haya instanciado el ScriptableObject. 00:08:49
Esto lo utilizo, por ejemplo, de la salud máxima del jugador. 00:08:52
La salud máxima del jugador, en principio en mi juego, va a ser siempre la misma, es decir, tres corazones. 00:08:56
Y yo utilizo un scriptable object que dice que son tres contenedores 00:09:01
que los divido entre dos para que pueda recibir de medio corazón a medio corazón. 00:09:08
Y no se ve, por algún motivo, que no entiendo. 00:09:13
¿Esto qué es, broma? 00:09:25
Bueno, pasando al segundo nivel. 00:09:34
Bueno, vuelvo a repetir lo mismo. 00:09:38
Es un juego de combate por turno, básicamente. 00:09:40
Te acercas a un enemigo, cambias de escena, luchas, se acaba 00:09:42
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. 00:09:45
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, 00:09:54
los cristales que ya han sido recogidos 00:10:05
y la última posición del jugador 00:10:07
por alguna razón 00:10:09
no conseguí que se guardara esa 00:10:11
información y al final cuando 00:10:13
devolví al jugador a la escena anterior 00:10:15
esa información se había perdido 00:10:17
no he conseguido arreglarlo pero 00:10:19
más o menos lo he arreglado haciendo que el combate sea opcional 00:10:20
una solución 00:10:25
temporal 00:10:27
lo podéis comprobar luego cuando lo enseñe 00:10:28
en el nivel 3 00:10:32
pues bueno ya hay un poco más de cambio 00:10:33
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. 00:10:35
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. 00:10:48
He colocado distintos enemigos 00:10:58
Están en distintas posiciones 00:11:02
Y se mueven siguiendo unas rutas 00:11:04
Preterminadas 00:11:07
Entonces, realmente, si el jugador quisiera 00:11:08
Podría hacerlo sin tener que matar ningún bicho 00:11:10
Si se aprenden las rutas 00:11:12
Es decir, haciéndolo en sigilo 00:11:15
De esa forma doy un poquito más de opciones 00:11:16
En cuanto a la jugabilidad 00:11:19
Cuando llega 00:11:21
Es un nivel bastante pequeñito 00:11:22
Hay dos salas 00:11:24
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, 00:11:25
es decir, el multijugador al fin y al cabo es 00:11:54
este mismo nivel pero siendo 00:11:56
varias personas, es decir, haciéndolo 00:11:58
un modo cooperativo 00:12:00
en el que se pueden unir, si no me equivoco, hasta 16 00:12:01
personas, aunque 00:12:04
el mapa es bastante pequeñito como para tanto 00:12:05
luego, pues el tema del multijugador 00:12:08
a lo que vamos 00:12:12
para hacer multijugador he utilizado un 00:12:13
motor que se llama 00:12:16
Photon, que dentro de Photon 00:12:17
pues existen varias 00:12:20
APIs o frameworks, por así decirlo 00:12:22
entre los cuales pues está Punt2 00:12:24
Punt2 es un framework que ya se dejó de actualizar hace un par de añitos 00:12:26
si no me equivoco, tres 00:12:31
pero sin embargo sigue siendo funcional 00:12:32
y es el mejor para utilizar el multijugador por salas 00:12:34
los demás te ofrecen sobre todo multijugador por matchmaking 00:12:40
es decir, te busca automáticamente la partida 00:12:44
y te empareja según conexión, según región 00:12:45
todas esas características que tú le vas asignando 00:12:48
aquí también podemos añadirlos automáticamente 00:12:52
pero al fin y al cabo se sigue manteniendo lo de las salas 00:12:57
de 16 jugadores, normalmente se utiliza 00:13:00
para jugador contra jugador, es decir, haciendo que sean 00:13:03
de 8 contra 8 personas, pero en mi caso simplemente me he mantenido 00:13:06
en hacerlo cooperativo 00:13:09
el tema del multijugador presenta algunos problemas porque 00:13:10
cuando a veces intento instanciar otro 00:13:15
jugador dentro de la misma sala y 00:13:18
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. 00:13:21
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. 00:13:38
Los jugadores van entrando poco a poco en la sala. 00:13:51
Entonces lo que hago es, a medida que van entrando, ya asignarle los objetivos y todo eso. 00:13:54
Además, a los jugadores hay que añadirles unas clases especiales que son las del PhotonView, si no me equivoco, 00:13:59
que lo que le permiten es separar a lo que es el jugador local de un jugador que sea de fuera. 00:14:03
Es decir, si yo me meto en una partida y Aaron se mete en mi partida también, 00:14:10
si no se configura esto bien, si yo me muevo hacia un lado, Aaron también se movería hacia un lado 00:14:16
porque el sistema no sabe detectar quién es quién, básicamente. 00:14:20
Detecta que los dos somos el mismo GameObject. 00:14:23
luego 00:14:25
el tema de la versión Android 00:14:29
me centré mucho 00:14:31
en optimizar el juego lo máximo 00:14:34
posible, porque 00:14:36
como sabemos los teléfonos Android 00:14:37
no destacan por potencia 00:14:40
entonces he intentado 00:14:41
que funcione básicamente en cualquier 00:14:43
móvil, ya sea de gama baja, media, alta 00:14:45
he hecho que 00:14:47
muchos scripts 00:14:49
funcionen según la plataforma 00:14:51
vale, voy 00:14:53
voy metiendo prisa, el caso 00:14:55
que funciona muy sencillo 00:14:57
en vez de utilizar Atlas 00:14:59
la base de datos de Atlas, utiliza 00:15:01
el Firestore, que no 00:15:03
el Realtime Database, porque 00:15:05
el Realtime Database al fin y al cabo 00:15:07
hace que todos los usuarios 00:15:09
que se registren sean una especie de listeners 00:15:11
entonces cada vez que se produce una modificación 00:15:13
se les avisa de que se produjo una modificación 00:15:15
en la base de datos, eso pensé en utilizarlo 00:15:17
más adelante cuando implemente un sistema de puntuación 00:15:19
es decir, cuando 00:15:21
alguien consiga un record 00:15:22
se los notificará a todos los usuarios de que se ha conseguido un nuevo récord 00:15:24
entonces se actualizaría la tabla de resultados, en ese caso si me serviría 00:15:29
pero para lo que acabo de hacer no me daba tiempo para más y solo he utilizado Firestore 00:15:33
los controles son distintos, obviamente he tenido que hacerlos a mano 00:15:37
es decir que aparezcan en la pantalla y que tú los puedas mover con los dedos 00:15:41
con los eventos que ofrece una pantalla táctil, las notificaciones 00:15:45
funcionan en base a Firebase 00:15:49
es decir 00:15:52
las tendría que ejecutar 00:15:52
yo a mano o establecer 00:15:56
una especie de algoritmo en el que se envíen 00:15:57
cada X tiempo o cuando se produzca X evento 00:16:00
es decir 00:16:02
que se envíe cada vez que haya 00:16:03
luna llena, por ejemplo, pues podría 00:16:06
programarlo para que 00:16:08
cada vez se enviera una notificación a todos los 00:16:09
jugadores que diga, el agiro 00:16:12
necesita tu ayuda, entra para salvar al mundo 00:16:13
por ejemplo, y pues bueno 00:16:16
lo que os he estado diciendo, la optimización del rendimiento 00:16:18
esto me gustaría mencionar 00:16:20
tres cositas, que son primero 00:16:24
las texturas y todo el tema 00:16:25
de objetos 3D, sprites que utiliza Unity 00:16:28
todo lo tengo capado 00:16:30
para que no admita tamaños 00:16:32
muy grandes, ya que eso ralentiza 00:16:34
mucho el dispositivo 00:16:36
también he desactivado todo lo que viene a ser sombras 00:16:37
en tiempo real, que también afecta mucho 00:16:40
a los dispositivos móviles, y por último 00:16:42
el back-end 00:16:44
compilation, que al fin y al cabo 00:16:46
en Unity hay dos, que es mono y IL2CPP, que al fin y al cabo es un tipo de compilación 00:16:48
que lo que hace es acercar el código de C Sharp a C++. A nivel de pruebas es lentísimo 00:16:57
porque compila todo el programa antes de ejecutarlo, pero a nivel de luego sacarlo como tal, como 00:17:04
un producto, para los usuarios es mucho más cómodo, ya que una vez carga y ya estás 00:17:10
dentro del juego y ya va bien. Ya no tienes pantallas de carga y utiliza un tipo de compilación 00:17:14
de Ahead on Time. Es decir, compila todo y luego ya va como un tiro. Bueno, como tal 00:17:19
la presentación es esto. Ahora, bueno, esto luego por si queréis hacer preguntas. Como 00:17:28
tal, bueno, sí. El juego en sí que tengo la build por aquí. Vale, aquí pues lo que 00:17:36
os decía, lo primero que hace es pedirte 00:17:59
que entres en tu cuenta 00:18:01
si no tienes, supongamos que 00:18:03
en este caso no tengo, le diré a 00:18:05
register y aquí me abre 00:18:07
la página web que está en un localhost 00:18:08
como os he dicho no está desplegada 00:18:10
ni está cerca de estar 00:18:12
en su perfecto 00:18:14
estado, digamos que 00:18:17
ponemos un usuario aleatorio 00:18:18
y decimos 00:18:21
que lo dejamos así, en plan 00:18:28
todo por favor la contraseña, la pones tú 00:18:29
obviamente nos tira 00:18:31
para atrás, ya ni siquiera llegamos al backend 00:18:33
es decir, desde el frontend decimos, oye, esto no está 00:18:35
completo, escríbelo bien 00:18:37
para no estar haciendo llamadas todo el rato 00:18:39
una vez 00:18:41
te registras, pues te pone un mensajito súper 00:18:45
bonito de, te has registrado 00:18:48
podemos 00:18:49
comprobarlo en 00:18:52
en Atlas, que es donde 00:18:53
lo guardo 00:18:55
tengo dos colecciones, una que son 00:18:56
de los archivos que guardan los usuarios 00:18:59
desde el propio 00:19:02
juego y otro de 00:19:04
las cuentas de los usuarios, por ahora solo he hecho el registro de cuentas 00:19:05
aunque más adelante podría implementar un cambio de contraseña, cambio de 00:19:09
nombre de usuario o si un usuario quiere borrar su cuenta 00:19:14
en este caso vemos que se ha añadido, aquí está, Alexander AP 00:19:18
aquí está la contraseña encriptada utilizando el método 00:19:21
de la encriptación de MD5 ya que 00:19:26
también resultaba fácil hacerla en C Sharp 00:19:29
anteriormente lo tenía con 00:19:34
bcrypt 00:19:36
pero la librería de bcrypt 00:19:37
de .net no funciona en Unity 00:19:39
ahora 00:19:41
me vendría aquí al juego 00:19:44
y diría 00:19:47
y esto 00:19:48
perfecto, lo he escrito mal 00:20:02
bueno, esto se supone que tendría que mostrar 00:20:05
un mensaje de error 00:20:09
el cual hice que se escapara por la primera página 00:20:11
pero al parecer no lo ha hecho bien 00:20:14
Bueno, vale. ¿Puedo enseñar? Os lo enseño desde aquí directamente. Sí. En lugar de enseñar la 00:20:15
diapositiva, abres el nivel y me lo vas contando. El juego lo has renderizado. Sí, se lo he renderizado, 00:20:50
pero bueno 00:21:01
si quieres lanzo 00:21:02
tiro la build 00:21:04
vale, tienes 00:21:06
es que te has boicoteado tú mismo 00:21:08
la interfaz 00:21:11
la interfaz 00:21:15
tiene tres cosillas 00:21:16
el rom tiene tres cosillas 00:21:18
es que te boicoteas tú mismo 00:21:20
pero vale 00:21:23
por el tema de optimización 00:21:25
por un lado 00:21:28
el tema de 00:21:30
del videojuego, dices, has optimizado 00:21:31
las texturas 00:21:34
has optimizado las texturas 00:21:35
para todas las plataformas igual 00:21:40
no, es decir, para 00:21:42
para Windows está limitado a 00:21:43
2024 píxeles, si no me equivoco 00:21:45
y para Android 00:21:48
no sé a cuánto lo puse, pero creo que menos de la mitad 00:21:50
creo que a 500 00:21:52
2000 y pico 00:21:52
tenía 00:21:56
vale, luego he visto en el código que a veces 00:21:56
¿Me metes vector 3 y vector 2 en la misma clase? ¿Por qué? 00:21:59
Sí, en algunas porque simplemente para las funciones que utilizo me exige un vector 3. 00:22:06
Pero yo empecé trabajando con un vector 2 en los niveles que son 2D. 00:22:11
Entonces, para arreglar eso lo que hice fue simplemente crear un nuevo vector 3 00:22:16
utilizando el x y del vector 2 y metiéndole un 0 en el z o un valor predeterminado. 00:22:20
luego has fakeado el juego 00:22:25
para obtener todo el tema 00:22:28
de que te lo fakea una vez 00:22:30
y luego ya va más rápido 00:22:34
que lo que haces eso, fakeas luces, sombras 00:22:35
y texturas 00:22:38
a nivel de 00:22:39
alumno de 00:22:44
RAM, programador 00:22:47
¿cómo has optimizado? 00:22:48
¿optimizas el código? ¿tú crees que optimizas el código? 00:22:51
¿o has ido creando script? 00:22:54
¿todos 00:22:56
heredan de MonoBehaviour? 00:22:57
En el nivel 4 00:22:58
sí que ya empecé a optimizar un poco 00:23:05
e hice alguna que otra 00:23:06
clase abstracta para el tema de los 00:23:08
interactuables, es decir 00:23:10
por ejemplo el keypad 00:23:11
es una clase abstracta 00:23:13
que hereda de interactable 00:23:16
junto con las puertas 00:23:18
no sé si también 00:23:20
que lo que hacen es que 00:23:21
sí, porque 00:23:23
sí, a ver 00:23:25
esto sería más o menos el escenario 00:23:30
he quitado enemigos para que sea más 00:23:39
ligero, pero bueno, básicamente aquí hay una palanca 00:23:41
que lo que hace es abrir la puertecita 00:23:43
que te lleva al próximo nivel 00:23:45
y sin embargo hay un lago de por medio 00:23:46
y para pasar pues hay que activar otra palanca 00:23:48
¿y esa interfaz de usuario 00:23:51
pues es 00:23:58
¿tienes pausa o algo? 00:23:58
¿paras el juego? ¿puedes pararlo en algún momento? 00:24:02
no, porque lo estuve 00:24:04
juguetando con el tema del 00:24:06
del time scale 00:24:08
pero el time scale es que 00:24:10
he estado leyendo por todas partes y nadie recomienda 00:24:12
utilizarlo para pausar un juego 00:24:14
lo que leí es que ofrecían 00:24:16
hacer básicamente una variable en prácticamente 00:24:21
todo el juego que es 00:24:23
hace esto si no está 00:24:25
pausado 00:24:27
¿y eso por qué es un error? 00:24:28
¿el qué? 00:24:31
¿lo del timescale? 00:24:31
no, el timescale no 00:24:34
el timescale te lo ofrece Unity, te digo yo que lo ofrecerá 00:24:35
por algo, desde hace muchos años 00:24:38
ya lo ofrece pero no paraliza 00:24:40
todo 00:24:42
no, todo lo que esté dentro 00:24:43
de un update, si no me equivoco 00:24:46
no sé si era dentro de un update o un fixed update 00:24:47
se sigue ejecutando 00:24:49
entonces, tú por ejemplo 00:24:50
si yo tengo dentro de un update 00:24:53
de una función update, todo el tema del movimiento 00:24:55
yo puedo pausar el juego y que aparezca el pause 00:24:58
y que los enemigos se pausen, pero yo seguir dando 00:24:59
vueltas por el mapa como si nada 00:25:01
entonces 00:25:03
igual sí que podría mezclar 00:25:04
de utilizar el tema scale 00:25:07
y dentro del update utilizar la variable 00:25:10
de estar en pausa el juego 00:25:12
pero 00:25:14
no lo planteo 00:25:16
¿Tú crees que es mejor usar un condicional 00:25:18
en todos los updates? 00:25:20
No, la verdad que 00:25:22
es que también me suele, me huele regular 00:25:22
pero ya 00:25:26
Unif 00:25:29
vale 00:25:30
¿Tema de 00:25:33
corrutinas o cosas así? 00:25:38
¿Has usado algo? 00:25:39
Sí, he utilizado corrutinas, por ejemplo aquí mismo 00:25:40
bueno, aquí es que macho 00:25:42
que mala maldita 00:25:44
aquí si lucho contra un enemigo 00:25:45
utilizo corrutinas por ejemplo para el tema del 00:25:48
knockback, es decir 00:25:50
cuando yo golpeo al enemigo o cuando el enemigo me golpea 00:25:52
a mí, se ejecuta una función de knockback 00:25:54
que me empuja a mí o al enemigo 00:25:56
y se ejecuta dentro de una corrutina 00:25:58
para no paralizar al jugador 00:26:00
mientras está siendo golpeado 00:26:02
es decir, lo desplaza pero el jugador 00:26:04
sigue pudiendo interactuar, no se queda 00:26:06
estuqueado por así decirlo, ya que 00:26:08
si por ejemplo se acerca un enemigo 00:26:09
me empuja hacia una pared y de repente 00:26:12
está todo el rato empujándome y yo no puedo ni moverme 00:26:14
ni interactuar, sería una vez más 00:26:16
injusto para el jugador 00:26:18
a nivel de diseño 00:26:19
lo veo como... 00:26:21
¿en el nivel 2? ¿el de JRPG? 00:26:29
no, simplemente yo programé, o sea 00:26:31
hice un algoritmo de pega y ya está 00:26:33
¿un algoritmo de? 00:26:35
de que el enemigo pegue y ya está 00:26:37
donde sí que utilicé la inteligencia artificial 00:26:38
fue en 00:26:42
bueno, aquí está cargando el nivel 00:26:44
fue en el nivel 4, es decir, en el nivel de los disparos 00:26:46
ahí sí que utilizo el 00:26:49
NavMaze Agent y todo eso 00:26:51
y ya baqueo todo el suelo 00:26:52
para que ya se puedan desplazar 00:26:55
además pongo los puntos que quiero que sigan 00:26:57
en la ruta y les 00:26:59
establezco una lista de puntos que tienen que seguir 00:27:01
hacen una pausa 00:27:03
luego se dan la vuelta y pues vuelven a hacer el recorrido 00:27:05
¿Para los enemigos? 00:27:07
Sí, para los enemigos utilizo un 00:27:12
¿Para los enemigos y todo eso? 00:27:14
Sí, utilizo un, no, a ver, utilizo un Raycast 00:27:15
para que me detecte, y una vez me haya detectado 00:27:18
instancia 00:27:20
un GameObject de bala 00:27:21
que puede ir 00:27:23
hacia mí o puede ir como 00:27:26
máximo en un rango que creo que 00:27:28
le he puesto de no sé cuántos grados 00:27:30
pero vamos, le puse un rango de grados 00:27:32
para que pudiera fallar 00:27:34
porque si lo hago en Raycast es que me va a dar siempre 00:27:35
básicamente 00:27:38
el Raycast es simplemente para que me detecte, me siga 00:27:39
y ya si me pierde de vista durante X 00:27:42
segundos ya puedo volver a 00:27:44
escapar 00:27:46
y bueno, intentar sobrevivir como pueda 00:27:46
le puse también barras de vida 00:27:49
a los enemigos que utilice el lucat 00:27:54
para que estén siempre orientadas hacia el jugador 00:27:56
para que él pueda ver cuánta vida le queda al enemigo 00:27:59
¿qué más? 00:28:01
en la versión que te mandé a ti 00:28:05
todavía no estaba configurado el tema del daño 00:28:06
sin embargo en esto 00:28:09
aquí ya lo he cambiado para que sea un poco más 00:28:13
interesante a nivel jugable 00:28:15
ya que en las pruebas que yo estaba haciendo 00:28:17
pues le hacía por ejemplo yo que sé 50 de daño a un enemigo 00:28:19
y le disparaba dos veces y ya desaparecía 00:28:21
ahora lo he hecho un poquito más difícil 00:28:24
que los enemigos también te hacen más daño a ti 00:28:25
pero es de esa parte de desarrollo de los videojuegos 00:28:26
entonces 00:28:49
¿cuál es la interfaz? 00:28:50
porque esto que aquí por ejemplo 00:28:54
en esto que nos estás enseñando 00:28:56
lo que nos estabas enseñando antes 00:28:57
¿cuál es la interfaz de usuario? 00:28:59
la interfaz como tal 00:29:02
está, o sea no hay interfaz 00:29:03
porque es que no tengo nada que mostrar en la interfaz 00:29:05
aquí ahora mismo lo que tengo que es 00:29:07
que escapar, si acaso podría mostrar una misión 00:29:09
o la de la linterna 00:29:11
que apareciera, pues yo que sé 00:29:13
un iconito aquí abajo a la izquierda 00:29:15
que estuviera negro si 00:29:17
está apagada y en blanco si estuviera 00:29:19
encendida 00:29:21
no hay sonido, no hay 00:29:21
el usuario como tal 00:29:23
para lo que vale una interfaz 00:29:26
ahora mismo lo tengo apagado 00:29:27
pero hay, es que lo quité 00:29:29
para que no molestara 00:29:31
pero les puse musiquita turbia 00:29:32
de fondo, además la puerta también tiene sonido 00:29:35
vale, en este caso 00:29:37
el código está aquí 00:29:44
y ahora pues el jugador tendría que bajar 00:29:44
volver a interactuar con 00:29:47
con el tablero, bueno con esto 00:29:48
y lo pondría 00:29:52
mal porque soy medio tonto 00:29:58
y ya podría salir 00:29:59
y tendría que proseguir pues 00:30:08
al próximo nivel que es el último 00:30:10
que es pues 00:30:11
este ya está hecho con mis increíbles 00:30:14
modelos 3D 00:30:16
que son estos bichos de aquí 00:30:17
Y cuando lo disparo pues está el sonidito de las balas 00:30:19
Ellos me están disparando a mí, están fallando todo ahora 00:30:23
Ahora me han dado 00:30:25
He hecho un tipo de feedback que es que se te ponga la pantalla en rojo cada vez que te dan 00:30:27
Y cuando estás por menos de 30 de vida está permanentemente roja hasta que te puedas curar 00:30:31
El caso es que no me doy tiempo a implementar botiquines que estén por ahí flotando 00:30:35
Que tú puedas pasar sobre ellos y que te curen, yo que sé, 20 de vida por ejemplo 00:30:40
Aquí tengo el teclado en el que debajo te aparece Use Keypad 00:30:43
Le doy, también se cambia el texto 00:30:48
Que es una tontería, pero bueno 00:30:51
Y ya puedo proseguir 00:30:53
Y aquí pues hay varios enemigos 00:30:55
Ellos están siguiendo su ruta, este me ha detectado 00:30:57
Y bueno 00:30:59
Este también me ha detectado 00:31:01
He puesto algunos obstáculos 00:31:04
De por medio para que, yo que sé, sea un poquito 00:31:06
Más variado el nivel, porque como tal 00:31:09
El tamaño es pequeño 00:31:10
Y aquí pues esto sería el jefe 00:31:11
Que es lo mismo, pero un bicho más tocho 00:31:16
Y que hace un poco más de daño 00:31:18
si me vieran 00:31:20
vale, vale, vale 00:31:21
y eso es 00:31:32
me llama la atención 00:31:36
en que para 00:31:52
elijas la base de datos 00:31:54
el nombre del ciclo 00:32:02
te lo pasas por el arco de triunfo 00:32:05
eso de desarrollo de aplicaciones 00:32:07
eso principalmente por el tema 00:32:10
de las notificaciones, que como quería implementarlas 00:32:16
en el móvil, al final, ya ves que no 00:32:18
no he podido 00:32:20
que Firebase me lo facilita muchísimo 00:32:21
lo que te quiero decir es 00:32:26
si nosotros delegamos todos los datos 00:32:28
a una base de datos externa que no es nuestra 00:32:31
¿qué tenemos nosotros? 00:32:33
sí, te entiendo 00:32:37
es decir, ¿no crees 00:32:39
que desde nuestra perspectiva 00:32:41
los datos deberían de ser nuestros? 00:32:43
¿no crees que nosotros desde nuestra plataforma 00:32:45
¿no crees que deberías haber pensado 00:32:47
en un tipo de base de datos? 00:32:52
ahora tienes dos bases de datos y esto ¿cómo se pone? 00:32:54
los que juegan en Windows 00:32:59
están en un mundo y los que juegan en Android 00:33:00
están en otro mundo? 00:33:02
No, porque cuando hago el login 00:33:03
lo hago sobre una misma base de datos. 00:33:05
Lo único distinto 00:33:10
que guardo es el tema 00:33:12
de los archivos de guardado. 00:33:14
Que los guardo unos en uno 00:33:17
y otros en otro. 00:33:18
¿Y el login va a una otra? 00:33:19
Sí. 00:33:24
¿Y es directamente, como siempre, 00:33:26
es directamente desde el cliente 00:33:32
el que tira contra la base de datos sin pasar por nada? 00:33:34
No. 00:33:37
De hecho, lo que hice fue buscar una librería que ofrece el propio Mongo Atlas para hacer la conexión 00:33:38
Porque es todo lo que vi dentro de la propia documentación 00:33:49
Ellos recomendaban para .NET utilizar una cosa que es el MongoDB Driver, creo que se llama 00:33:53
Entonces, no estaba disponible para Unity y busqué específicamente un paquete que estuviera adaptado, un plugin 00:34:00
simplemente por seguir un poco la documentación 00:34:06
y intentar que funcionara 00:34:16
en principio 00:34:18
no lo pensé más a nivel 00:34:18
¿Habéis visto que os reza un servidor? 00:34:21
He visto que se puede hacer 00:34:26
He visto que se puede hacer con Unity Networking 00:34:32
pero es que no he tenido tiempo de investigarlo más allá 00:34:36
en fin, me quedo un poco alucinado 00:34:38
tendríamos una base de datos 00:34:46
de base de datos 00:34:50
pues ya está 00:34:51
gracias a vosotros 00:34:58
Idioma/s:
es
Autor/es:
Villablanca
Subido por:
Mario S.
Licencia:
Dominio público
Visualizaciones:
55
Fecha:
21 de junio de 2024 - 23:48
Visibilidad:
Público
Centro:
IES VILLABLANCA
Duración:
35′ 06″
Relación de aspecto:
1.78:1
Resolución:
1280x720 píxeles
Tamaño:
2.27

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid