Saltar navegación

Tutoría UT4 - DEIM - Curso 25·26 - 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 18 de febrero de 2026 por Daniel M.

1 visualizaciones

Tutoría acerca del tema UT4 de DEIM

Descargar la transcripción

Vale, mira, por ir más al grano, hay dos menús, bueno, hay que hacer tres, incluimos el HUD, pero sobre todo vamos a ir uno a uno, primero habría que hacer este que se indica que es, en este caso, el menú inicial, que es una imagen con tres botones. 00:00:01
Entiendo, por si no indagar más, que lo que es conectar, y además esto es algo que ya se adelantaba un poco en la tarea 3, 00:00:22
conectar cada botón con que cargue otra escena, eso lo tenemos más o menos controlado. 00:00:30
Voy a hacer aún así un repaso muy rápido, ¿vale? 00:00:36
Pero, importantísimo, cuando vayamos teniendo niveles, que no sea solo un juego en el que hay un solo nivel, 00:00:39
sino que vamos a tener que ir conectando y cargando distintos niveles, 00:00:45
Bueno, incluso aunque sea uno, esto también hay que hacerlo, pero sobre todo si hay que conectar niveles, hay que siempre recurrir a este, que ya veremos sobre todo en el último tema, porque es desde donde se compila el juego, tenemos que recurrir a este File, Build Settings, el Build es el compilado, la construcción del juego, y aquí habrá que ir metiendo los niveles en un orden específico. 00:00:49
Además, no tiene por qué ser un orden específico, pero sí que es lógico porque lo que sí nos va a proporcionar este conjunto de niveles que vayamos arrastrando aquí serán estos números de índice, que son muy útiles para decir, oye, ojo, cuando des a este botón quiero que cargue la arcena de índice 1, ¿vale? 00:01:14
Entonces, bueno, eso es esencial y que en el juego ya haya una, bueno, pues gestión de estos niveles a nivel de orden y de tener conciencia de cómo se van, bueno, pues poniendo en serie estos índices. 00:01:34
Aquí ya veremos, bueno, como veis, hay distintas plataformas para exportar. Lo veremos en el último tema, pero esta ventana, muy importante, sobre todo en la fase final del juego. Pero vemos que ya incluso para ir relacionando niveles es algo que hay que ir haciendo. 00:01:50
Bueno, básicamente otra cosa, otro truco importante es que, como habréis visto en el tema, siempre que vayamos incorporando elementos de user interface, se va a generar este canvas. 00:02:06
Y este canvas, al final, lo que suele ir haciendo es agrupar y se ve en la pantalla de escena cuando seleccionáis el canvas, pues genera este rectangulillo blanco, 00:02:18
que según como esté configurada 00:02:30
con las opciones del canvas scaler 00:02:33
del canvas en general 00:02:35
el render mode, vienen descritos 00:02:36
en el tema también 00:02:39
si acaso volvemos a esto 00:02:40
pero dentro de este canvas 00:02:42
es donde vamos a ir incorporando los distintos elementos 00:02:44
de nuestras interfaces 00:02:47
para que se vea 00:02:48
elemento de user interface 00:02:52
en un nivel siempre tiene que haber un canvas 00:02:55
mínimo, puede haber más de uno 00:02:57
que vaya agrupando distintos 00:02:58
distintas interfaces, sí que es lógico 00:03:00
lo mejor realmente usar solo uno 00:03:04
que agrupe todo, porque así todos los elementos 00:03:07
se escalarán siguiendo una misma lógica, un mismo criterio 00:03:10
que si hacemos varios ya puede haber ciertos conflictos 00:03:13
y también tiene que haber otro elemento que es este 00:03:17
que también lo genera automáticamente cuando incorporamos un elemento de UI 00:03:19
en el nivel, en la escena 00:03:22
este Event System que básicamente sirve para indicar 00:03:25
así rápido, indicar 00:03:29
si estamos jugando con 00:03:30
un teclado 00:03:32
cuál es el elemento que sale 00:03:34
seleccionado ya por defecto 00:03:36
y también para indicar las teclas 00:03:38
de navegación, ¿vale? 00:03:41
con un ratón es muy fácil 00:03:41
decir aquí, aquí, ¿vale? pero si jugamos con un 00:03:43
gamepad o con un 00:03:45
bueno, pues con otro 00:03:47
tipo de dispositivo que no es tan 00:03:49
versátil, ¿no? tan 00:03:51
apuntable, no sé si existe esa 00:03:52
palabra, pero espero que me entendáis 00:03:55
Pues hay que decir qué teclas, ¿vale? Y veis que ahora yo estoy dando a la flecha arriba y abajo de mi teclado y veis que voy pasando entre un nivel y otro. Y esto se debe a que está configurado en este input module, ¿vale? Si estáis usando el nuevo input system, hay que cargar otro. Se carga por defecto o te da una sugerencia de carga de otra forma de indicar qué inputs o qué axis, ¿vale? O qué botones o qué elemento es el que proporciona cada acción. 00:03:57
pero bueno, el Event System tiene que estar ahí 00:04:23
incluso aunque luego lo dejáramos vacío 00:04:25
en gran parte, es un elemento 00:04:27
pues que tiene que estar 00:04:29
¿vale? Luego 00:04:30
ya dentro del Canvas, como también 00:04:32
se explica en el tema y supongo que es una de las 00:04:35
cosas que estaréis tocando 00:04:38
en esta tarea, dado que se piden, bueno, pues se pueden ir 00:04:39
metiendo desde imágenes hasta 00:04:41
botones, ¿vale? 00:04:43
y campos de texto 00:04:45
sliders, etcétera 00:04:47
¿vale? Bueno, distintos elementos 00:04:49
están referidos a esta gestión de los elementos de User Interface. 00:04:51
El Canvas, yo también pienso, y suele ser un buen enfoque, 00:05:00
que cuando tengo muchos elementos dentro y tengo que ir gestionando código 00:05:05
para hacer referencia a algo de estos botones o estos inputs o imágenes, 00:05:10
es el mejor sitio donde poner el script que yo cree, el que sea, para gestionar los distintos elementos. 00:05:17
¿Por qué? Porque habréis visto, por ejemplo, los botones que tienen una forma simplificada o rápida de llamar a métodos 00:05:29
y que por tanto se ejecute por código, se ejecuten acciones, que es que dependiendo de qué tipo de elemento de user interface, 00:05:37
abajo pueden tener ya lo que se conocen como eventos vale que digamos que ya hay 00:05:46
una configuración hecha en unity en ese elemento vale que dice oye pues en este 00:05:51
elemento botón como es lógico un botón por definición el botón porque sirve 00:05:57
para pulsar un botón y que ocurra algo ya hay un evento se digamos que 00:06:01
está siempre escuchando que ocurre algo en relación en este caso a que se haga 00:06:06
clic es decir que cuando se haga clic en este elemento por ejemplo en este botón 00:06:10
de play es el que está aquí ahora mismo seleccionado vale lo he colocado y al 00:06:15
final lo que se puede hacer aquí es cargar un script que tengamos y llamar 00:06:21
al método que tengamos previsto no entonces al final la forma de no 00:06:25
perderse cuando cargamos este script que dentro tiene un método vale voy a abrir 00:06:32
ese script para que veáis también que escribir para que no sea tan abstracto 00:06:36
es, yo tengo en el menú de introducción este que hay, 00:06:40
realmente lo único que hay que hacer es poner botones 00:06:46
y que esos botones, al pulsarlos, nos lleven a distintas escenas. 00:06:50
No hay comportamientos más complejos en este, en el otro menú sí los hay. 00:06:54
Y por eso probablemente es porque estáis más atascados en ese nivel. 00:06:57
Pero bueno, simplemente tener en cuenta, pues yo entonces he dicho, 00:07:01
vale, este canvas voy a ponerle un script ya puesto aquí, 00:07:05
que se llama Loaded Scenes, que sirve para cargar escenas, y lo tengo aquí preparado con su namespace, su librería para la gestión de niveles, ¿vale? Esto también lo explica el tema, que esté preparado con métodos públicos, ¿vale? 00:07:09
Dos métodos públicos que veis que no se llaman en ningún tiempo de ejecución, sino que, es decir, yo podría hasta borrar esto, y he hecho métodos públicos solo con el propósito de luego arrastrarlo a estas acciones que ya están configuradas en un elemento de UI, en este caso botones para clicar. 00:07:26
Entonces yo en el canvas, que es un game object que puedo arrastrar aquí, cuando lo arrastre lo que va a hacer es detectar ese script que tenemos aquí. Yo arrastro este canvas y luego del listado de opciones que tenemos aquí nos van a salir que al hacer clic no solo podemos acceder a ese script que tiene este objeto que se llama load the scenes y que aquí por ejemplo tendrá este método salir, 00:07:42
que es uno que he creado aquí, pues con ese nombre, ¿vale? Y otro será loadScene, que es el que he creado yo aquí, ¿vale? Recuerdo que tienen que ser públicos. Pues yo tengo aquí métodos ya que vienen por defecto, pero también métodos que he creado yo y que aquí, si está bien configurado, la gracia que tiene también es que podemos poner un parámetro al configurarlo, que es este parámetro que aparece aquí. 00:08:12
Entonces gracias a esto lo que podemos hacer es decirle, vale, yo voy a decir que cuando hagamos clic cargue el script de load the scenes porque está configurado, está ya digamos establecido como componente en este canvas, pero aparte yo, claro, cuando pulso el botón no es solo carga escena, quiero que sea versátil y no hacer un método como pasaba lógicamente también. 00:08:35
no hay ninguna crítica, como os pasaba a muchos en la tarea 3, 00:09:05
que hacíais una script para cargar cada nivel. 00:09:08
Pues script para nivel 2, que lo que hacía era cargar el 3, 00:09:11
y script para el 3, para cargar el 4. 00:09:15
En el tema se habla de que las escenas se pueden cargar poniendo un número, 00:09:18
que es el número del índice que acabamos de hablar en el build settings, 00:09:22
o también, bueno, más complejo de adivinar, que es poner el nombre, 00:09:26
por ejemplo, de esa escena. 00:09:30
Pero los números, lo bueno que tiene es que se puede sumar, restar y se pueden hacer operaciones para navegar entre unos y otros. Por tanto, aquí, si yo, digamos, que preparo este parámetro en el propio método, luego ya voy a poder cargar la escena de este número que pongamos en el inspector, ¿vale? 00:09:32
Aquí no recuerdo, la escena que quiero cargar es el nivel 1, ¿vale? Aquí tendré que poner, a ver, que es que como lo he tocado no me acuerdo, nivel 1 es el índex 1, perfecto, pues 1, ¿vale? Entonces yo he configurado que cuando haga clic en ese botón, aquí lo tengo, paso al nivel 1 que es el de jugar y ya puedo jugar. 00:09:52
¿Vale? Entonces es importante tener en cuenta que los comportamientos de los métodos interactivos, y voy rápidamente, no lo quiero guardar, ¿vale? Lo que cambia por si hay que tocar algo, pero en un input, ¿vale? Por ejemplo, que es esta entrada de texto, si vamos navegando por sus elementos y vamos a input username, va a haber otros, este es otro de los elementos que se pueden agregar, ¿vale? 00:10:13
Este, por ejemplo, o el Legacy, el Input Fill, ¿vale? 00:10:42
Es ese campo de texto que se puede introducir. 00:10:46
Aquí no es al hacer clic cuando sucede la acción. 00:10:49
Aquí es cuando cada vez que vayamos cambiando un valor, 00:10:51
es decir, vayamos tocando una tecla, 00:10:54
pues yo aquí he preparado otro canvas con otro script diferente 00:10:57
adaptado a qué estamos buscando en este menú, ¿vale? 00:11:00
Pues que se va a ocupar de un texto, de un slider, 00:11:05
y también de los textos que va a ir mostrando aquí de dificultad. 00:11:08
Bueno, ahora vamos a ese, pero simplemente que veáis que en el canvas de este nivel lo que he hecho es un menú, un script, perdonad, pues ya preparando todas las necesidades que vamos a tener con estos inputs y los eventos que tienen aquí, ¿vale? 00:11:12
Los textos, estos input fields, no solo pueden lanzar eventos cuando estamos cambiando los valores. 00:11:27
Puede ser que sea cuando terminemos de editar y salgamos. 00:11:39
En ese caso, habría que añadir aquí el canvas, en este caso, que es el objeto que tiene el método, 00:11:43
y aquí poner el método que nos interesaba. 00:11:48
DayDestines, este canvas, sería el de ConfigMenu. 00:11:51
Yo busco aquí que he preparado funciones en ConfigMenu y aquí tendré que ver, por ejemplo, UpdateInput y UpdateSlider, que son los métodos públicos que he generado yo en este. 00:11:57
Yo os lo voy a enseñar para que lo veáis también. A ver si quiere, que es configMenu, que es otro script que yo he creado aquí, pues que tiene otros métodos públicos, que nuevamente lo que haces es, al lanzarse ese evento, pues hará lo que haga aquí. 00:12:12
El de updateSlider será este y el de updateInput será este. Nuevamente, que sean métodos públicos. 00:12:28
Entonces, voy a eliminar esto. Simplemente eso que tengáis en cuenta, que el canvas es muy buen elemento para ir. 00:12:39
Aquí había un botón que queremos que cargue escenas. Puedo hasta aprovechar el mismo porque luego al dar a este botón, 00:12:47
Pues lo que pondré es que vaya al arcenacero, porque estoy reutilizando scripts, no hay que hacer uno por cada uno, porque gracias a ese parámetro en el método puedo indicar a qué índice de los build settings quiero dirigirme, quiero que se cargue cuando dé ese botón, pero eso. 00:12:54
Luego he añadido otro script en el canvas que tiene aquí distintas funcionalidades, distintas variables con las que iremos jugando. 00:13:09
Simplemente algo que es importante 00:13:19
Que también cuando os hayáis puesto 00:13:23
No quiero guardar 00:13:26
Cuando os hayáis puesto a trastear 00:13:27
Con crear el canvas, poner la imagen de fondo, etc 00:13:29
Es que a veces no es del todo intuitivo 00:13:32
Cómo surge esto 00:13:37
En el canvas, en cualquiera 00:13:38
Al final está 00:13:40
Cómo se ve este canvas 00:13:41
Pues si es una sobreposición a lo que haya en la escena 00:13:42
Que sea un poco independiente de la cámara 00:13:45
y que básicamente se ponga por encima, que se ubique en el espacio como un elemento 3D 00:13:48
o que tenga en cuenta una cámara y ya el plano focal también, ¿vale? 00:13:52
Pero más que eso, este canvas scaler en relación con que en la pantalla game, ¿vale? 00:13:56
Y esta es la forma de testear si están escalándose bien o no los elementos que tengamos en juego 00:14:03
de User Interface, es que nosotros, por defecto, en la pantalla de juego, 00:14:12
en donde estamos simulando el juego, vais a ver que aquí hay distintos aspect ratios. 00:14:18
Pero nosotros aquí podemos definir cuál es el tamaño de ese juego, 00:14:23
el tamaño final en el que estamos pensando que se está haciendo nuestro juego. 00:14:28
Vosotros tened en cuenta, y por eso sucede que yo cuando voy arrastrando, 00:14:32
haciendo más grande y más pequeña esta pantalla 00:14:36
pues salen estos rebordes 00:14:38
que son el fondo 00:14:41
este 00:14:43
Skybox 00:14:44
este HDR que envuelve 00:14:45
pero nosotros 00:14:48
cuando juguemos no vamos a querer 00:14:51
que se vean esos fondos, queremos que se adapte 00:14:52
a las medidas 00:14:55
si nosotros sabemos que nuestro juego 00:14:56
se va a reproducir en dispositivos 00:14:59
que son de 1920 00:15:01
por 1080 píxeles o full HD 00:15:02
nosotros podemos definirlo ahí 00:15:05
pero tener en cuenta una cosa 00:15:07
y esto es algo que a veces 00:15:09
no tenemos en cuenta pero cuando hablamos 00:15:10
de un píxel, realmente un píxel es 00:15:13
un cuadrado con información de brillo 00:15:15
un píxel de una pantalla 00:15:18
pero no tiene una medida establecida 00:15:19
habrá móviles 00:15:21
de hecho normalmente los móviles 00:15:24
con los que contamos son una pantalla 00:15:25
pequeñita de 1920 00:15:27
por 1080 si lo ponemos en 00:15:30
horizontal y es 00:15:31
la misma resolución, las mismas dimensiones en píxeles que a lo mejor el monitor de ordenador, 00:15:33
que es cinco veces más grande, que también es 1920x1080 píxeles. 00:15:38
Por eso es importante tener en cuenta que se pueden hacer contenidos de user interface 00:15:43
con un tamaño de píxel lo que se llama constante, que es decir, en relación a las dimensiones 00:15:48
que tenga la pantalla que sea, que cada unidad de medida que tenga nuestro proyecto, que sean 100 píxeles. 00:15:57
Entonces están, y luego aquí hay una que incluso lo que hacemos es que decimos, no, la pantalla es que va a tener 00:16:12
estas medidas físicas, reales, y con una densidad de píxel X, que es esto del DPI. 00:16:18
¿Qué sucede con esto? Que hay siempre que tener en cuenta que a menos que sepamos las medidas concretas de la pantalla y siempre vaya a ser la misma, o tenga muy claro que siempre va a ser en un dispositivo de 1920x1080 en este caso, habría que jugar, o lo suyo sería que se escalara con el tamaño de la pantalla. 00:16:24
Es decir, que nosotros pongamos una referencia concreta y por eso se pone esta resolución de referencia en plan, mira, el trabajo que estoy haciendo ahora es en base a estas medidas. Pero bueno, que si luego se empieza a hacer más grande o más pequeño, y esto lo hago en la pantalla de game, no en la de escena. 00:16:44
La escena es el editor de Unity, vamos, es como donde operamos, donde se ve el resultado es en el simulador de juego. 00:17:02
Y aquí es donde podemos decir, vale, que no sean unas medidas concretas, que no sean 1920 píxeles por 1080 píxeles, 00:17:10
que el dispositivo le está diciendo que tiene estas dimensiones, sino que tenga un aspect ratio, vale, un alto y un ancho siempre de 1920 por 1080. 00:17:17
Sí que es verdad que a no ser que sean pantallas muy extrañas, está un poco universalizado este 1690, o bueno, en informática sobre todo un 1690, perdón, está especializado, está estandarizado. 00:17:24
pero esto a lo que quiero llegar es que se habla luego en los elementos en los propios elementos 00:17:39
de que existe esto de los puntos de los puntos de anclaje vale y esto tiene sentido cuando ponemos 00:17:45
unas dimensiones que están establecidas si lo que hacemos es que se escale con el tamaño de 00:17:53
la pantalla veis que lo que va a hacer es oye tómate esta proporción de aspecto este aspecto 00:17:59
de 16 novenos y si la pantalla fuera más grande o más pequeña mientras tenga esa proporción pues 00:18:06
no va a haber problema porque se escalará todo uniformemente que ocurre que si tenemos una 00:18:14
pantalla muy pequeña también puede suceder que de pronto pues los botones se hacen muy pequeños y 00:18:19
si queremos que aunque la pantalla la resolución fuera pequeña los botones como los vamos a hacer 00:18:25
pulsar si hicieron más grandes ahí es cuando nos puede venir bien jugar con que lo que tome es vale 00:18:30
en relación a los píxeles que tenga esa pantalla pues oye yo quiero que este elemento vale y aquí 00:18:36
es donde seguirán ajustando la proporción de cuántos píxeles tiene cada bueno esto me está 00:18:42
saliendo bueno voy a poner un poquito más grande vale es donde yo indico como quiero que esto se 00:18:48
escale o no, ¿vale? Que es donde habrá que ir diciéndole que esto tenga una proporción 00:18:54
X y este botón, por ejemplo, de jugar, que lo vemos aquí con estas anclas, se vaya escalando 00:19:00
a medida que esa pantalla detecte que es más grande o no, ¿vale? Esto ya, a ver, lo voy 00:19:09
a hacer con el botón de jugar, pues si vamos definiendo aquí estos puntos de anclaje, 00:19:14
¿vale? Cuando vayamos haciendo más grande y más pequeña la pantalla, veis que sí 00:19:20
que se queda en un sitio y con unas proporciones a lo que quiero llegar vale que esto sí que es 00:19:23
un poco prueba y error porque en el momento es un poco confuso entenderlo claramente en plan 00:19:28
cuando sucede algo cuando sucede no es que a no ser que tengamos muy claro que va a tener unas 00:19:33
medidas muy concretas normalmente lo que nos interesa es que toda la pantalla se haga más 00:19:39
o menos grande vale porque además por lo general eso tenemos ya proporciones muy estandarizadas 00:19:43
pero otro elemento importante 00:19:50
que a veces sucede también cuando corrijo 00:19:53
vuestras tareas, también normal, es que cuando 00:19:55
ponemos FreeASP es básicamente que nos llene 00:19:57
con contenido pues todo el 00:19:59
cuadro que tengamos, todo el visor que tengamos 00:20:01
de la pantalla game, nada se adapta 00:20:03
se adapta al ancho y al 00:20:05
y al alto 00:20:07
pues para que se ajuste 00:20:09
en relación a lo que sería ese 16 novenos 00:20:11
en este caso que está ahí establecido 00:20:13
¿vale? y de hecho si os fijáis 00:20:15
por eso sale esta caja 00:20:18
que sobresale, porque al final se está todo el rato ajustando para que coja o el ancho o, atención, el alto, y veis que ahora coge la otra dimensión de esta caja de referencia, ¿vale? 00:20:19
Para que se adapte en todo momento. Pero lo suyo, ¿vale? Y aquí siempre está todo a escala 1, lo suyo en ocasiones, cuando queremos ver que algo tiene unas medidas concretas 00:20:31
Y cómo se va a ver realmente es que si nosotros tenemos una pantalla en la que estamos haciendo las pruebas, que es 1920x1080, lo pongamos ya en esas dimensiones y veréis que ahí en ese caso sí que la escala va cambiando, se va haciendo más grande o más pequeña. 00:20:42
Porque aquí, con respecto a mi monitor, sí que se está viendo pequeño. Mi monitor podría enseñarlo, en ese aspecto que tenemos, y dado que mi monitor le está diciendo al sistema que es 1920 píxeles por 1080, en realidad aquí sabe que se está haciendo más pequeño. 00:20:58
Pero en realidad esto, como se vería si lo viéramos a tamaño completo, es esto. Esta es la medida real que va a tener en un dispositivo con el que estoy viendo. 00:21:14
Entonces, que a veces pueden surgir como pixelados raros o no, esto para comprobar que se ve sin pixelado, porque a lo mejor estoy haciendo, ahora no porque estoy haciendo que sean las dimensiones, pero veis que se están pixelando aquí, imagino que lo veis en el streaming, se están pixelando aquí elementos porque estoy haciendo una escala sobre el visor, pero realmente las dimensiones es esta. 00:21:23
Y esta es la referencia que tendríais que tener de si se está viendo algo pixelado o no, ¿vale? Que a veces sucede que escaláis los textos y se ven pixelados o no, o a veces es porque estáis haciendo esto y lo estáis viendo así, ¿vale? Que sepáis que la referencia de cómo se ve es siempre 1. 00:21:46
Es verdad que para verlo bien, lo suyo sería que cuando reproduzcamos, al darle a play, pongamos este modo de play maximize y va a coger el tamaño o casi, aunque aquí ponga escala 1, realmente no está a escala 1 porque esto está ocupando espacio, pero veis aquí que tiene las dimensiones más o menos que debería tener. 00:22:02
Se está ajustando a todo el ancho de la pantalla. Entonces, bueno, es como mejor se vería para verlo lo más fiable posible. Dicho esto, bueno, lo mismo de siempre. En realidad, si ponéis un 16 novenos, pues más o menos vais viendo las medidas. 00:22:25
Pero no se está diciendo cuándo está viendo ese pixelado o no por esta ampliación, porque siempre te va a poner uno. Aunque yo lo haga muy pequeño, veis que como es relativo el espacio y no está cogiendo el dispositivo en el que lo vemos, que en este caso es mi pantalla o puede ser el móvil, pues se ve así. Siempre a un uno que no es el real, no es el tamaño real. 00:22:40
Pero bueno, está haciendo una adaptación con este Scale with Screen Size que sí que en realidad es relativo. Pero bueno, que sepáis que eso, que si estáis trabajando para pantallas concretas o dimensiones de píxel concretas, esto es muy importante. 00:23:01
vale, me pone una pregunta 00:23:15
algunas fuentes que he cargado en Unity 00:23:17
no me funcionan, aparecen pero no se aplican 00:23:19
es muy raro, vale, necesito 00:23:22
que me contestes si estás 00:23:23
usando en tu proyecto el 00:23:25
TextMeshPro o el TextLegacy 00:23:27
es decir, si has instalado el 00:23:29
TextMeshPro, vale, el TextMeshPro 00:23:31
si no me equivoco 00:23:33
lo voy a buscar un segundo, os dejé un tutorial 00:23:35
mira 00:23:37
aquí, si vas al 00:23:39
apartado 3.1.1 00:23:41
hay aquí un método 00:23:43
imagino que es esto 00:23:46
de cómo convertir una fuente de texto 00:23:48
una tipografía para que funcione en TestMeshPro 00:23:50
si no me equivoco 00:23:52
tendría que verlo 00:23:53
pero si no me equivoco 00:23:56
cuando instalas el TestMeshPro 00:23:58
yo ya lo he instalado 00:23:59
como pone en el tema 00:24:00
hay un menú aquí 00:24:01
que se llama FontAssetCreator 00:24:05
tendría que importar esto 00:24:07
que no lo hice 00:24:09
lo importo 00:24:09
Dame un segundo de cargue y tal, ¿vale? 00:24:11
Bueno, y cuando, bueno, perdona, que se me ha desconfigurado un poco la pantalla. 00:24:15
Eso, cuando instaláis todo lo necesario para ir funcionando con TestMesh Pro, 00:24:21
aparece esta opción del asset creator y aquí puedes buscar esa tipografía, ¿vale? 00:24:26
Que tengas, la metes y, bueno, hay distintas opciones que en principio no habría que tocar mucho 00:24:32
porque yo creo que por defecto la va a hacer bien 00:24:37
y es generate font 00:24:39
atlas, cuando le das aquí 00:24:41
hace un proceso que básicamente 00:24:43
lo que hace es guardar esa tipografía 00:24:45
no sé muy bien donde me la guarda 00:24:47
ahora mismo 00:24:49
pero básicamente en algún punto 00:24:50
del nivel, o igual 00:24:53
hay que guardarlo y ahora no me acuerdo 00:24:55
aquí en fonts, vale 00:24:57
me ha creado esta tipografía 00:24:59
¿vale? y esta tipografía 00:25:01
ahora sí que la puedo meter 00:25:03
pues en donde haya 00:25:05
un campo de texto 00:25:07
pues se puede meter este legacy 00:25:08
¿vale? y en principio 00:25:11
bueno es que yo no estoy 00:25:13
usando el testmesh pro ¿vale? ese es el problema 00:25:15
que cuando 00:25:17
no es testmesh pro 00:25:19
con arrastrar la tipografía a los assets 00:25:20
¿vale? ya se carga, ya se puede usar 00:25:23
pero claro testmesh pro como tiene 00:25:25
más opciones de sombrearla, de ponerle 00:25:27
rebordillos, hacer ese tipo 00:25:29
de cosas, hay que hacer esta operación de 00:25:31
convertirla ¿vale? con el 00:25:33
Fondo Asset Creator y ya una vez está creado, ya sí la puedes usar en un TestMesh Pro. 00:25:35
De hecho, pongo uno aquí, aunque sea de prueba. 00:25:40
Voy a poner aquí y voy a decirle que sea Liberation Sans. 00:25:44
Esta tipografía aquí, le digo tipografía aquí. 00:25:49
Y ya me la está cogiendo, por lo que veo. 00:25:54
A ver, la que acabo de crear es esta, si no me equivoco. 00:25:57
Y lo que voy a hacer es poner hola y lo voy a poner más grande y que esté donde tiene que estar, que es... 00:26:04
Esto, la cosa es que está muy... Vale, importante, porque no se está viendo, porque lo he creado fuera del Canva, importante también, que si no, no se va a ver en la vida. 00:26:17
y te te espera pero nada pero no se está viendo también por qué 00:26:34
vale porque se está desbordando probablemente 00:26:50
está ahí porque no se ve lo primero voy a borrar esto voy a 00:27:01
hacer el canvas cuál no os recomiendo usar está detrás 00:27:06
del fondo ahora lo vemos pero no pero no está detrás del fondo bueno ahora lo probamos si lo 00:27:12
dice será ahora si está no sea crearlo no le crea bien ahí está vale ahora sí que es importante 00:27:20
cuando creéis un elemento de yu hay sino si ya está el canvas pues darle al canvas que va a 00:27:28
quitar problemas si yo antes cuando lo arrastraba en principio estaba ya abajo del todo bueno esto 00:27:33
lo que dice el compañero, el orden 00:27:39
de renderizado, cuando hay elementos 00:27:41
que ocupan todo, como este fondo 00:27:44
va de abajo a arriba, es decir 00:27:45
lo de abajo se ve por encima 00:27:47
por ejemplo 00:27:49
si yo quito aquí zoom 00:27:50
y pongo 00:27:53
voy a hacer más grande 00:27:54
la caja, si lo pongo 00:27:57
encima, imagino que lo veis 00:27:59
del botón, al estar 00:28:01
por debajo de la jerarquía se ve por delante 00:28:03
si lo pongo por detrás, se ve por detrás 00:28:05
¿vale? es lo que decía, pero yo creo que estaba bien 00:28:08
pero vaya, ¿tipografía 00:28:10
que usar? pues 00:28:12
la que queráis 00:28:13
la verdad es que no tengo 00:28:15
ninguna pensada 00:28:17
si queréis 00:28:18
esta de Legacy Runtime, si no me equivoco 00:28:21
viene con el propio sistema 00:28:23
entonces 00:28:25
pues esa misma 00:28:27
no recuerdo 00:28:29
si esta la descargué o 00:28:31
la bajé de por ahí, pero yo creo que esta 00:28:33
está ya directamente con Unity. Pues esa, por ejemplo, podría estar bien. Pero la que veáis, 00:28:35
pues básicamente que se vea bien. Que sea... Hombre, normalmente las gordotas, las que son 00:28:45
así más gruesas, que tienen así... Y lo que se llama un compress, que es que son más verticales 00:28:51
a veces que horizontales, que es lo que pasa aquí, que son bastante verticales, pues funcionan bien. 00:28:57
no lo sé, si queréis 00:29:02
tipografías hay una web 00:29:04
que supongo que conocéis de RPMI 00:29:06
que se llama 00:29:08
bueno 00:29:09
Dafont por supuesto que tiene muchísimas 00:29:12
no siempre tienen que ser de muchísima calidad 00:29:14
pero hay muchísimas 00:29:16
y muchas gratis, os lo ponen aquí 00:29:18
y muchas categorías, luego hay otra 00:29:20
que son como más de diseñadores 00:29:22
establecidos que es esta de Lost Type 00:29:24
que también tiene muchas 00:29:26
tipografías y 00:29:28
en algunos casos son gratuitas 00:29:30
Aquí, a ver, ¿cómo era para ver si vamos a fuentes? Pues, por ejemplo, esta, no todas son gratuitas, pero, por ejemplo, esta de Tofino, que además veis que tiene muchos gruesos. Pues, aquí, si pone que es un paga lo que quieras, pues, aunque no sea lo más adecuado probablemente, si ponéis cero la podéis descartar. 00:29:32
El compañero dice, los assets de Unity, hay algunas bonitas también en Asset Store. Pues también puede haber, aunque yo, ¿verdad? Que no suelo buscarlas aquí. También hay a veces fuentes que se pueden usar. Vale, entonces, bueno, pues la que veáis más adecuada. 00:29:54
Esta de Runtime, a ver, yo creo que es que viene con el sistema al menos en Windows 00:30:16
Sí, es que de hecho es la que viene por defecto con Unity, si no me equivoco 00:30:23
Entonces, bueno, fíjate que es la que estoy usando yo en el ejemplo 00:30:31
No me preocupa de poner otra más compleja 00:30:34
A ver, un segundín, que voy a ver si hay algo más que explicar aquí de lo que yo hice por código 00:30:38
Bueno, luego hablaremos de esto, que es que si carga la primera escena, yo he hecho que las vidas se recarguen con tres. Y uso este GameManager, ahora vemos, pero que básicamente es el script, lo tengo aquí, otro script que se llama GameManager, que la gracia que tiene es que todo lo que tiene dentro son variables estáticas. 00:30:44
Y con variables estáticas, en cómo estamos funcionando en esta ocasión, es, y aquí soluciona parte de la duda que me están diciendo de cómo cargar un test input que se pone en un menú para que salga en el hat del otro, que es que habrá que guardarlo en una variable estática pública, siempre, de tipo string, que es username. 00:31:02
Y en esta variable estática, que va almacenando independientemente de la escena, digamos que está por un nivel superior al resto de scripts, a nivel de que siempre está accesible, aquí es donde guardaremos este nombre. 00:31:26
De hecho ahora hablo del Game Manager 00:31:41
Si me decís que no tenéis 00:31:44
Dudas de este primero 00:31:46
Antes incluso que pasara el de configuración 00:31:48
Hacemos una 00:31:50
Una visita a esto 00:31:51
Esto, de este nivel alguna duda 00:31:53
Paso a la siguiente 00:31:56
Vale, dudas 00:31:59
Me dicen 00:32:04
Podéis hablar por micrófono si es más rápido 00:32:05
Pero bueno, o si me lo escribís 00:32:09
O si no voy avanzando y luego vuelvo allá 00:32:10
Digo porque es que si no a lo mejor tardáis 00:32:13
Sí, hola 00:32:15
A ver, es una tontería 00:32:16
por ejemplo, con el ratón pasas por jugar 00:32:19
configuración, salir 00:32:21
¿lo podemos también hacer con 00:32:23
teclado, ratón y mando? 00:32:25
¿Te refieres a la navegación? 00:32:28
00:32:31
Sí, eso es lo que 00:32:31
por lo que existe este Event System 00:32:32
y está este 00:32:34
el primero que está seleccionado 00:32:35
que yo he puesto el botón 00:32:39
play, ¿vale? para que aparezca y por eso 00:32:40
de hecho cuando yo doy a reproducir 00:32:43
vas a ver, yo no toco nada 00:32:45
bueno, está esto de maximizado, ves que jugar 00:32:46
está seleccionado, y yo ahora 00:32:48
voy a mover las flechas del ratón 00:32:51
de, uy, del ratón, las flechas 00:32:53
del teclado, no estoy tocando el ratón, puedo ir 00:32:55
hacia arriba, hacia abajo, y luego 00:32:57
le doy a intro, y juego 00:32:59
no he tocado el ratón para nada, eso 00:33:00
se, y voy a quitar esto de 00:33:03
maximizar para que se vea todo 00:33:05
claro, tú con el event system dices 00:33:07
primero, cuál de los elementos 00:33:11
es el que aparece seleccionado 00:33:13
He arrastrado este button play, lo he arrastrado y lo he dejado ahí. Y aquí están los ejes, que son los axis, se llaman igual que los axis, que ya conocemos, pero vamos a conocerlos otra vez, de los project settings y el input manager. 00:33:14
Pues con las teclas que tengamos aquí de horizontal hará movimiento horizontal, vertical, submit, que es el de acceder y el de cancelar, que es para si hay alguna acción que se deshabilita una vez ya está hecha. 00:33:30
Se hace con las teclas que pongamos aquí. Por ejemplo, el vertical, que es el de las flechas arriba y abajo, también debería, y lo voy a hacer ahora mismo, con la S y la W navegar. 00:33:45
¿Ves? Con S y W navego. Esto se da, creo que lo pone también en el tema, cuando tenéis botones, ¿vale? Y tienen que ser elementos que se puedan seleccionar. Y básicamente serán los elementos que dentro de sus opciones tengan esto de Interactable. 00:33:56
Unos solo botones, si no me equivoco, luego lo vemos, en los input fields también habrá algo relacionado con el interactable, los sliders también, ¿vale? Pero esto se define en esta navegación, está la automática, que lo que hace es ver dónde hay distintos elementos interactuables en la escena, ¿vale? 00:34:12
Y hace una navegación, digamos, automática que cuando damos a este botón de visualizar, ¿vale? Y nuevamente hay que ir a la escena, no al juego, ¿vale? Veis que salen esas flechitas que pone arriba y abajo porque ha detectado que para pasar de este a este, pues lo lógico es una dirección vertical. 00:34:33
si yo por ejemplo moviera esta flecha 00:34:50
veis que ya empieza a complicarse 00:34:53
si estando en jugar doy a la 00:34:54
y ves que sale de la derecha 00:34:57
voy aquí a config 00:34:59
y ahora el primero que va a salir 00:35:00
seleccionado es jugar 00:35:03
es decir, si doy ahora abajo 00:35:04
espero que veáis la flecha 00:35:07
porque igual lo veis muy pequeñillo 00:35:10
me acerco aquí 00:35:11
cuando yo de 00:35:12
cuando yo de abajo va a ir a salir 00:35:14
ahora, ¿vale? 00:35:17
y cuando de arriba va a config 00:35:19
Y cuando doy arriba o a la izquierda va a jugar. Esto se debe a que se está gestionando con esta navegación y con visualizar vemos, si activo o desactivo, esto es solo una ayuda visual de cuál es, por qué lado es la tecla de navegación para ir a otro de los elementos. 00:35:20
Eso lo hacen automático, como dice, de manera automática. Si lo pones en explicit, hay una forma de... a ver, espera, dejo el visualizar, quito todo y digo explícito. 00:35:37
Entonces aquí lo que habrá que ir poniendo, aunque esta opción no la recomiendo, es que podemos ir arrastrando aquí, al darle abajo en este botón de play, quiero que vaya al botón de config. 00:35:51
Y cuando dé a la izquierda en este botón de play, porque cada uno tiene su propia navegación que habría que ir configurando, vas diciendo de manera explícita hacia dónde hay que dar, cuál es la dirección. 00:36:03
pero bueno, lo suyo es poner que sea automático 00:36:17
y si ponéis horizontal y vertical 00:36:21
con esto podéis restringir que a lo mejor 00:36:24
todas las interacciones tengan que ser de manera horizontal 00:36:26
y no se admitan las verticales 00:36:31
pero bueno, esto habría que irlo haciendo en todos los botones 00:36:33
cada botón tendría sus combinaciones 00:36:36
lo más fácil, el automático y detecta 00:36:38
incluso quitar el explícito 00:36:40
y aquí detecta según visualmente 00:36:42
cómo se distribuyen los elementos de la escena 00:36:45
pues veis que va poniendo unos axis, unos botones que son de izquierda a derecha, arriba, abajo, los que van haciendo la navegación, ¿vale? 00:36:47
Entiendo que te he contestado la duda. 00:36:57
Sí, gracias. 00:37:00
Vale, pues vamos, voy a explicar qué es el Game Manager. 00:37:03
Hay una cosa que pone en el tema, que es verdad que en esta versión de Unity vi que no sucede y lo han ido quitando, debe ser, en las últimas, 00:37:07
que es que cuando creas un script llamado 00:37:14
GameManager, antes aparecía una tuerquita 00:37:17
y ya no, bueno, era solo una 00:37:18
ayuda visual para tener claro 00:37:21
cuál era el GameManager 00:37:23
y esa de la tuerquita, bueno, venía bien 00:37:24
porque era más visual 00:37:27
significa que cuando a un script 00:37:28
lo llamamos GameManager, pues algo 00:37:31
tiene de especial para que le pongan otro 00:37:33
icono 00:37:35
propio 00:37:36
y esto es porque 00:37:38
básicamente por convención también 00:37:40
suele haber un script en el juego que se llama GameManager 00:37:42
en el que se van estableciendo 00:37:47
puede haber más de uno realmente con otros nombres 00:37:49
pero bueno, que GameManager es un script 00:37:52
en el que digamos todas las mecánicas 00:37:56
bueno, la palabra no es mecánicas 00:37:59
todas las variables 00:38:00
o los elementos de programación que vayan a ser recurrentes 00:38:04
en todo el juego, como sucede aquí, pues que sea 00:38:08
entre diferentes niveles y no sea solo 00:38:10
de un nivel, pues es este gestor de juego 00:38:12
y es donde vamos almacenando 00:38:14
información para desde este script 00:38:16
irla gestionando entre distintos niveles 00:38:18
como he dicho antes, para que esté 00:38:20
en un nivel superior al resto 00:38:22
de scripts que operan 00:38:24
en el componente que 00:38:25
los asignes 00:38:28
y que esté siempre 00:38:30
accesible o pueda hacer operaciones 00:38:32
de más alcance 00:38:34
en este caso 00:38:36
y es un ejemplo 00:38:38
importante a tener en cuenta 00:38:40
de para qué serviría 00:38:43
esta lógica, que es este 00:38:45
el de crear funciones estáticas 00:38:47
perdón, variables estáticas 00:38:49
cuando creamos una variable 00:38:52
estática, y lo mismo 00:38:54
por defecto 00:38:55
una estática para poder acceder 00:38:57
desde otros scripts y poder modificarlo 00:38:59
y acceder a estas variables 00:39:02
pues habría que hacerla pública 00:39:03
luego al declarar la variable 00:39:05
pues ponemos el tipo de variable 00:39:07
que es, un int, un string, un flow 00:39:09
lo que sea, podría ser lo que sea 00:39:11
y luego el nombre que tiene esta 00:39:13
variable, hasta aquí como siempre 00:39:15
lo único que ha cambiado es que 00:39:18
siendo pública, aparte 00:39:19
digamos que permanece, por eso de estática 00:39:21
permanece incluso cuando se 00:39:23
para un nivel 00:39:25
¿vale? y se recarga 00:39:28
en otro nivel otros scripts 00:39:29
esto, como 00:39:31
tenemos una clase 00:39:33
llamada GameManager, que es pública 00:39:36
y una variable que es pública 00:39:37
esto como ya vimos en su momento 00:39:39
en otros scripts, siempre ya 00:39:42
desde cualquier otro punto de los scripts 00:39:44
abro este por ejemplo 00:39:47
a ver si quiere que 00:39:48
a ver, espera, voy a ir agrupando 00:39:49
porque si no tengo aquí un montón de ventanas 00:39:52
y no es lo que quiero 00:39:54
en este por ejemplo, bueno, veis 00:39:55
que aquí lo que estoy haciendo 00:39:58
tengo un 00:40:00
un static que se llama lives 00:40:02
y yo aquí 00:40:04
sin haber creado ningún tipo de variable 00:40:06
antes, puedo hacer directamente 00:40:08
a la variable lives, simplemente poniendo 00:40:10
¿vale? fijaos que tengo otra 00:40:12
así rápidamente que se llama username 00:40:14
que ahí es donde vamos a almacenar el nombre del jugador 00:40:15
por cierto, ¿vale? pues si yo aquí 00:40:18
quisiera que 00:40:20
¿vale? el nombre del jugador 00:40:21
cuando cargara la escena 1 00:40:23
¿vale? fuera Pepito 00:40:25
¿vale? independientemente de 00:40:27
de lo que haya 00:40:29
puesto en un input field o como lo hayamos 00:40:31
asignado, yo puedo aquí decir 00:40:34
¿vale? pues que el username sea 00:40:35
Pepito, ¿vale? Como es un string 00:40:37
Pues habrá que ponerlo como un string 00:40:39
¿Vale? Es verdad que hay que acordarse 00:40:42
De qué tipo de variable es 00:40:43
O bueno, ponerte encima y veis que dice 00:40:45
StaticString, ¿vale? Pero veis que no da error 00:40:47
Yo puedo acceder a 00:40:50
Variable estática, a la clase 00:40:51
Y a una variable estática 00:40:53
Sin tener que capturarla de ningún lado 00:40:54
¿Vale? Tengo aquí la dificultad, las vidas 00:40:57
¿Cuál más había puesto? 00:40:59
Ah, bueno, y el username que ya lo he puesto 00:41:01
Pero aquí está, username 00:41:03
Ahí está, ¿vale? GameManagerUserName. Y eso es lo bueno que podemos hacer desde cualquier momento. Voy a guardar esto y ahora cuando cargue el nivel, al darle a jugar, vais a ver que pone ya Pepito, porque yo tenía ya establecido que pusiera lo que esté guardado en esa variable GameManager.UserName, que es un string que lo muestra aquí. 00:41:05
entonces 00:41:30
básicamente hay que tener la lógica 00:41:32
en este momento, ¿vale? 00:41:36
de que va a haber un script en el que vamos a 00:41:37
poder ir guardando 00:41:40
desde distintos scripts o momentos del juego 00:41:41
variables para que estén ahí almacenadas 00:41:44
y poder recuperarlas 00:41:46
¿vale? entiendo que esto además 00:41:48
es una liberación, también hay que ser cauteloso 00:41:50
con qué se usa y qué nombre se ponen 00:41:52
para que no haya conflictos con 00:41:54
variables que hay en los propios scripts 00:41:56
pero en los otros scripts ya 00:41:58
Porque por ejemplo lives es a lo mejor una variable muy fácil de crear en otro script y la sobre escribes y ya empiezan los problemas. Pero bueno, veis que es una forma rápida y sencilla de acceder a variables. 00:42:00
Entonces, voy a ir al menú de configuración. No guardo porque no quiero los cambios. Aquí en este canvas, voy a ver si me habéis escrito algo. En este canvas he generado, aparte de la imagen de fondo de 1920x1080, que cuadra con el fondo, encima de eso he puesto otros tres elementos. 00:42:14
Uno de ellos es el slider, otro de ellos es el input y otro es un botón, que este no tiene más complejidad que los anteriores, un botón que lo que hace es, con ese load scene, cargar la escena cero, que es la de el menú inicial. Así que el botón, pasamos de él porque ya está más o menos establecido. 00:42:38
Vamos con el input primero, que me parece un poquito más fácil 00:42:57
El input, al final cuando creamos un input 00:43:02
Y atención, esto es lo que pone 00:43:04
Se pueden crear inputs con el texto antiguo, el legacy 00:43:06
Que se llamará luego por código de una forma 00:43:10
Que es el que de hecho he usado yo 00:43:13
Si voy a un script que luego vamos a ver 00:43:15
Pues tengo una variable de tipo texto 00:43:19
Que no es lo mismo que lo que pone 00:43:22
que si aquí cargamos el TextMeshPro 00:43:25
esta librería, va a haber otra 00:43:27
que en realidad el funcionamiento 00:43:29
es igual, solo que tiene más opciones 00:43:31
podemos hacer el TextMeshPro 00:43:33
Ugi 00:43:35
y voy a poner 00:43:38
texto 00:43:39
TMPro, vale 00:43:40
la única diferencia que hay entre estos dos 00:43:43
es que cada uno 00:43:45
hace referencia a un tipo de componente 00:43:47
cuando yo tengo un text 00:43:49
Legacy, aquí pone text 00:43:51
ya está 00:43:54
Si yo tengo un TestMeshPro, voy a crear uno aquí rápido, un elemento que tenga TestMeshPro, el componente, simplemente el texto. Se va a llamar TestMeshPro. Cada uno tiene el TestMeshPro y por eso existe, tiene más opciones que el text, pero a nivel de código la variable que hay que usar para un TestMeshPro es esta. 00:43:54
Si usamos el TestLegacy es esta. Aparte de eso, luego casi todas las propiedades son iguales, aparte de que TestMeshPro tiene más, pero las básicas son iguales. Esto lo pone en el tema, pero por si hubiera alguna duda, dicho queda. 00:44:17
Entonces, cuando hacemos un input, dentro tiene el espacio, digamos, que destinado... Vale, bueno, perdonad, esto es otro texto que he incluido dentro de este para que cuando arrastremos el input se mueva con él, ¿vale? 00:44:33
Pero básicamente, veis que va aquí esto de nombre usuario, es otro texto, que veáis que se pueden incluir más elementos dentro del otro, que es un texto simplemente para poner un encabezado de que es el nombre del usuario, que no es el input en sí. 00:44:59
Y luego está el input, porque me estaba haciendo un lío con la jerarquía, el input que dentro, en su interior, tiene esa caja del color que indiquemos aquí, que es una imagen, la podemos poner roja, blanca, etc. 00:45:14
Y es también donde se gestionan los cambios de valor que hagamos luego en los dos textos que tenemos dentro. 00:45:28
Es decir, tiene una imagen que también tiene estados de variación de su color, como pone aquí, para las transiciones, para marcar que estamos dentro, etc. 00:45:35
Y que salimos, etc. Véis que se oscurece, etc. Que eso está definido en estos colores que tiene aquí o se puede poner incluso alguna animación. 00:45:45
Lo que pone también en el tema, pero básicamente están ahí las interacciones. Con esto se define la caja y luego dentro hay dos tipos de texto. El placeholder, que es en grisáceo donde pone el mensaje de, oye, ¿qué instrucción quiero poner aquí? Pues en vez de escribir tu nick, pon tu nombre. 00:45:57
Y este texto en realidad, aunque se puede capturar por código, lo que está esperando es como una ayuda visual para que, temporal además, que de hecho eso es lo que quiere decir placeholder, está indicando que ahí lo que habría que poner es el nombre. 00:46:14
Donde de verdad se escribe el nombre es en este texto. Cuando lo escribimos al pulsar, vais a ver que yo cuando escribo aquí, empieza a escribir y básicamente se está volcando lo que yo escriba en este campo que hay aquí, en este parámetro. 00:46:34
Lo estamos haciendo en vivo y se está volcando ahí, ¿vale? Esto, lo que hay que pensar es que en algún momento nosotros podemos llegar a leer este campo de texto y su contenido para guardarlo como, en este caso, en la variable pública que se llama username, ¿vale? 00:46:50
que luego ya cuando tengamos el hat 00:47:13
pues también lo que va a hacer es 00:47:16
poner el username text 00:47:17
pues el texto que hayamos guardado ahí 00:47:19
¿sí? 00:47:21
entonces, a ver, me pongo aquí 00:47:23
vuestra pantallita por si me ponéis algo, vale 00:47:26
sigo, y esto no sé 00:47:27
por qué 00:47:30
sí, me pregunta alguien 00:47:30
adelante 00:47:34
hola 00:47:34
justamente la parte 00:47:36
del if y el else 00:47:40
del username 00:47:41
podríamos poner que si 00:47:42
no pones ningún nombre 00:47:45
te ponga como un name 00:47:47
o no name 00:47:49
de forma genérica 00:47:50
me va a hablar de esto, ¿no? 00:47:52
aquí ya está eso, dice 00:47:54
si la variable estática 00:47:57
está vacía, es decir, nunca se ha introducido nada 00:47:59
porque por defecto 00:48:01
cuando arrancamos el juego está así 00:48:03
y por tanto está vacía, hasta que guardemos 00:48:05
algo, si está vacía pone 00:48:07
player desconocido 00:48:09
este es el texto que pone si no ponemos nada 00:48:11
ah, vale 00:48:13
no está vacía, es decir, se ha introducido ya algo 00:48:14
el username va a ser 00:48:17
player, como siempre va a poner 00:48:19
esa coletilla de player, más 00:48:21
y después, dejamos un espacio 00:48:23
el nombre que se ha guardado en esa 00:48:25
variable estática 00:48:27
del nombre, que esa variable 00:48:29
estática solo se rellenará cuando escribamos 00:48:31
algo aquí, y se va a rellenar 00:48:33
además, porque 00:48:35
lo hemos puesto aquí, ¿vale? 00:48:37
es decir, cuando 00:48:39
a ver, esto ya empieza a ser un poco jaleo 00:48:40
de ir viendo en qué parte pongo 00:48:43
cosas, no sé 00:48:45
y es de lo que se trata, simplemente 00:48:47
que sepáis que aparte de lo que es el funcionamiento 00:48:49
del juego si estáis empleando, veis que 00:48:51
yo aquí en scripts, tengo los 00:48:53
scripts del juego de la tarea 3 00:48:55
que podéis usar la tarea 3 00:48:57
o lo que queráis, que tenga una cierta lógica 00:48:59
de que al dar a play 00:49:01
haya vidas y cuando muera vuelvas 00:49:03
a la pantalla de inicio 00:49:05
que me da igual que sea una bola 00:49:06
o sea otra mecánica, por si no hicisteis la tarea 3. 00:49:09
Pero realmente de User Interface solo hay cuatro scripts. 00:49:14
Y uno de ellos es el de cargar escena, que ya hemos visto, 00:49:18
que es simplemente preparar para los botones ese script. 00:49:21
El de Game Manager, como hemos visto, 00:49:25
es solo tener preparadas en un punto superior variables 00:49:27
que nosotros podamos rellenar con cosas. 00:49:34
Y luego tenemos este, que es el que tiene chicha y ahora lo vamos viendo, el que vamos a asociar este config menu al canvas para ir gestionando todo lo que tenemos aquí, todos estos inputs. 00:49:36
Aquí he preparado, como sería el Icefield 00:49:53
Varios elementos 00:49:55
¿Vale? Y luego hay otro que es el 00:49:57
Hat Manager, que es el del hat 00:49:59
Cuando jugamos, que tiene los corazoncillos 00:50:01
¿Vale? Vuelvo a... para que lo veáis 00:50:03
Este hat, y bueno 00:50:05
Antes lo que me habéis preguntado 00:50:07
Si no has puesto ningún nombre, pone por defecto 00:50:09
Player desconocido 00:50:11
Cuando pongamos algún nombre, este desconocido 00:50:12
Se ve reemplazado por lo que 00:50:15
Está guardado en el Game Manager 00:50:17
¿Vale? Y este hat tiene ese comportamiento 00:50:18
aparte de otra imagen 00:50:21
¿vale? aquí si vamos al canvas 00:50:24
este canvas pues tiene 00:50:26
esta imagen ¿vale? 00:50:28
pues que irá cargando según las vidas que nos queden 00:50:30
irá cargando una imagen 00:50:32
u otra ¿vale? en este caso 00:50:34
lo que se proporciona son varias imágenes 00:50:36
y cuando morimos vais a ver 00:50:38
que de pronto se cargará 00:50:40
vuelvo a abrir aquí, lo que se va a cargar es 00:50:41
la imagen que se llama 00:50:44
Live 2 00:50:47
que está ya hecha para que muestre esto 00:50:50
en el tutorial de Álvaro 00:50:53
de hecho lo que hace es como ir recortando la imagen 00:50:55
cambia las dimensiones de una única imagen 00:50:57
para que se vayan viendo un corazón u otro 00:50:59
se pueden cargar imágenes distintas, recortar 00:51:00
bueno, pues ya eso es 00:51:03
pensar cómo se hace y cómo se muestra 00:51:04
pero son cuatro scripts 00:51:07
por eso digo que quiero que quede claro 00:51:09
al menos como lo he resuelto yo 00:51:11
siempre puede haber otras formas y con más 00:51:12
elementos 00:51:15
Pero son estos cuatro scripts y me voy a centrar en esos para que veáis un comportamiento de cómo se puede conseguir esto. 00:51:17
Vale, sigo con el input. Estamos aquí. Tiene un placeholder que de este por defecto solo vamos a indicar ese mensaje de ayuda de pon algo aquí y el de texto que es el que sí queremos recoger el texto. 00:51:28
¿Vale? Recordad, ¿vale? Y me voy a este config menu. Joder, espera, porque esto siempre se me abre. Espera un segundo, que yo creo que lo puedo asociar aquí. Un segundo. Nada. Bueno, lo tengo aquí. ¿Vale? 00:51:43
Lo que se han preparado, esos serialized fields que os he enseñado antes, y mira, lo pongo aquí abierto para que lo veamos en paralelo, aquí en el canvas, ¿vale? Estos campos que tenemos aquí se corresponden con los que se han creado en este config menu, ¿no? Es el mismo menú, ¿vale? 00:51:59
Entonces, hay que pensar. Yo, dentro de lo que se pide la tarea y lo que nos interesa, lo que voy a querer es coger un texto o gestionar un texto, ¿vale? Una variable de tipo texto. Recordad que esto, las tipos de variables que se llaman con un nombre de clase, como slider, texto, etc., básicamente es el nombre que tiene el componente. 00:52:18
Se llama texto y por eso el de TestMeshPro se llama de otra forma, porque es que tiene un componente aquí que se llama texto. Entonces siempre que carguemos o hagamos un GetComponent de un componente, se va a llamar como se llama aquí. Casi siempre, no siempre, pero casi siempre. 00:52:39
Luego va a haber otro de tipo slider porque voy a querer jugar con este, esta variable que se llama slider 00:52:56
Que al final es la que tiene los valores de cuánto vale el slider, si os fijáis 00:53:07
Yo cuando muevo esto con value puedo ir gestionando desde el propio juego 00:53:11
Voy al moverlo, al ser un slider interactivo, voy, fijaos aquí, cambiando el valor de esto 00:53:19
¿Veis que cambia? Igual que yo puedo arrastrar por código, digamos, cambiar este valor por código y veis que también se ve reflejado en el juego, ¿no? Vale, entonces aquí estamos preparando esas variables, una para jugar con el slider y coger el valor, otro de texto de dificultad que básicamente es que he añadido aquí un campo que pone el nombre del nivel, ¿vale? 00:53:25
Que irá asociado a cada uno de los niveles del slider, ¿sí? Y luego, lo que no es el texto en sí, sino que podamos interactuar con un input field, ¿vale? Porque en cierto momento, nosotros lo que vamos a ir es tocando este input field y lo que recogemos es el texto, pero son dos entidades distintas, ¿vale? 00:53:50
Bueno, luego veis que los textos de dificultad, como voy a poner varios textos según el nivel, ¿vale? Esto de fácil, chupado, etcétera, pues lo que va a ir cogiendo es cuatro textos que tengo preparado aquí en un array de strings. 00:54:13
Vale, muchas cosas, pero más o menos me vais siguiendo, ¿verdad? Ahora vamos viendo la lógica de cada cosa. Vale, vamos otra vez con el texto, ¿eh? Y me voy a ir a este menú y lo mismo, en el config menu habrá que ir también arrastrando cuál de estos elementos de la jerarquía es al que hace referencia esta variable, que por eso lo hacemos serialize field. 00:54:27
Para luego poder decir dificultad texto, realmente lo que hago es cambiar el componente o coger valores también del componente texto. Este slider, si lo arrastro aquí, pues tendré que arrastrar el slider que me interese, que es este que tengo aquí, lo arrastro y ahí está. 00:54:55
Entonces ya puedo acceder a esto que tengo aquí, ¿vale? Después del punto pues saldrán estas propiedades en general, ¿vale? Entonces ya una vez establecidos las variables en sí, bueno, lo primero es en este array, por esto estas llavecitas de strings, ¿vale? 00:55:10
Y según se carga este nivel, no voy a querer que aparezcan otros, cuando aparezca este nivel va a haber un texto de dificultad, ¿vale? 00:55:31
Que vamos a crear un array de cuatro posiciones con los cuatro niveles por orden de dificultad, ¿vale? 00:55:42
Y aparte, cuando carga el juego, voy a aplicar esto que yo he llamado, que es un método que he creado yo, ¿vale? 00:55:50
Que se llama UpdateSlider. 00:55:58
Básicamente, así dicho, lo que hemos creado o lo que hay que crear es un método que sirva para ir guardando en esa variable estática la dificultad que vayamos cambiando, ¿vale? 00:56:00
En este caso la dificultad con el slider. 00:56:13
Y por otro lado, un método que lo que hace es guardar en la variable estática el texto que hayamos metido en el input field, ¿vale? 00:56:16
Son dos. Uno sirve para los cambios que hagamos con el slider y otro el que hagamos con el input field. Vamos con el del input field, vuelvo, porque al final este es el más sencillo. Fijaos que solo tiene una línea. ¿Qué es lo que estoy haciendo yo aquí? 00:56:25
preparar en público este método 00:56:41
llamado 00:56:44
updateInput 00:56:45
para que los cambios que vayamos haciendo 00:56:47
se guarden en el 00:56:50
gameManagerUserName, que era esta variable 00:56:52
estática. Y lo que va a coger es 00:56:54
el inputUserName.text 00:56:55
Esto 00:56:58
así dicho rápido. 00:56:59
Lo que estamos haciendo 00:57:01
es decirle que 00:57:03
voy al 00:57:05
inputUserName que 00:57:07
cada vez que se cambie, 00:57:09
Estoy en el input username. Son tantas cosas que por eso voy recopilando. Perdón que a veces puede ser un poco plomo, pero prefiero que vaya más a paso. 00:57:10
Si yo le digo que cada vez que se cambie un valor, coja del canvas, arrastro el canvas aquí y lo coge, que dentro de las opciones del canvas, que coja el método llamado configMenu y yo he hecho ahí un método que se llama dateInput, 00:57:21
Que lo que hace es, cada vez que cambie el contenido, directamente me lo guarda en la variable estática, ¿vale? Pues ya lo tengo preparado. Al final, lo que estoy haciendo aquí es que cuando yo escriba un texto, cada vez que cambie este valor, ¿no? Según lo que hemos puesto aquí, cada vez que cambie este valor, se va a ejecutar ese, se va a recargar, digamos, ese método, se va a llamar y vas a decir, vale, por lo que yo haya escrito, que se guarde en el GameManagerUserName. 00:57:44
Vuelvo a enseñar que eso es básicamente una variable de tipo string que tenemos aquí, que luego podremos llamar desde cualquier sitio. 00:58:13
Entonces, ¿qué faltaría en la ecuación? Que en todo momento sepamos o indiquemos claramente cuál es ese texto que tiene que guardar. 00:58:25
Y el que tiene que guardar es el texto que está dentro de input username. ¿Por qué? Es decir, tenemos por un lado el texto de la dificultad que se va cambiando y aquí tenemos el texto del input field. 00:58:37
que es, creo que antes os he dicho que un texto era otro, pero básicamente este texto va a estar referido al texto de la dificultad, que es este que tenemos aquí, que se une aquí, ¿vale? Ese es el texto a secas y luego por otro lado tenemos el input field, ¿vale? Que es este texto que tenemos aquí en el input field, que no es el mismo, perdón, que antes os he hablado y me he liado, pero el input field tiene un campo de texto suyo, ¿vale? 00:58:53
Entonces, hemos dicho que coja de este input field que hemos arrastrado, lo dejo de tener aquí, de este input field que hemos arrastrado aquí, ¿vale? Y que dentro tiene el valor que vayamos escribiendo en este texto, ¿vale? Y lo guarda en el GameManager. 00:59:18
Eso es lo que hace, es que en todo momento al cambiar el valor del input field, pues se va guardando en esa variable estática y luego como en el hat lo que hemos puesto, a ver si me sale, en el hat lo que hemos puesto es que si no se ha cambiado nunca, si nunca se ha introducido nada en el, bueno, todo esto se pone en el start. 00:59:33
al arrancar el nivel con el 00:59:57
hand manager, dice, ala 00:59:59
hemos creado tres variables que lo que hacen es 01:00:01
que pongo de username 01:00:03
que pongo de update 01:00:04
de vidas y también no de dificultad 01:00:06
que eso os lo cuento después si da tiempo 01:00:09
pero es para influir por ejemplo 01:00:11
en el rigid body de la bola 01:00:13
entonces 01:00:14
aquí nuevamente en el 01:00:16
hand manager, que de esto no hemos hablado 01:00:19
yo en el hand manager también he creado 01:00:20
un script que voy a ir 01:00:22
añadiendo todas las 01:00:25
los serialize field, todas las variables 01:00:26
que me vaya a interesar luego ir cambiando 01:00:29
de ese hand manager o incluso 01:00:31
remitiendo a un rigidbody de la bola 01:00:33
estoy accediendo al rigidbody de la bola 01:00:35
para luego cambiar sus propiedades 01:00:37
de mass y de drag para que 01:00:39
según la dificultad que pusimos 01:00:41
en el slider 01:00:43
según si es 01:00:45
el nivel 0, el 1, el 2 01:00:47
o el 3 de la barra 01:00:49
y se ha guardado 01:00:51
va a poner un peso 01:00:53
y un drag diferente, por tanto la bola 01:00:54
pues tendrá, será más fácil de mover 01:00:57
o caerá más rápido o bueno 01:00:59
los comportamientos en este caso de la física 01:01:00
vale 01:01:03
vale, entonces 01:01:04
básicamente estamos 01:01:08
usando nuevamente este game manager username 01:01:11
como gestor luego para cambiar 01:01:13
un texto, vale, que es este 01:01:15
que tenemos aquí, que es el texto 01:01:17
que en el nivel 01:01:19
juego 01:01:22
no guardo por si acaso, ¿vale? que tengo aquí preparado 01:01:24
aquí tengo un canvas con su propio 01:01:27
con un texto aquí preparado 01:01:29
que lo que va a escribir es lo que yo le diga por código 01:01:33
por eso en su canvas, ¿vale? yo he dicho 01:01:36
que lo que tiene que cambiar es ese 01:01:39
username, ¿vale? eso que hay ahí, lo arrastra 01:01:42
y ya pues sabe que ahí es el texto que tiene que cambiar en base 01:01:45
a esto que 01:01:48
esto que yo le estoy diciendo aquí 01:01:50
¿Vale? Esto es ir siendo muy esquemático y decir, aquí voy a coger algo, tenerlo muy claro, escribirlo, ¿dónde se guarda esto que estoy cogiendo en tal sitio? Y luego, ¿dónde se carga? E ir, preparar la variable que sea necesaria y cargarlo. 01:01:53
Sí, sí, es denso, es denso y además cuesta 01:02:13
Es ir desgranando poco a poco 01:02:17
Creo que alguna vez os hablé de lo que es el pseudocódigo 01:02:19
Bueno, no es pseudocódigo 01:02:22
No sé cómo se llama 01:02:23
Pero en programación, en la ingeniería de informática 01:02:24
Que os lo cuento, pero yo no es que lo haya hecho 01:02:28
Yo no soy programador, ni mucho menos 01:02:30
Pero por amigos que tengo y gente que conozco 01:02:32
Ellos, para entender lo que tienen que hacer 01:02:35
Antes de meterse en el código 01:02:38
En una hoja van escribiendo 01:02:39
En el nivel 1 voy a tener un slider 01:02:41
que al moverse 01:02:44
va a guardar en otro script 01:02:46
que se llama tal 01:02:49
esto 01:02:50
el valor 01:02:51
del slider, una vez ha guardado 01:02:55
en el HUD 01:02:57
se va a ver reflejado, ponerlo con lenguaje 01:02:58
natural, un poco esquemático pero 01:03:00
con lenguaje natural, para tener siempre 01:03:02
en cuenta de dónde a dónde vamos 01:03:04
porque si no esto se va enmarañando 01:03:06
y es complicado, pero básicamente es eso 01:03:08
es ir sabiendo de dónde cogemos 01:03:10
contenido 01:03:12
donde guardamos esa variable y luego 01:03:14
de donde se recoge, dicho así es fácil 01:03:17
pero si lo ponemos 01:03:19
por escrito, pues es más fácil no perderse 01:03:21
y a lo malo es eso, que hay muchos 01:03:23
capitulitos y muchos apartaditos 01:03:25
que tampoco hay que hacer de una 01:03:27
primero hacemos este update username 01:03:29
y cuando ya funciona 01:03:31
vamos a lo del slider 01:03:33
poco a poco, pero sí que intentando 01:03:34
resumirlo 01:03:37
o ponerlo todo dentro de scripts 01:03:39
que congreguen, pues eso 01:03:41
En este caso, el gestor del HUD tiene tres funciones, básicamente, que es la del nombre, la de las vidas que tiene y la imagen que carga para demostrar esas vidas y el peso que tiene la bola. Pero lo pone todo dentro de un único script, porque si también se digrega mucho, también se vuelve una cantidad de script que hay que ir conectando e ir moviendo que se vuelve un poco tedioso el tema. 01:03:42
Vamos con el slider, si os parece. La vida, aquí es una imagen que se va cargando, por defecto es la de 3, pero básicamente esto se debe a que cuando empieza el nivel, hacemos esto de cargar vidas. 01:04:05
y esto de cargar vidas es 01:04:25
si el game manager 01:04:27
las vidas en algún 01:04:29
momento han llegado a cero, es decir, ya hemos jugado 01:04:32
y fueron 01:04:34
y llegaron a ser 01:04:35
cero 01:04:38
directamente ya guarda B3 01:04:40
para tenerlo ya preparado de que 01:04:42
cuando reinicie el juego sean 3 01:04:44
pero básicamente en todo momento 01:04:45
lo que tiene que ir cogiendo son 01:04:47
la cantidad de vidas que tengamos 01:04:49
guardada en el game manager 01:04:52
y de hecho, si no me equivoco 01:04:53
a ver, un segundo 01:04:55
nada, no 01:04:57
os iba a enseñar una cosa que no es 01:04:59
que no es real, pero eso 01:05:01
que lo que es 01:05:03
el, joder, es que se me está cambiando 01:05:05
todo el rato el este 01:05:07
si al empezar el juego 01:05:09
no hemos hecho nada, pues pónmelo en 3 01:05:11
si no, cada vez que yo vaya metiéndome en ese nivel 01:05:13
no toco esto, ¿vale? 01:05:16
salta este bucle 01:05:17
y solo se recarga 3 cuando son 3, si no 01:05:18
lo que se irá haciendo es que se irán restando 01:05:21
vidas, ¿vale? recordad 01:05:23
que en el juego, en lo que es el juego vuestro de la bola, cuando se cae por el precipicio, tendremos que poner que GameManagerLive sea una vida menos, ¿vale? En ese caso sí que hay que tocar algunos de los códigos que teníamos antes. 01:05:25
Es decir, si nos metemos en donde precipicio, nos meteremos, a ver si quiere enseñármelo, precipicio, aquí está, ¿vale? Y aquí metemos mano a GameManagerLives y restamos uno cuando se cae, ¿vale? 01:05:42
Pues empezamos con tres realmente, dos, uno y cuando es cero, aparte de que esto ya obliga a cargar cuando nos hemos caído la escena cero, que es la que hemos puesto aquí, pues también eso nos va sirviendo, como lo estamos guardando en este Game Manager de orden superior, nos va sirviendo en todo momento para ir cargando la imagen que nos corresponda, ¿vale? 01:05:57
Esta imagen es un array que hemos creado aquí con distintos sprites, ¿vale? Por un lado está el componente imagen, que es el que carga la imagen, ¿vale? Si nos metemos aquí hay un componente imagen que es el que carga la imagen y luego otra cosa diferente es la variable de tipo sprites, que son las imágenes en sí, ¿vale? 01:06:22
Si os fijáis, aquí tengo por un lado la imagen, el componente imagen, que luego será el que cargue, ¿vale? Esto, que cargue sprites y luego son los sprites en sí, que en este caso guardamos en un array, ¿vale? De tipo, aquí está, un array de tipo sprites, son los distintos sprites que, bueno, al ir arrastrando las distintas imágenes son este array de imágenes, ¿vale? 01:06:46
Y básicamente lo que vamos a ir haciendo, además, si os fijáis, es usar el índice en relación al array, es decir, el elemento 3 va a ser el de las tres vidas, el de 0 es cuando se han consumido, el de 1 es el de una vida, el de 2, el de 3, para que coincida y así directamente coincide también con el orden de arrays. 01:07:16
Es decir, si nos quedan dos vidas, directamente carga el segundo elemento, bueno, el tercero, el 0, 1, el 2, elemento del array que coincide con el de las vidas. 01:07:42
Esto si no habría que dar más vueltas, pero si se hace coincidir, pues directamente cuadra. 01:07:51
Vale, vamos con el slider. 01:07:56
El slider es lo mismo que hemos visto hasta ahora, pero tiene un nivel de complejidad quizá mayor. 01:08:01
A ver, perdón, que me trabo aquí buscando las cosas. 01:08:08
tiene otra dificultad, que es que lo que va recogiendo son valores numéricos, y valores numéricos de tipo float, y hay que hacer una conversión, y vamos a verlo, ¿vale? 01:08:12
En este slider, pues aquí ya como había puesto, hay otro texto para que lo he metido dentro de lo hecho hijo, de lo que es todo el slider. Vamos, aquí está el slider en sí y he hecho otro padre, otro entity para que todo se mueva de golpe, pues un titular que es dificultad y este texto que es el que se va cambiando con el array que os he puesto antes, que irá cargando el texto de este array de dificultad que tenemos aquí, ¿vale? 01:08:25
Pero vamos al slider, que es esto de aquí. El slider, además, tiene bastantes elementos. También lo indica el tema, pero sobre todo se puede cambiar la imagen, que es el handle, que es el manejador de lo que movemos. 01:08:52
Bueno, pues es una imagen. Aquí podemos arrastrar otro elemento. Indica además que es de los pocos elementos de User Interface que es mejor escalar que arrastrar porque se puede pixelar. Cuando hagáis las pruebas, si cuando vayáis cambiando el tamaño del slider se os empieza a pixelar, es de los pocos que sí que hay que escalar. 01:09:08
Porque si no empieza a pixelarse, es decir, si yo lo que hago es cambiar el fill area, me voy aquí, arrastrando aquí, bueno, no es fill, sería esto, el conjunto, sí que sobre todo cuando se haga de otras proporciones veis que empiezan a distorsionarse elementos. 01:09:29
Entonces, para el largo a lo mejor no os da problemas, pero el handle sí que os va a dar problemas. 01:09:49
Entonces, es de los pocos que hay que preparar, si vais a meter la imagen de la bola, 01:09:54
pues que tenga una resolución adecuada por si se hace un poco más grande. 01:09:59
Pero vais a ver que es de los pocos que sí que se aconseja hacerlo más grande con la escala, 01:10:03
porque si no, os da problemas. 01:10:07
Vale, lo dicho, tenemos este fill area, tenemos distintos elementos para cambiar un color, 01:10:10
para decir que cuando va pasando la bola 01:10:17
acame de color, pero toda la chicha 01:10:19
básicamente está en el padre 01:10:21
que es el que da aquí 01:10:22
en el componente slider 01:10:24
el que va recogiendo en este value 01:10:26
el valor 01:10:29
dentro de lo que se haya cargado o no 01:10:30
la barra, el valor 01:10:33
de carga, se va a interpretar 01:10:35
como números, aunque aquí ponga 01:10:37
lo de fácil chupado, eso se va a ir 01:10:39
relacionando en base al número que tengamos aquí 01:10:41
va a cargar el slider 01:10:43
el texto del array de dimensión 01:10:44
una de posición 2 o de posición 3 pero básicamente esto es lo que nos va a dar la gestión del slider 01:10:47
importante bueno aparte de que el slider se puede poner de arriba abajo de izquierda a derecha por 01:10:55
si queremos que suba o baje vale de una forma rápida bueno aquí se le ha ido la pinza un 01:11:00
segundito vale y por tanto si queremos cambiar la dirección no habría que rotarlo vale que sería a 01:11:06
a lo mejor el comportamiento así primero que no vendría, 01:11:13
sino que habría que cambiar la orientación aquí, ¿vale? 01:11:18
Y de momento me interesa que vaya de izquierda el 0, 01:11:21
a derecha el máximo, sería esta la configuración. 01:11:24
Muy, muy importante, habrá que configurar el slider 01:11:28
con su mínimo y su máximo, ¿vale? 01:11:31
En este caso, se pone de 0 al 3 porque queremos 4 niveles de dificultad. 01:11:34
Tened en cuenta que el 0 ya es un valor, ¿vale? 01:11:39
El 0 será chupado, el 1 será fácil, el 2 será intermedio o yo que sé, algo así era, y el 4 será muy difícil, ¿vale? Entonces, esto va a llegar hasta donde nosotros pongamos aquí, del mínimo al máximo, ¿vale? Entonces, yo ahora, si os fijáis que he puesto que vaya del 0 como punto de partida, aunque también se podría cambiar, ¿eh? También podría ser que empiece en el 1, pues el 1 sería el valor de inicio y a medida que voy arrastrando, veis que ahora hay muchos más pasos, ¿vale? 01:11:41
Y hay otro valor también importante, que es que aparte del límite, se puede dejar, como viene por defecto, si no me equivoco, para que sea un float, y vais a ver que el valor ahora que va cogiendo es de un float, porque tiene valores decimales, o que sean números enteros, ¿vale? 01:12:11
Aquí he cambiado algo del tamaño, ¿veis? Ya la he liado un poco. Pero veis que cuando ponemos esto de whole numbers, hacemos que los saltos sean entre unidades enteras. ¿Vale? ¿Qué problema vamos a tener con esto? Que aunque aquí pongamos esto de whole numbers, al nivel de código, esto está preparado para que funcione con floats, con decimales. Y lo que va a tener que recibir es un float. ¿Vale? Esto es una dificultad que hay ahí. 01:12:32
A ver, un segundo, a ver si encuentro el por qué pasó esto, el fill, a ver, un segundín, aquí el handle, algo que cambia aquí, que se ha descoyuntado, sería el fill area, bueno, aquí puede ser, a ver, un segundo, algo que cambia ahí, que se le ha ido un poco, bueno, un segundo, 01:12:57
No, aquí no es. Bueno, esto, bueno, si no tocáis nada raro, pues no pasa esto de que se desconfigura el... Tendría que hacer la prueba de escalar, a ver, un segundo, no sé por qué esto ha cambiado, pero bueno, habría que ajustarlo ahí y ahora sí que lo hace. Bueno, algo, cuando he escalado, fijaos, ¿qué ha pasado eso? Bueno, ya estamos otra vez. 01:13:29
Bueno, vuelve a estar mal porque tendría que ajustar esto al valor que tenía 01:13:56
Porque lo he cambiado en reproducción, pero es eso lo importante 01:14:03
Lo dicho, para lo que nos interesa, que son niveles de dificultad 01:14:07
No queremos decimales, preferimos que sean valores enteros 01:14:11
Y aquí, cada vez que se toque, cada vez que se cambie el valor 01:14:14
Hay un evento ya preparado en los sliders 01:14:19
Que como sucedía en el de escritura en los input fields 01:14:22
Podemos poner que llame a uno o varios 01:14:25
Se pueden ir incluyendo más acciones 01:14:30
Y antes os he dicho que cuando cargamos otro elemento 01:14:31
El canvas, voy a hacer una cosa 01:14:35
Vienen aquí más cosas, se podría decir 01:14:37
No un script con métodos públicos que hemos creado nosotros 01:14:39
Sino decir directamente que el GameObject cuando lo toquemos 01:14:44
Se active o se desactive 01:14:47
Es decir, que cuando toque esto se desactive 01:14:49
Entonces vais a ver ahora que, como está desmarcado que se desactive, cuando toque aquí el canvas se ha desactivado, porque cuando he tocado y se ha cambiado un valor, le he dicho que el setActive se vuelva falso, ¿no? 01:14:52
Y en cuanto he tocado, efectivamente, este canvas ha pasado a ser falso. Entonces, hay muchas interacciones que se pueden hacer más allá de decir que lance otro script que tengamos ahí preparado, ¿vale? 01:15:06
Pero bueno, y que sean varios incluso. A ver, espera, que aquí justo he dejado el que no me interesa, que es este, lo resto, ahí está. Aquí yo tengo en el canvas nuevamente y en el método público, en el script config menu, tengo un script llamado updateSlider. 01:15:24
Vamos a ver qué es lo que hemos puesto. Aquí está. Y ahora hacemos que cuando toquemos algo del slider va a estar llamando a este método. ¿Y qué es lo que hacemos aquí? 01:15:43
Creamos dentro del método, está encapsulado dentro del método, una variable de tipo float que se llama dificultad. Y básicamente lo que estamos guardando en dificultad es el número que tengamos aquí en value. 01:15:56
Aquí va a ir guardando, en nombre de dificultad, el valor. Pero es un float, como os he dicho. Esto está preparado para funcionar con decimales. Solo que aquí podemos marcar una opción para que dé saltos en cada unidad. 01:16:09
¿Qué implica eso? Que para que luego no dé problemas, hay que hacer lo que se llama una conversión explícita. Es decir, indicar que un tipo de variable cambie a otro tipo de variable si son compatibles. 01:16:23
Y hay una cosa que es que un float es muy fácil convertirlo en un int, porque básicamente es decir, oye, quítame los decimales y te quedas con la unidad. Para hacer esa conversión, creamos una variable de tipo int, que se llama dificultad int, y lo que hacemos es simplemente poniendo entre paréntesis delante de la variable de tipo float, esto sirve para pasar de float a int. 01:16:37
Para otras cosas no va a funcionar. Si ponemos delante de una variable de tipo float esta indicación de entre paréntesis int va a hacer una conversión. Entonces lo que coge aquí como float lo convierte a int. 01:17:03
Hay otras formas de conseguir esto, ¿vale? Hay métodos que son como de redondeo, esto de absolute o el round, ¿vale? R aquí, el round, ¿vale? O round to int, que también nos serviría para coger este valor que es un float y convertirlo en un int, pero bueno, digo que incluso algunos métodos ya podríais haber llegado a ellos, pero que sepáis que también de float a int se pueden hacer estas conversiones, haciendo esto del paréntesis. 01:17:16
Lo importante es que aquí estamos cogiendo el valor, en todo momento, cada vez que movemos, cada vez que movemos se lanza esto, recoge este valor, lo guarda en dificultad, 01:17:46
lo convertimos ahí, ¿vale? Pues cuando vayamos moviendo, y luego, este dificultad text, ¿vale? Aquí lo que estamos haciendo en todo momento es que estamos aludiendo a este dificultad text 01:17:53
que habíamos guardado, es decir, que habíamos establecido con las cuatro variables del array 01:18:07
para ir cambiando este texto y se irá lanzando un elemento del array u otro 01:18:13
según la posición del array que lancemos que coincidirá con la del tipo int. 01:18:19
Y por eso lo hacemos de tipo int, porque para que el array que tiene posiciones fijas se vaya lanzando 01:18:27
lo convertimos en tipo int. 01:18:31
Pero bueno, esto no es lo más importante. Lo importante es que en todo momento tenemos aquí dificultad como un float y dificultad int, el valor del slider, también como un entero. ¿Y qué vamos a ir haciendo en todo momento? Guardar en la variable estática llamada dificultad el nivel de dificultad. Y aquí sí que puede ser float o int, lo que nos interese. 01:18:33
entonces digamos que cada vez que tocamos el slider 01:18:55
hasta aquí estamos guardando por un lado 01:19:00
en la variable estática el nivel de dificultad 01:19:02
por un lado y en otro estamos preparando 01:19:05
para que aquí nos muestre el texto de este array 01:19:08
que habíamos generado aquí 01:19:11
que tiene cuatro posiciones 01:19:12
cargará este array 01:19:16
según la posición que tenga 01:19:18
irá cargando uno de estos strings 01:19:22
en este campo de texto que tenemos ahí. 01:19:24
Luego, por otro lado, esto también se explica en el tema, 01:19:27
se pueden usar, esto es un poco opcional, 01:19:32
se podría de otra forma, los player prefs. 01:19:34
Que los player prefs es, digamos, de hacer un guardado 01:19:36
que va incluso más allá de las variables estáticas. 01:19:39
Las variables estáticas funcionan 01:19:43
mientras está la ejecución de ese juego. 01:19:45
Es decir, en una partida, hasta que no se apague la reproducción, 01:19:48
hasta que no se pare el juego, básicamente, pues entre niveles y entre elementos se pueden ir almacenando esas informaciones. 01:19:52
Con los player prefs, básicamente lo que hacemos es guardar en el ordenador, en el sistema operativo, en algún punto de nuestra memoria del ordenador, 01:19:59
variables o valores que pueden ser rescatados incluso entre partidas. Es la diferencia. 01:20:07
Luego en el tema también os pongo que los player prefs se guardan en el sistema operativo, 01:20:14
pero se pueden guardar en archivos tipo Json, estos más avanzados, pero que digamos que se pueden subir a una nube o se pueden subir y entonces se guardan en la nube con un nombre 01:20:19
y se recogen en la nube con un nombre de una forma más o menos un poco más compleja, más larga, pero similar a esta. 01:20:28
¿Qué es? Que nosotros podemos ir dando, igual que si tuviéramos un Excel, vamos a decir, podemos ir creando tablas en las que poner en una casilla un nombre 01:20:35
y en la siguiente el valor 01:20:45
o lo que estemos guardando, el valor de lo que guardemos 01:20:46
aquí por ejemplo, estamos diciendo 01:20:49
en los player prefs, los player prefs 01:20:51
siempre aparecen, no hay que hacer nada 01:20:53
extraño, están ahí, ¿vale? 01:20:55
y tienen sus propios métodos aquí 01:20:56
que se habla de ellos, de hecho se habla de todos los que tienen 01:20:58
se describen en el tema 01:21:01
¿vale? pero aquí en este momento 01:21:02
cada vez que movamos el slider 01:21:05
se está, recordemos 01:21:06
en el... 01:21:08
aquí 01:21:11
Aquí. Joder. No. Aquí. Y este no. Joder, qué tostón. Vale. Aquí. En el slider, recordad que cada vez que toquemos, activa el método updateSlider. 01:21:11
Entonces, cada vez que toquemos, podemos estar guardando en ese sistema operativo, en ese archivillo, con el nombre clave, digamos, de dificultad, 01:21:27
Porque es lo que estamos guardando 01:21:37
El nombre que le estamos dando a este dato 01:21:38
Pues lo que estamos guardando es 01:21:40
El valor del slider 01:21:42
Realmente aquí también podríamos poner dificultad 01:21:44
Directamente porque es lo mismo 01:21:47
Pero bueno, así queda más claro 01:21:48
Según lo recoge ya, mete este valor 01:21:50
Y lo va a meter como un float 01:21:53
Bueno, pues como un float 01:21:54
Y eso significa que aparte de estar guardándolo 01:21:56
En el GameManager 01:21:59
Yo también podré recurrir 01:22:00
A los PlayerPrefs para recuperar datos 01:22:02
Por ejemplo aquí 01:22:05
hay una cosa que es 01:22:06
que en el, esto ya es más opcional 01:22:09
pero que en lo de los 01:22:11
player prefs, os lo digo un poco para que sepáis como funciona 01:22:12
pero una de las 01:22:15
opciones es que cuando se arranca 01:22:16
este script, que realmente se 01:22:19
arranca cuando entramos 01:22:22
en el menú de configuración, cuando damos 01:22:25
al botón de config desde el menú 01:22:27
inicial, nos metemos aquí y al arrancar 01:22:28
dice, oye si en algún momento 01:22:31
se ha creado, esto es una booleana 01:22:33
Al final es una condición que es una boleana. Es uno de los métodos que tienen los player prefs, que es, si existe este código llamado dificultad, ejecutalo de dentro. Si alguna vez ya se había creado, la primera vez que juguemos no va a suceder. 01:22:35
La segunda, en cuanto hayamos tocado el slider, ya se ha generado este código, este campo en las player prefs y habrá guardado un valor. Entonces dice, si alguna vez has jugado y existe esta dificultad, pues por defecto lo que es el valor, 01:22:49
pues voy a decir 01:23:09
a aludir aquí 01:23:10
el valor de 01:23:12
de este slider 01:23:14
que sea el que habíamos 01:23:17
coge ese float y pone ese valor 01:23:18
¿vale? en base a ese nombre 01:23:20
por eso, aunque 01:23:22
fijaos, es verdad que las 01:23:24
playerprefs se generan 01:23:26
se generan cuando 01:23:28
cuando 01:23:30
digamos 01:23:32
sobre todo cuando se está jugando 01:23:35
pero fijaos que yo ahora 01:23:37
aunque pare la reproducción, cuando le doy 01:23:38
al play, se está cargando 01:23:41
el último estado que había dejado 01:23:43
¿vale? ya no es entre niveles, es entre 01:23:45
partidas, entonces yo ahora por ejemplo 01:23:47
lo pongo en normal 01:23:48
¿vale? y paro 01:23:50
¿vale? ya las variables estáticas han olvidado 01:23:52
todo, se han descargado, el juego ha parado 01:23:55
podemos habernos ido a apagar 01:23:57
el ordenador, si esto fuera 01:23:59
el compilado ¿vale? pero bueno, ahora estamos 01:24:00
digamos recreando lo que pasaría en el compilado 01:24:02
si yo vuelvo a arrancar el juego 01:24:05
como estoy en el mismo sistema operativo 01:24:07
y ese archivo de las player prefs 01:24:09
se ha almacenado ahí, lo buscará 01:24:11
y dirá, sí, sí existe esa 01:24:13
dificultad. Y por eso arranca 01:24:15
ya con el valor de 01:24:17
2 en este caso, ¿vale? 01:24:18
Que es en el que lo habíamos dejado. 01:24:21
Entonces, bueno, en los player prefs 01:24:23
el problema que tienen, esto se usaba 01:24:24
por eso se llama player preferences 01:24:27
se usaba, por ejemplo, 01:24:29
en las 01:24:31
máquinas recreativas 01:24:32
para guardar los listados 01:24:35
De los mejores, en plan 01:24:36
El número uno hizo 50.000 puntos 01:24:38
El dos, 30.000 01:24:40
El problema de los ordenadores es que si buscas ese archivo 01:24:41
Y lo cambias a mano, pues es muy fácil 01:24:43
Manipularlo, para que de pronto te cargue 01:24:46
Lo que tú quieras 01:24:48
Pero bueno, ya os digo que esto es una especie de primer 01:24:49
Paso, o versión simplificada 01:24:52
De lo que se puede hacer 01:24:54
Con archivos que se guardan a la nube 01:24:55
Y se almacenan en sistemas, que es lo que sucede 01:24:58
Cuando se juega juegos en la nube 01:25:00
Que se van guardando datos en la nube 01:25:02
O en una memory card, o etc 01:25:04
Pues hay otros sistemas con otros tipos de archivos, pero en esencia es lo mismo, que se pueden ir generando lo que se llaman keys, lo que se llaman códigos, nombres, a los que se pueden asociar valores y que se compruebe si existe ese código y si existe ese código que coja ese valor, ¿vale? 01:25:06
Pero bueno, en esencia ese es un poco lo que está configurado. Luego, cuando ya tenemos la dificultad, en el HUD Manager, al que digamos en cada nivel estamos accediendo al RigidBody de ese nivel, porque lo arrastramos al SerializeField, la bola, o porque aquí hiciéramos, aquí no lo he hecho así, lo he hecho por SerializeField, pero un GetComponent y ese componente del RigidBody de ese nivel, 01:25:24
pues luego podemos ir y decir 01:25:52
oye, guárdame en una 01:25:54
variable 01:25:56
local 01:25:57
lo que valga dificultad 01:25:59
que es básicamente lo que se ha guardado 01:26:01
como valor del slider cada vez que lo hemos ido 01:26:03
cambiando, ¿vale? entonces 01:26:06
si lo hemos dejado en 2, yo aquí luego 01:26:07
lo que puedo hacer es decir, ah, vale, como si la dificultad 01:26:10
es la de normal 01:26:12
que es la de 2, esto también se podría 01:26:14
hacer con un switch, ¿vale? 01:26:16
en vez de hacer tantas condiciones, pero bueno 01:26:18
en esencia lo mismo 01:26:20
pues si la dificultad que habíamos guardado 01:26:21
que se guardó en esa variable 01:26:23
estática es 2 01:26:25
pues la masa de la bola 01:26:27
accedo a 01:26:29
al RigidBody 01:26:31
que lo había llamado como bola 01:26:33
y ya aquí puedo cambiar pues que sea más o menos 01:26:35
pesada, que tenga otra inercia 01:26:37
que tenga gravedad, que no 01:26:39
y aquí pues básicamente voy cambiando las condiciones 01:26:41
y vais a ver que la bola es más 01:26:44
pesada, sobre todo para el nivel que va 01:26:45
rotando la tabla, es más pesada 01:26:47
y tiene menos drag para que caiga más rápido 01:26:49
de la tabla y sea más difícil 01:26:51
pues a medida que tiene más dificultad 01:26:53
en el 3 es donde más hay menos drag tiene 01:26:54
¿vale? 01:26:57
y con esto más o menos 01:26:59
os he ido contando un poco todo 01:27:01
un poco rápido 01:27:02
luego en el menú inicial 01:27:03
el botón de salir 01:27:07
simplemente para que lo sepáis 01:27:08
en el menú inicial 01:27:11
no lo guardo 01:27:13
en el de salir 01:27:15
lo pone también en el tema 01:27:16
que cuando queremos cerrar 01:27:18
cuando hagamos el compilado del juego 01:27:22
si queremos que al dar a ese botón 01:27:24
o cuando sea, se cierre el juego 01:27:26
está este método 01:27:28
el Application Quit, pero esto no se ve reflejado 01:27:30
al reproducir 01:27:33
en el editor 01:27:35
no se puede cerrar de esta forma 01:27:36
porque si no, supongo que interpretaría 01:27:38
que lo que tiene que cerrar es 01:27:40
la aplicación de Unity 01:27:41
entonces la dejamos aquí y sabemos que funciona 01:27:43
Ahí, bueno, se puede poner aquí también un debug log que indique larga, botón de salir y saldría, ¿vale? Pero realmente es esta línea la que sirve para cerrar el juego, ¿vale? Ahí como otras formas de poner que cuando cliques como que simule que para el juego y tal, pero bueno, es más enrevesado, simplemente es que sepáis que aunque pongáis esta instrucción hasta que no compiléis, realmente esto no se va a ejecutar, por mucho que esté dando a este botón y esté bien establecido todo, pero vaya. 01:27:46
dudas 01:28:13
leo una que hay, el valor máximo 01:28:18
que tienes es 3, sería que la barra 01:28:21
se secciona en 3 partes 01:28:23
así que el botón de la barra 01:28:25
tiene 4 posiciones, inicio, claro 01:28:27
realmente tiene 4 01:28:28
porque tú empiezas por el 0 01:28:31
es decir, vamos aquí 01:28:33
input 01:28:35
no, input no 01:28:37
dificultad, vale, yo he cambiado 01:28:39
el slider, le he cambiado el nombre a dificultad 01:28:41
pero bueno, aquí slider 01:28:43
dificultad, que se puede cambiarlo en nombre, sin problema 01:28:45
cuando tú estableces el mínimo 01:28:47
el valor 0 y el máximo el valor 3 01:28:49
0 es un valor 01:28:51
1 es otro valor, 2 es otro valor 01:28:52
y 3 es otro valor, por tanto 01:28:55
hay 4 posiciones 01:28:57
puede ser de 0, 1, 2, 3 01:28:58
4 posiciones 01:29:01
¿vale? lo mismo, aquí en realidad 01:29:02
en otros momentos, en una pantalla de carga 01:29:05
¿vale? que un slider 01:29:08
puede servir para mostrar una pantalla de carga 01:29:09
mientras voy haciendo así, fijaos 01:29:11
como la bola, si en el async 01:29:13
Hay un apartado sobre los async. Va mostrándose esta carga, sirve con decimales en este caso, si no queremos que haya valores, para cargar esa barra. Si yo quitara esto del handle, black, y dejo solo el fil área, básicamente esto es una barra de carga. También puede usarse para eso. 01:29:15
vale, lo vuelvo a activar 01:29:36
pues sí, planteame 01:29:39
la duda, si nadie más dice nada 01:29:42
será que no la sé 01:29:43
vale, a ver 01:29:45
una duda así chiquitita 01:29:47
por ejemplo 01:29:49
lo que es todo el HUD 01:29:51
del sprite y de los textos 01:29:52
si no quisiéramos ponerlo en lo que es en la cámara 01:29:55
la cosa es para ponerlo 01:29:57
encima de la bola y que le siga 01:30:01
como si fuera el típico juego RPG 01:30:02
tendrías que trasladar lo que es el HUD 01:30:05
ponerlo como hijo 01:30:07
de la bola? 01:30:09
Sí, habría que hacer dos cosas 01:30:10
voy a ver... 01:30:12
Y claro, ahora que te lo estoy diciendo, claro, si lo pones 01:30:14
como hijo de la bola, cuando gira la bola 01:30:17
¿se mantendría arriba estático 01:30:19
o giraría al eje 01:30:21
de la bola? No sé si me explico 01:30:23
Sí, voy 01:30:24
Tú ten en cuenta, y para eso está 01:30:26
esto de canvas, que tú aquí si dices que esté 01:30:28
como un overlay, va a estar como un overlay 01:30:30
¿vale? Eso es a nivel de visionado de cámara 01:30:32
Está casi pensado para eso, para hacer interfaces a nivel de menús, pues eso, que se sobrepongan, que estén, digamos, siempre en un mismo espacio. Pero aquí hay otro render mode que es el de workspace, ¿vale? Y entonces tú, si aquí le dices que con respecto a la cámara, que la tengo aquí, le dices respecto a esta cámara, que este canvas, y veis que cuando se pasa a workspace, de pronto este canvas empieza a tener eje Z, empieza a tener otros... 01:30:34
otros a ver ahí tiene otros valores de pronto le sale la pinceta etcétera tú 01:31:04
puedes coger ahora y ese canvas y hacerlo hijo de él 01:31:15
bueno claro es que esto es un prefab habría que desempaquetar probablemente 01:31:19
Un segundín, ¿eh? Porque es lo que te digo, children of a prefab instance, ah, vale, no, es que yo, vale, el hat lo he metido como un prefab, entonces habría que liberar el prefab y meterlo como hijo de la bola. 01:31:30
Vale, entonces ahora, si yo moviera esto para que estuviera en posición con la tabla, a ver un segundín, ¿dónde está la bola? 01:31:45
Ahí está la bola, claro, es que es muy pequeño. Aquí hay que ajustar el canvas para que esté con, vamos a hacerlo más pequeñete, 01:32:01
A ver, un segundo. Esto hay que hacerlo más pequeñito y hay que colocarlo en posición. Básicamente ahora lo que pasa es que tiene unas dimensiones descomunalmente grandes. Ahora, si te fijas, tenemos ese canvas que se podría ajustar en el espacio. 01:32:15
Y si yo sigo haciendo lo más pequeño, 500, 500, ¿ves que ya van apareciendo como en el espacio? Vale, a ver, un segundo. Ahora vemos las pegadas de esto, ¿vale? ¿Ves que se está moviendo con la bola? Lo que pasa es que he movido la bola o algo así, debe ser. ¿Dónde está la bola ahora? Bueno, vale, que aquí he cambiado algo. 01:32:50
Básicamente 01:33:22
Ahora, un segundo 01:33:24
Vale 01:33:26
Vamos aquí 01:33:28
Y esto lo tengo que seguir haciendo más pequeñito 01:33:29
A ver, ¿dónde está el campeón? 01:33:36
Joder, ¿y dónde 01:33:49
Tengo yo esto? Ah, bueno 01:33:50
No sé por qué se pone ahí 01:33:55
Vale, ahí 01:33:56
Ahí lo pongo un poco más arriba 01:33:59
Habría que reajustar todo lo que hay dentro 01:34:01
De ese canvas, lo voy a hacer todavía 01:34:03
Más pequeño 01:34:05
Esto es porque también justo esta bola es muy pequeña, pero si lo colocamos ahí, habría que reconfigurar todo, pero fíjate. 01:34:06
Fíjate, bueno, claro, aquí está sucediendo la cosa de que al estar vinculado con una bola que está rotando, está rotando alrededor, ¿vale? 01:34:26
Porque está cogiendo la fuerza. Habría que, por código, decir que siguiera el transform de la bola, ¿vale? 01:34:36
Pero esto es usando el canvas, porque si te das cuenta, a ver, y un segundo, que esto me va a costar un segundo recordarlo, 01:34:44
Vale, lo lógico, esto es simplemente para que veas que los canvas, si tú los pones en el workspace y en relación a una cámara, tú básicamente este canvas es como cualquier otro elemento, y aquí de hecho lo que habría que hacer es que siguiera la bola, pero que no la siguiera como hijo, porque entonces va a rotar, porque la bola en todo momento, fíjate que yo cuando me voy moviendo, la bola va rotando, 01:34:53
Porque le estamos dando con él, entonces rota con ello. 01:35:22
Por eso hace estas cosas raras. 01:35:24
Habría que asociarlo por código que vaya cogiendo el transform position 01:35:26
y se mueva con position para que no vaya adquiriendo estas rotaciones. 01:35:32
¿No valdría un MP object como padre y ambos dentro? 01:35:38
Sí, lo único malo es que como en este caso la bola siempre la estás rotando, 01:35:44
si lo que quieres es que se mueva con una fuerza de la bola, 01:35:49
el padre no se está moviendo. 01:35:52
¿Sabes lo que te quiero decir? 01:35:54
Pero bueno, hay que buscar la manera de que 01:35:56
aunque la bola la movamos así, 01:35:58
que lo que vaya leyendo en todo 01:36:01
momento sea la posición de la bola 01:36:02
y no todo, ¿sabes? Que es lo que hace cuando 01:36:04
lo haces hijo. 01:36:06
Y eso por lo digo ya lo sabéis hacer. 01:36:08
Entonces, pues que... Pero te vuelvo 01:36:10
a decir, bueno, a lo que iba. 01:36:12
En 3D Objects, en vez de meter desde UI 01:36:14
los elementos de la UI, 01:36:16
que lo que hace es crear el canvas, 01:36:18
también se pueden crear como objetos 3D. 01:36:20
Entonces tú puedes ir aquí y decir que se cree un texto, 01:36:23
que si le damos aquí, por ejemplo, 01:36:27
este texto ves que no se mete por defecto dentro del canvas 01:36:29
y, sin embargo, ya está en Z. 01:36:32
Entonces, si lo que quieres cargar es un texto, por ejemplo, 01:36:36
simplemente se puede meter como un objeto. 01:36:41
O, lo digo esto porque los textos sí que es verdad 01:36:44
que son editables, etcétera, 01:36:46
Pero tú normalmente cuando quieras cargar una imagen, también lo que puedes hacer es crear un plano y como textura ponerle una imagen y ponerlo ahí, que no sería un elemento de User Interface. 01:36:50
Lo que va variando es el contenido de un texto, los números, la vida, etc. 01:37:02
Y bueno, ya te digo que puedes hacerlo con una user interface, pero si solo quieres poner el nombre del personaje, lo puedes poner con un elemento 3D, que no es el de UI, sino que es un objeto 3D de este tipo. Creo que de hecho de esto también hablo un poquillo en el tema. 01:37:08
Y luego también un plano le puedes poner una foto o un corazón, ¿vale? Es decir, si tú aquí en el material que tengas, habría que crear un nuevo material, crear un material, material, material, ¿vale? Y dices imagen, yo qué sé, el corazón. 01:37:22
Vamos a poner las vidas del corazón de esta forma, desactivo esas y lo que voy a decir es que ese material, el albedo, sea una imagen de un corazón. 01:37:39
De esto también hablaremos ya en otro momento, pero fíjate que tú ya a este plano le puedes poner un material que sea ese corazón. 01:37:53
Entonces, no, en X, evidentemente, y será menos 90, entiendo, o no, más bien 90. 01:38:03
Lo que pasa es que ahora está por el lado que no tiene que ser, pero que con esto también se podrían hacer, 01:38:12
Habría que meter un alfa para que lo capte bien, etcétera, pero que puedes meter elementos luego que en realidad son elementos 3D y nuevamente lo puedes asociar a la bola. 01:38:17
Pero bueno, con lo que hemos visto de la UI, básicamente es como te he dicho, poner que su render mode sea workspace, que básicamente es que se convierte en un objeto con su transform normal. 01:38:28
Aunque metas aquí luego los anchors y tal, en realidad aquí están sus parámetros, ¿vale? 01:38:40
vale 01:38:47
vale, vale 01:38:49
por ahí sería por donde yo tocaría 01:38:51
Materias:
Imagen y Sonido
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
      • Segundo Curso
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
1
Fecha:
18 de febrero de 2026 - 19:39
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
1h′ 39′ 01″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
720.55 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid