Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Alexander - Videojuego - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
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
es
00:10:23
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
no
00:24:15
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
yo
00:32:37
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
No
00:34:26
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:
- 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