Saltar navegación

Tutoría 7 - DEIM - UT3 y 4 - Curso 24·25 - 28 Enero - 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 28 de enero de 2025 por Daniel M.

66 visualizaciones

Grabación de tutoría de DEIM

Descargar la transcripción

Pues lo he dicho, bienvenidos a la tutoría número 7, si no me equivoco, sí, de Deim. 00:00:01
A ver, que esté bien grabando bien esto... Vale. 00:00:08
¿Me oís? ¿Me habéis dicho? Ahí está. 00:00:12
Vale, bueno, pues nada, ya hay feedback y corrección de las tareas, 00:00:16
quien la entregaréis la 0 y la 2, quien la entregaréis en plazo. 00:00:23
Creo que más o menos ya os habéis golpeado todos con una tarea ya que incluye interacciones. Bueno, en general veo que están resueltas bastante bien. Las tareas son lo de siempre. Cada uno tenéis un bagaje previo y unos conocimientos previos. Algunos incluso ya veníais sabiendo programar. 00:00:26
aquellos que percibo 00:00:49
que es vuestra primera vez 00:00:52
que os enfrentáis a esto 00:00:54
que sepáis que es un proceso 00:00:55
lento 00:00:58
como aprender un idioma que 00:01:00
lleva un tiempo 00:01:02
y ponerlo en práctica 00:01:04
así que 00:01:05
simplemente deciros que intentéis 00:01:07
a todos en general 00:01:10
intentéis ceñiros al máximo 00:01:12
posible 00:01:14
al enunciado 00:01:15
en sí lo que se pide en los enunciados de las tareas. Más que nada porque si empezáis a trastear 00:01:18
con otras facetas, otros aspectos y otras herramientas, perdemos un poco el sentido de curso 00:01:23
en conjunto para intentar avanzar todos hacia un mismo destino. Más que nada por eso, 00:01:31
que como hay distintos bagajes, hay compañeros que entregan tareas mucho más avanzadas, 00:01:38
que por mí genial, y de hecho para vuestras Reels y CVs y currículos, ahora que muchos de vosotros estáis en condiciones para empezar prácticas 00:01:43
y que las empresas sin CV y sin Reel de nuestro sector no suelen coger a nadie, entre paréntesis, 00:01:52
ir preparando estos materiales para cuando os lo pida mi compañero Juan José, porque si no, no va a ser posible encontrar prácticas. 00:01:59
bueno, pues 00:02:06
podéis usar estos videojuegos como base 00:02:09
para luego avanzar más allá 00:02:11
pero el objetivo didáctico, que es el que yo busco 00:02:13
en estas tareas, es el que quiero 00:02:15
que se cubra, no mucho más allá 00:02:17
si queréis cubrirlo más, vale 00:02:19
no hay problema, pero bueno 00:02:21
que en cierto modo hay que poner unos límites 00:02:22
porque si no, cada uno hacéis unas tareas 00:02:25
y vais por un lado 00:02:27
vale, lo dicho 00:02:28
bueno, lo de la RIL y el currículum 00:02:31
ya que ha salido, pues eso 00:02:33
Incido, ya os hablaré de esto 00:02:34
La semana que viene, aunque no venga ahora el caso 00:02:36
Habrá una reunión para los que estéis 00:02:39
En posibilidad de realizar el proyecto final 00:02:41
Y hablaremos más de esto 00:02:43
Me escriben 00:02:45
Daniel, tengo una dudilla 00:02:46
Cuando me pongo a escribir código con Visual Studio 00:02:48
El PC se me reinicia 00:02:50
No me pasa cuando juego a juegos que exigen bastante gráfica 00:02:51
Pero con Unity Visual Studio sí he intentado 00:02:55
Buscar la solución, pero no doy con la tecla 00:02:56
Pues es algo que la verdad es que no lo sé 00:02:58
Y es algo que es de tu ordenador, porque no es normal que se te reinicie el ordenador al abrir ninguno de los dos softwares. 00:03:04
Si eso es algo que un informático te lo va a poder mirar, yo no lo sé. 00:03:16
Lo único que te podría decir para que igual hay algún problema de instalación o algo que crea conflicto, quizá que vuelvas a instalar todo. 00:03:20
Es decir, que elimines tanto Unity Hub como el editor y Visual Studio y lo reinstales. A ver si es que en el proceso de instalación algo pasó, porque ya te digo que desde luego no es el comportamiento habitual en el software. 00:03:27
Ah, bueno, perdona que no te pueda decir más, pero es que sinceramente no lo sé, no sé por qué puede ser 00:03:44
Hay algo que está haciendo que en el arranque cortocircuite, por eso así lo primero que me viene es eso 00:03:53
Un error en la instalación, que aunque parezca que sí, hay algo que no esté funcionando correctamente 00:04:00
Voy a compartir pantalla, y así me confirmáis también que lo veis, dame un segundillo 00:04:07
compartir. 00:04:13
¿Veis la pantalla, verdad? 00:04:15
También, viendo que hay dudas 00:04:21
que sobrepasan lo tratado 00:04:23
en ocasiones, o que quieren 00:04:25
ir más allá de 00:04:27
las tareas y los 00:04:28
contenidos, he abierto otro foro 00:04:31
también para que lo uséis vosotros, 00:04:33
entre vosotros, y sea un 00:04:35
lugar donde centralizar estas 00:04:37
labores que, digamos, sobrepasan 00:04:39
los contenidos, porque 00:04:41
los foros de cada unidad 00:04:43
Mi propósito y creo que lo óptimo es que se ocupen de hablar sobre los contenidos o la tarea de esa unidad 00:04:45
Pero es verdad que en ocasiones, y sobre todo alumnos que vayáis más avanzados 00:04:51
Podéis tener inquietudes de conocer más 00:04:56
Entonces he creado este foro de cafetería para que lo podáis usar 00:05:00
Yo ahí tendré un papel en ocasiones más testimonial 00:05:05
Me voy a centrar en lo que es el curso y lo que hay que dar en este curso 00:05:08
pero que eso no frene de que podáis ir avanzando o ir proponiendo cosas o ir hablando de cosas, ¿vale? 00:05:11
Por mí ningún problema y por eso he generado ese espacio, ¿vale? 00:05:18
Vale, aparte de eso, sobre mi idea hoy, mi propósito es hablar sobre la tarea de la unidad 3. 00:05:22
Ya más o menos hemos estado viendo en varias tutorías el comportamiento de estos inputs, de los axes, 00:05:32
bueno, ya los métodos de movimiento mediante el transform, ¿vale? 00:05:40
Entonces, bueno, hoy vamos a empezar a hablar o vamos a enfocar más en lo relativo al motor de físicas 00:05:44
y, bueno, pues ya importar alguna geometría, digamos, con más detalles relacionados, por ejemplo, 00:05:53
con los colliders para que haya colisiones y se encuentren los objetos entre sí a nivel físico, etcétera, ¿vale? 00:06:01
no sé, lo de siempre 00:06:06
quiero que quede claro, estas tutorías 00:06:09
las doy en formato clase un poco 00:06:11
para, pues para 00:06:13
ahondar, pero lo suyo es que vosotros 00:06:15
me planteéis las dudas de los contenidos y las tareas 00:06:17
por eso, la primera cuestión 00:06:19
que os hago es, ¿cómo vais con 00:06:21
los contenidos de esta unidad 3? 00:06:23
y sobre todo, bueno, sobre todo no, pero 00:06:25
como aplicación práctica, ¿qué tal también con 00:06:27
la tarea de esa unidad 3? 00:06:29
¿Cómo la lleváis? ¿Habéis empezado? 00:06:32
¿Por ver problemas que os estéis 00:06:34
encontrando así de primeras 00:06:35
vale 00:06:38
temario acabado, la tarea 00:06:41
la quiero empezar, la tarea me ha abrumado 00:06:44
un poquillo, estoy con la tarea 3 00:06:46
vale, ahí dame un segundo que 00:06:48
vale, me dicen incluso 00:06:49
que me he puesto con ella pero de manera accidental 00:06:52
creé una metralleta 00:06:54
bueno, no sé 00:06:55
cómo se crea una metralleta con esta 00:06:58
tarea pero oye, que me alegro que investiguéis 00:07:00
vamos a centrarnos en la tarea 00:07:02
me interesa de los comentarios que estoy leyendo 00:07:04
El temario ha acabado, pero la tarea la quiero empezar y con la tarea me he abrumado un poquillo. 00:07:08
Esto va a pasar y, bueno, en cierto modo está pensado así para que ocurra siempre. 00:07:13
Me explico. 00:07:20
Y perdona que haya tanta introducción, pero así me sirve porque a partir de ahora las dinámicas, 00:07:23
las tareas cada vez se van a ir haciendo más complejas. 00:07:28
Las tareas no están pensadas para que sean un sigue pasos y ya está. 00:07:32
Y esto lo digo por experiencia propia, cuando sigues un tutorial o un PDF con pasos uno tras otro de haces tal cosa y al final ves que ha pasado algo pero no sabes que has hecho nada en media, no se aprende absolutamente nada. 00:07:36
Y las tareas yo me las tomo en ambas módulos que imparto este año como procesos de un poco experimentar y de asentar conocimientos, no de seguir pasos. Por eso es normal que si nunca os habéis enfrentado y cada tema vais a ver que tiene unos propósitos diferentes, la primera vez os va a sobrepasar un poco y es lógico. 00:07:49
Entonces, bueno, para eso están las tutorías, por eso intento yo dar un primer enfoque o orientar, o que me planteéis las dudas, pero es normal. 00:08:13
Hay otra cuestión que ha surgido en la corrección de las tareas, que es que hay compañeros, y además me lo han dicho explícitamente, que se ayudan de IaaS en plan chat GPT, etc. 00:08:24
Ya lo comenté en su momento, para mí no hay problema en sí, en que uséis un chat GPT, etc., cuando bloqueéis o, en ocasiones, para coger un código e insertarlo y decirle, explícamelo línea en línea como si no tuviera ni idea o lo que os corresponda. 00:08:33
Es una herramienta, ¿vale? Y además, dentro de lo que cabe, en otro módulo más de escribir, no es tan así, pero en este sé que si no se entiende o más o menos se sabe aplicar, por mucho código que te escupa una IA, luego no se llega a nada, ¿vale? 00:08:50
Entonces, dicho esto, igual que en el examen no va a haber una IA que os ayude porque tenéis que saberlo vosotros, sí que os recomiendo que cuando busquéis estas soluciones, deis contexto en vuestros prompts, en vuestros textos que introduzcáis, de estamos hablando ahora del motor de físicas y los métodos que conocemos son tal, tal y tal, ¿vale? 00:09:05
Porque si no es verdad, y es lo que quiero evitar también, hay muchísimas formas de resolver las tareas, ¿vale? Y algunas muy complejas, a veces demasiado complejas incluso para resolver cuestiones. 00:09:24
Entonces, lo importante es que aunque uséis, incluso aunque peguéis partes, fragmentos de código, ¿vale? Lo importante es que aunque lo estéis pegando, que entendáis por qué se está usando. 00:09:36
Y en los temas creo que se da material suficiente y las indicaciones suficientes para irlo entendiendo, ¿vale? Entonces, de verdad, no... Y esto yo sé como alumno qué pasa, ¿vale? Está por un lado la tarea como herramienta didáctica y luego está la preocupación, que la entiendo también, de que puede subir nota. 00:09:48
Sinceramente, la nota que suben las tareas es bastante testimonial, pero bueno, entiendo que es importante y además es una extra la nota de aprobar el examen, ¿vale? 00:10:09
Pero tomarlo más como un método para asentar conocimiento, ¿vale? Bueno, dicho esto, creo que queda claro. Ponerla ahí a la uso, sobre todo si hay algún concepto que no he entendido, aparte del manual. 00:10:18
Exactamente, es un apoyo, es otra herramienta 00:10:30
Yo también la uso 00:10:34
Cada vez la usaremos más todo el mundo 00:10:35
Pero de lo que va es de que os ayude 00:10:36
Pero que los conocimientos los tenéis que tener 00:10:39
En el examen no va a habería 00:10:41
Me ponen 00:10:42
Yo he acabado el curso de Funders 00:10:46
Que es uno que puse en el 00:10:47
Si no me equivoco, en el aula virtual 00:10:49
De información tutorial 00:10:51
Que es como de una semana de duración sobre inteligencia artificial 00:10:52
Y dice, ayuda mucho a aprender a usar 00:10:55
Los prompts, es decir 00:10:57
las interacciones con estas inteligencias artificiales. 00:10:58
Me escribe, tengo una duda de la tarea 3. 00:11:02
Cuando la pelota se cae del suelo, 00:11:04
he puesto un collider abajo para que se choque y vuelva al inicio, 00:11:06
pero me sigue con la misma velocidad cuando se cae. 00:11:09
No sé cómo arreglarlo. 00:11:11
¿Me puedes ayudar? 00:11:12
Vale, ahora vemos ese tipo de cosas. 00:11:13
Vale, dicho esto, me la guardo la duda, 00:11:17
no estoy obviándote, pero es que lo vamos a ver. 00:11:20
Así que cuando llegue el caso, si hay dudas, me lo sigue diciendo. 00:11:22
alguna duda más así de cara a la tarea 3 si hay de las previas es verdad que intentaré resolver 00:11:26
las dudas pero hay que ir avanzando vale entonces bueno dudas que haya también eso en los foros me 00:11:33
las podéis decir pero en las tutorías voy intentando enfocarme en la tarea en que haya 00:11:38
en cada momento vale para que no sé para que no nos quedemos atascados en una y un poco que haya 00:11:44
movimiento. Vale, nos ponemos a ello. Bueno, como pone en el propio enunciado, que lo tengo 00:11:52
por aquí, ahí está, hay que conseguir el objetivo, y a veces los juegos son un poco 00:11:58
simples, pero de lo que se trata es de poneros en tesituras. Consiste en un juego, que no 00:12:03
son las más obvias, pero que si sabéis implementar en un juego simple, sabéis extrapolarlo 00:12:09
a otros. Vale, bueno, consiste en que con físicas movamos una pelota que se va a ir 00:12:15
metiendo en estos agujeros, objetivos, y que si la pelota se cae de esta, dependiendo del nivel, 00:12:20
será de una forma u otra, si se va cayendo la bola de la plataforma, pues se pierde y se reinicia el 00:12:27
nivel. Cada vez que llegamos a uno de estos objetivos, se pasa a otro nivel, a un nivel 00:12:33
siguiente. Esto ya implica, y lo veis aquí, que tiene que haber diferentes escenas que corresponden 00:12:38
con cada uno de los niveles. En la unidad 4 se habla más sobre las escenas o la gestión entre escenas 00:12:44
y en el enunciado ya de este tema se esboza un poco cómo hacerlo. Por tanto, no es mala idea que en cierto momento 00:12:51
también empecéis a leer la unidad 4 antes de entregar esta, pero yo creo que se explica más o menos adecuadamente 00:13:00
o se da la introducción necesaria para hablar de estos cambios de tareas en esta sección de aquí 00:13:07
que habla del scene management 00:13:12
y de los build settings 00:13:14
lo mismo, leeros los enunciados 00:13:15
siempre del tirón 00:13:18
hacéis una primera lectura 00:13:19
aunque os suene un poco extraño a veces 00:13:21
lo que se está hablando 00:13:24
tener una idea general 00:13:26
y luego ya se va desglosando y avanzando 00:13:27
poco a poco 00:13:29
entonces el juego consiste en eso 00:13:30
para la tarea se os aportaban unos FBX 00:13:33
entiendo que ya 00:13:35
en módulos como 00:13:38
en el de animación 00:13:39
o en el de modelado 00:13:41
o incluso en el de color. Habréis visto formatos de exportación y uno de ellos es el FBX, pero básicamente los FBX son paquetes de distintos componentes, 00:13:42
es decir, pueden incluir luces, pueden incluir mallas, pueden incluir los materiales, no es como el OBJ que está destinado solo a guardar una geometría, 00:13:58
Sin más, aquí, bueno, vais a ver que cuando importáis, es decir, cuando arrastráis esos FBX y los arrastráis, se van a ver así con este triangulito que permite desplegar qué contiene ese FBX, ¿vale? 00:14:08
Y veis que hay diversas cosas y en algunos ahí puede haber más que en otras, ¿vale? Eso dependerá de cómo se haya creado y se haya guardado ese FBX. 00:14:21
esto significa que cuando arrastramos 00:14:28
lo normal es, tengo una geometría 00:14:31
y la arrastro a nuestra jerarquía 00:14:33
¿vale? vais a ver 00:14:35
una cosa que al principio 00:14:37
molesto, pero que es que dices, ah, tengo varios 00:14:39
bueno, vais a ver que aquí tengo 00:14:41
el collider como game object 00:14:43
¿vale? y luego hay otra malla que es este 00:14:45
terreno 1 collider, veis que 00:14:47
está el propio game object, que es el que agrupa 00:14:48
SFBX, más luego 00:14:51
si clicamos, la propia malla 00:14:53
que tiene dentro SFBX 00:14:55
que puede ir de manera independiente. Y cuando tenéis una geometría de este tipo, como es de X, tiene este simbolito de cajita, que no es exactamente igual que el de los prefabs, 00:14:57
que era completamente azul, sino que tiene este precintillo. Y el problema está en que por defecto no se pueden separar los elementos. 00:15:09
Yo quiero poner solo un material y no me deja aplicarlo en ocasiones. Pero hay una forma de, una vez arrastrado a la jerarquía, desempaquetar para usar independientemente los distintos elementos de un FBX. 00:15:18
En este caso, si fueran otros contenedores de geometría 3D como hay, que también admiten más elementos, sería similar. Pero con clic derecho en una de estas cajitas, si vamos a prefab, porque en realidad es un prefab, aunque esté compuesto de una malla, está la opción de desempaquetar. 00:15:33
Y la de desempaquetar completamente, que como dice su nombre, si os fijáis lo que hace es disgregar los elementos que tenga. 00:15:52
Voy a borrar esto, porque a lo mejor en ocasiones lo que queremos es solo eso, tener uno de los elementos. 00:15:59
Hasta que no se desempaqueta en ocasiones, esto no se puede hacer. 00:16:06
Aquí está apareciendo que sí, pero en ocasiones puede dar problemas. 00:16:11
Hay una forma, y esto adelanta algo que veremos en el tema 5 sobre animaciones, 00:16:14
Que es que si yo quiero tener uno de los elementos del interior de un FBX, por ejemplo, independientemente, completamente independiente, antes de llegar a la jerarquía, si seleccionáis a uno y lo duplicáis, que es con control D, al dar a control D, ¿vale? Se hace ese duplicado y ya es independiente, ¿vale? 00:16:18
Entonces, bueno, pues lo tenéis. Para ciertos usos que ya iremos viendo y que podrían ser interesantes, desempaquetados tanto ya en la jerarquía o en el propio origen, desde el panel proyecto. 00:16:37
Una cosa importante cuando vais clicando en cada uno de estos elementos es que en el inspector, como siempre sucede realmente, os va enseñando las propiedades de cada elemento y os da pista de qué es cada cosa. 00:16:53
Igual que, por ejemplo, un material. Se ha introducido un poquito los materiales cuando también se habla de materiales físicos en este tema, aunque los materiales físicos habréis visto que van de otro modo, no son exactamente lo mismo, ¿vale? Podéis ir viendo qué tiene cada elemento. 00:17:04
Y hay una opción importante que en ocasiones puede parecer que no está en el inspector porque puede estar recogido como ahora, que es esta parte inferior donde podéis previsualizar, por ejemplo, los modelos 3D, ¿vale? Y es muy útil, si no, desplegad estas dos líneas para arriba y es que está encogido, ¿vale? Si arrastráis veréis representaciones de las geometrías. 00:17:20
Y esto es útil, por ejemplo, en esta tarea para ver por qué o qué diferencia hay aparentemente entre los dos terrenos 1, que son para el primer nivel, en el que digamos que la plataforma no se mueve en sí misma, sino que está fija, pero bueno, pues si la tenéis aquí, decir, si es lo mismo, aparentemente parece lo mismo. 00:17:40
Pero si os fijáis luego, por ejemplo, en la malla que tiene cada uno, hay una versión importante, y es por lo que está hecho a propósito en esta tarea, contiene un agujero, ¿vale? Que en uno está simplificado y en otro tiene una geometría bastante más compleja, ¿vale? 00:18:01
Entonces, bueno, alguna diferencia habrá para que estén estos dos elementos por separado. 00:18:18
Si vais viendo el tema, y voy a hablar un poco de la duda que tenía la compañera sobre por qué atraviesa, por qué no elementos y cuándo se frena o no, esto está iniciado en el vídeo de Álvaro Holguera, que habla de estos asuntos. 00:18:29
Pero muy rápido voy a hacer un repaso a qué son las físicas en Unity, que son los componentes RigidBody, los colliders y cuáles son sus funciones, porque es esencial conocerlo. 00:18:45
Voy a ir rápido porque entiendo que en ese vídeo queda claro, si no me paráis. 00:18:58
Pero cuando creamos una de estas primitivas, por ejemplo el cubo, por defecto vais a ver que tienen ya agregado, aparte de un mesh renderer que lo que hace es, y se asocia con este mesh que tenemos aquí, por ejemplo en este elemento, 00:19:02
Un mesh renderer que está mostrando la geometría y el mesh filter que está mostrando cuál es la geometría y cómo está texturizada o qué textura, qué material tiene la geometría. 00:19:18
También viene un tercer componente, dependiendo de la primitiva, será uno u otro, que es un collider de los distintos tipos que hay y que se ven en el tema. 00:19:34
En los contenidos los tenéis. Si, por ejemplo, creáramos una esfera, como sucederá con la bola, pues viene con su sphere collider. Y en principio, lo borro, ¿vale? Tengo aquí una esfera que lo único que he hecho, bueno, no es lo único, voy a eliminar. Así es como vendría por defecto. Bueno, no, voy a crear otra porque si no, esta avanza demasiadas cosas. 00:19:43
Cuando creo esta bola, y digo esto es una bola, creo la esfera, viene con ese Sphere Collider. 00:20:04
Y fijaos, cuando tenemos Colliders, que en general, hay alguna excepción, pero en general, imagino que lo veis bien, 00:20:13
viene, aparte de que se vea la representación de esa malla, se ve como un sólido, se ve esta mallita verde que representa lo que es el Collider. 00:20:20
De hecho, si activo y desactivo el collider, veis que se marca y se desmarca, ¿vale? Bueno, no llega a desaparecer, pero veréis que se atenúa un poco el color. De hecho, si quito por completo ese collider, pues desaparece, ¿vale? 00:20:30
Esto lo que significa o lo que persigue es delimitar, y son independientes, de hecho se puede mover aquí el center y veis que son independientes, es representar por un lado los límites de la geometría, que es lo que se ve mediante el mesh renderer, que es la parte visual, y luego está lo que es la parte de cómo tienen que colisionar y comportarse físicamente los objetos. 00:20:45
¿Sí? Es decir, por mucho que se vea aquí la bola, realmente no se va a sostener sobre este suelo porque la parte que es, digamos, sólida, la que percibe las colisiones, ahora mismo la tengo aquí ubicada. 00:21:09
Las dos se mueven en conjunto, pero veis que en uno de los parámetros del collider hay un cierto desfase que le he puesto. 00:21:27
Porque así no me puede interesar que sea más grande, que ocupe más la parte de la colisión más allá de lo que es la geometría en sí. 00:21:34
Entonces, si yo por ejemplo, ahora esta bola, y esto es algo importante, que además viene como dos veces o más como destacado en el tema, 00:21:42
Para que funcionen las colisiones en sí, tiene que haber un objeto que se mueva o que tenga comportamiento físico. Ahora mismo en esta esfera solo tenemos que recibir las colisiones, pero si no hay nada que se mueva y llega a este punto, pues nada se percibe como que colisiona. 00:21:51
tengo aquí el terreno que lo he importado 00:22:11
ahora si queréis vemos también 00:22:14
cómo funciona 00:22:16
tengo este 00:22:17
que tiene otro tipo, que ahora veremos, de collider 00:22:20
que es este mesh collider 00:22:22
que es más avanzado 00:22:24
ahora vemos eso, la esfera 00:22:25
para que tenga sus comportamientos físicos 00:22:27
está ese componente que se llama 00:22:30
rigidbody 00:22:32
y que por defecto 00:22:32
y por eso parece además que se mueve por sí solo 00:22:35
cuando reproduzcamos el juego 00:22:38
tiene marcada la gravedad para que se use. 00:22:39
Hay una sección en los Project Settings, igual que veíamos el Input Manager, por ejemplo, 00:22:44
que es el de físicas. Está la física 2D, que ahora mismo no se interesa, y las físicas. 00:22:51
Aquí es donde se establece, y por defecto viene la gravedad, que en la física existe, 00:22:56
o es el convenio que hay, sobrepasa un poco mis conocimientos, pero que yo sé, 00:23:01
y esto lo veremos en más temas porque es importante este número, 00:23:06
que corresponde con el menos 9,81, ¿vale? 00:23:09
Si buscáis en internet veréis que este número, por lo que sea, que no conozco, 00:23:12
está relacionado con la fuerza gravitatoria, ¿vale? 00:23:17
Si en algún momento iniciáramos un juego en el que estamos en la Luna 00:23:20
y queremos que la gravedad se disminuya, aquí podríamos poner el valor de gravedad de la Luna. 00:23:24
Es decir, esto se puede ajustar aquí, ¿vale? 00:23:28
Entre otros factores que también se habla en el tema, como este layer collision, 00:23:31
para determinar qué capas colisionan con otras independientemente vale las layers son estas lo 00:23:36
veremos también más adelante diferentes digamos separaciones o segmentaciones que podemos hacer 00:23:42
por elementos y bueno aquí podemos hacer que unos elementos colisionan con otros pero otros no y así 00:23:49
y eso discriminando quién lo hace con qué vale igualmente ahí otro factor que es importante 00:23:53
Cuando ahora hablemos, que es, si os recordáis el último día, dijimos, los movimientos por el transform se hacen en el método update, pero los de física lo haremos con el fix update que no necesita ese time delta time del que hablábamos para regular la velocidad o la potencia de reproducción del ordenador. 00:24:05
Porque aquí ya está establecido que el intervalo de ese tiempo de ejecución sea este. Son distintos elementos, aparte de otros muchos que hay sobre física, pero que en principio no hay que tocar porque ya viene configurado para que funcione correctamente. 00:24:29
Hay algunos que sí son interesantes, pero bueno, son más avanzados, como este, la velocidad de penetración, que permite, bueno, porque si una colisión es muy rápida, pues haya un tiempo de detección para que evite que traspase elementos por ser muy rápido, ¿vale? 00:24:51
Pero bueno, vamos con lo básico. Cuando ponemos este RigidBody, como usa la gravedad, si le damos a play, a la reproducción, vais a ver que la bola cae y atraviesa. 00:25:07
Veis que está la bola, cae y hay un collider, ¿vale? Importante, porque si no hay colliders, tampoco se detectan, pero hay un collider en la esfera y otro en el terreno. 00:25:18
Y veis que se visualiza, ¿vale? ¿Por qué no lo hace? Muy simple, importante. Quizá es el problema que está diciendo la compañía, no creo, sé cuál va a ser. 00:25:26
Pero importante, que porque veamos aquí un elemento y parezca que el elemento está aquí, realmente el que regula y ajusta todo lo relacionado con esas colisiones es esta malla verde que está relacionada con el collider. 00:25:35
Por tanto, si la he movido y deja de estar asociada a ese elemento, pues veis que la colisión no se da como lo esperable. 00:25:47
Ahora sí, ahora tanto la malla visual como la de colisión se ajusta y veréis que ahora cae por fuerza de la gravedad, no hay ningún código de momento que mueva esta bola y se queda ahí plantada. 00:25:55
La velocidad de cómo cae, igual que sucede en el mundo, se regula, de momento el collider me quedo ahí, se regula con parámetros del RigidBody. 00:26:05
y lo más importante 00:26:18
aparte de que se puede desactivar la gravedad 00:26:20
si yo la desactivo pues le doy a play 00:26:22
y como no hay gravedad pues este objeto 00:26:24
si hubiera otra bola o choco 00:26:26
hacia abajo 00:26:28
habría una colisión 00:26:29
pero en sí no hay fuerza de la gravedad 00:26:34
por eso no cae 00:26:36
luego también veremos que hay otro que es para 00:26:37
aunque tengan gravedad 00:26:40
se queden fijos a la espera 00:26:42
de que a lo mejor por código digamos 00:26:46
ya no es kinemático y se active 00:26:48
por ejemplo en Angry Birds 00:26:50
por decir un ejemplo, no es exactamente esto pero creo que 00:26:51
ayuda a entenderlo, cuando tenemos un pájaro 00:26:54
en el tirachín de Angry Birds 00:26:56
hasta que no soltamos 00:26:58
no se aplica la fuerza, vale, pues a lo mejor 00:26:59
está en kinemático hasta que de pronto decimos 00:27:02
vale, ya, deja de ser kinemático 00:27:04
y usando la gravedad y todas las fuerzas que tengamos 00:27:05
pues ya sueltas y 00:27:08
adquiere la fuerza 00:27:10
física que se esté 00:27:11
otorgando, vale 00:27:13
Vale, entonces el Rigid Body, voy a dejarlo como viene por defecto, que es que funcione con normalidad y con gravedad, están estos tres parámetros, bien explicados en el tema, pero que bueno, la masa probablemente a nivel físico pues tiene muchos peros lo que digo, pero sería el peso, vale, pues si algo tiene una masa grande pues tiene un peso elevado y caerá más rápido. 00:27:15
De hecho, fijaos, lo voy a levantar un poco, que si yo tiro la bola y vale 1, cae así de rápido y si le pusiera 1000, ¿vale? Pues veréis que cae más rápido, debería caer más rápido. 00:27:37
A ver, voy a poner un valor más alto. Y esto también tiene influencia. Hasta que coge la aceleración, pues no lo está haciendo, pero sí que debería estar influyendo. 00:27:54
A ver, LegitBody, bla, bla, bla. Ah, sí, voy a ponerlo más arriba. Vais a ver que caerá de distintos modos, ¿vale? Y esto también aplicará fuerzas en los otros elementos. 00:28:07
La clave en esto, y lo que a veces provoca irritación para calcular, es que aparte de que tenga esta masa hay otro parámetro, otros dos, que son el drag y el angular drag, ¿vale? 00:28:21
La masa es influyente también, por ejemplo, cuando vayamos a aplicar fuerzas por código, como hacíamos con la nave al darle a la W que vaya hacia adelante, según esta masa la fuerza costará más que empuje o no, como si nosotros estuviéramos aplicando la fuerza. 00:28:33
Pero hay otros dos variables, que son este drag y este angular drag, que son las resistencias, por un lado, al aire y la resistencia a los giros, a las rotaciones, que dependiendo de qué valores pongamos, si no tienen ninguna resistencia, y hay vídeos que hablan de esto en el tema, que independientemente del peso o de la masa, mejor dicho, que tenga un material, lo importante es la resistencia que tenga al aire, y está el experimento, supongo que lo habéis visto, del martillo y la pluma, 00:28:50
En una sala en la que ninguno de los dos elementos tiene resistencia al aire, o tienen la misma, caen a la misma velocidad, aunque tengan distintas masas, ¿vale? Pues está este parámetro que lo que hace es, digamos, la resistencia al aire en el sentido de este aire que tenemos aquí en medio y que es invisible, cuánta resistencia, cuánta oposición al movimiento va proporcionando y por eso lo va frenando, ¿vale? 00:29:16
¿Veis que, aunque está la masa de 1, cae mucho más despacio y si empieza a subirlo incluso se detiene porque hay un aire aquí, hay una fuerza en el ambiente que lo detiene. 00:29:39
Lo mismo sucederá con el angular drag. Esto lo veremos cuando esta bola la rotemos y esto va a suponer que la bola se detenga antes o no. 00:29:51
No es la fricción de los materiales, que esos son los materiales físicos que también influyen, sino la resistencia, digamos, del ambiente, del aire. 00:30:01
que no solo por subir la masa 00:30:08
va a caer más rápido 00:30:11
como hemos visto, todo es en conjunción 00:30:13
con la resistencia que también hay en el aire 00:30:15
pero sí que es importante 00:30:17
por ejemplo, para aplicarle fuerza a más masa 00:30:19
más cuesta mover un elemento 00:30:21
a lo mejor luego se detiene antes o no 00:30:22
según esta resistencia, pero también 00:30:25
influye en las masas 00:30:26
entonces bueno 00:30:28
por defecto vais a ver que una bola 00:30:30
puede caer tal que así 00:30:32
¿vale? hasta aquí ¿qué tal? 00:30:34
Dame un segundo que me quito la sudadera mientras me escribís algo o me decís. Vale, bien. Además, esto también es interesante porque ya vais viendo también motores de físicas, etc. 00:30:38
Los software de modelado 3D tienen simuladores de física para aplicar fuerzas, etc., pero la interactividad que tenemos en Unity no es algo que teníamos en esos software, por tanto, oye, se abre el abanico de opciones, ¿verdad? 00:31:02
Esto es más complicado de lo que parecía en un momento, pero mola. 00:31:20
Bueno, en realidad, si os fijáis, lo único que hemos hecho, digo sí, si no ceñimos a lo que estoy diciendo, la tarea tiene más intíngulis, pero es entender que hay que añadir colliders, tiene que haber un collider para que se colisionen, para que se detecten los objetos entre sí, 00:31:22
y aquel que vayamos a dar queremos que se comporte con fuerzas físicas que se mueva etcétera tiene 00:31:45
que tener este rigi body y ojo y esto lo hablamos el otro día rigi body va a ser el componente sobre 00:31:51
el que aplicamos las fuerzas es decir si queremos que un objeto al darle a una tecla se le aplique 00:31:56
una fuerza vale que no es lo mismo mover con el transforme como hacíamos el otro día con el 00:32:01
transporte late que es que vamos cambiando los parámetros como hacemos aquí vale esto es lo que 00:32:06
hacemos con transform translate básicamente por código pero hacemos esto o cambiamos la escala 00:32:10
o cambiamos la rotación vale pero estamos cambiándolo en este un componente transformó 00:32:16
con el ritmo de lo que se trata es un poco diferente que es aplicar fuerzas que simulan 00:32:21
la realidad vale vamos a ello hay otro otro elemento muy importante y quizá esto sí diría 00:32:26
que es lo que la compañera me ha dicho, que es que 00:32:38
aunque está todo como configurado 00:32:39
y vais a ver que cae la bola y choca 00:32:41
y se queda ahí, porque no hay nada más que está ocurriendo 00:32:43
no estamos dando más fuerza, entonces 00:32:46
la bola sigue teniendo gravedad, le detiene 00:32:47
esta tabla, porque 00:32:49
la tabla aunque tenga un MES Collider 00:32:51
no tiene 00:32:53
un Rigid Body 00:32:56
y también esto lo pone mucho en el tema 00:32:56
si hay un Collider, un Gain Object 00:32:59
que tiene un Collider pero no un Rigid Body 00:33:02
pues es una pared, es estático, no tiene 00:33:03
comportamientos físicos detecta colisiones y está ahí para detenerlo vale entonces por defecto pues 00:33:05
esto funciona como un suelo inamovible vale si lo hacemos rápido si yo le dijera que esto tenga un 00:33:12
rigid body vale bueno se han añadido durante el play ya sabéis que durante el play lo que 00:33:19
añadamos no funciona pero si le doy a este rigid body simplemente vais a ver que se caen tanto 00:33:24
bola como tabla, porque tienen la gravedad. Si yo desactivo esta gravedad, y aquí vienen 00:33:32
cosas divertidas, la tabla no tiene gravedad, llega la bola y la sobrepasa por algo que 00:33:37
es un poco más intrincado, perdona, porque esto, el Mesh Collider ahora hablamos, voy 00:33:45
a poner un Bosch Collider, ¿vale? Y ahora veis que tiene esa caja, y ahora sí que, 00:33:49
cuando llegue, estamos usando el Bosch Collider, cuando llegue la bola, la empuja, como si 00:33:56
fuera un bolo. Lo habéis visto, ¿no? Empuja y la choca y le da, ¿vale? No hay gravedad, 00:34:00
pero se mueve por fuerza del impacto y la fuerza que le ha transferido la bola. Entonces 00:34:08
aquí ya podemos ir pensando en juegos de bolos, en juegos de lo que implique físicas. 00:34:15
vale, lo dicho 00:34:21
voy a dejar aquí un poco aparcado 00:34:27
esto del Maze Collider, que es el 00:34:29
Collider que viene por defecto en estos 00:34:30
FBX cuando lo arrastremos, porque es 00:34:32
un poco más complejo y probablemente la parte más difícil 00:34:35
de entender de la tarea, pero 00:34:37
vamos a ello, ¿qué problema hay? 00:34:39
¿y por qué no puedo 00:34:40
digamos con el propósito del juego que tenemos 00:34:42
y voy a decirle que esto 00:34:45
sí, está bien 00:34:47
¿qué problema hay? 00:34:48
Que yo tengo aquí un agujerillo que voy a usar para que se meta la bola, como si fuera un campo de golf, y cuando se meta, pues ahí ha ganado la tarea, el nivel. 00:34:51
¿Qué pasa? Que los colliders por defecto son formas primitivas, pues una caja, una esfera, una cápsula, y ¿qué ocurre? 00:35:02
Que si tengo un hueco, ahora mismo, si os fijáis, tengo una caja, pero volvemos a recordar que es independiente lo que vemos visualmente con la forma de esa caja. 00:35:09
Entonces, ahora mismo, por mucho que me empeñe, y lo vamos a hacer, la bola jamás se va a meter en ese... 00:35:21
¡Uy va! A ver, voy a quitarle el Rigid Body, ¿vale? Porque no quiero que el terreno se mueva, entonces me está molestando más que otra cosa. 00:35:28
Quiero que teste la colisión y la bola, pues, choque con ello o no. 00:35:35
Cuando llega la bola, se posa ahí, y bueno, aparte de que la bola no la ajusta de tamaño y no va a entrar, 00:35:39
pues porque es un poquito grande, ¿vale? Voy a cambiar la escala, vinculo todo para que se escale proporcional, 00:35:43
0,2, y ahora, a ver, voy a hacerla un poquito más, la voy a ajustar más, ¿vale? 00:35:50
Ahora ya sí tiene un tamaño para que se pueda introducir, ¿vale? 00:35:56
Si yo meto esta bola, y estamos en reproducción, ¿eh? 00:36:00
Podemos comprobar las simulaciones de físicas moviendo los elementos. Cuando soltemos o vayamos operando, subo la bola y cuando suelto, como tiene gravedad, baja. Esto en tiempo real, en el panel escena, podemos siempre ir testeando. 00:36:03
Y fijaos que cuando se cae, suelto y se cae, porque ahí no hay nada. Reseteo otra vez. ¿Qué sucede si os fijáis? Primer problema, que cuando yo me pongo encima de este agujero, digo, pero si hay un agujero, pero lo he dicho, no se está metiendo, que lo ponga ahí, se queda flotando, porque el collider del terreno es un cubo. 00:36:21
Entonces, por eso esta tarea, para huecos, vacíos, geometrías complejas, si queremos que se adapte completamente, existe este otro tipo de collider, que es el que suele venir con los FBX, porque se entiende en geometrías más complejas, que se adaptan a mallas. 00:36:42
Ah, vale. Entonces, bueno, ahí pues hay un elemento extra que tener en juego, que es que los colliders también se van, hay distintas tipologías y unos son más complejos que otros, y el BOS Collider a nivel de recursos, además, consume muy poco, y el MES Collider, pues si metemos geometrías, consume más, y de hecho, lo pone en el tema, si tiene una geometría vinculada, o esa malla, ese collider consistente en malla, tiene más de un número de polígonos, 256, 00:37:00
De hecho, pues esta malla se simplifica o empieza a tener comportamientos no deseados. Por eso también, quizá, es la razón por la que os he proporcionado una malla que veis que tiene pocos triángulos con respecto a la de alto poligonaje, que es la que queremos que se vea, que sobrepasa ese número de triángulos. 00:37:29
Y en realidad, cuando tenemos un collider, ¿qué más me da que haya toda esta geometría? Si lo que quiero es que detecte, pues oye, que hay un agujero. Tampoco tiene que ser 100% realista, es decir, no se va a percibir cuando la gambola se cae si hay un poquito. 00:37:50
Visualmente sí, porque los acabados son más finos, las curvas, los biseles, pero a nivel de Collider, no. 00:38:08
Por eso se sacan estas versiones de más bajo poligonaje, para no sobrecargar, porque al final las físicas tienen muchos cálculos detrás 00:38:14
y para no sobrecargar la máquina, pues se optimiza de este modo, ¿vale? 00:38:21
Entonces, nos hemos quedado en la bola. 00:38:26
Y hay otro comportamiento muy importante, muy, muy, muy, muy, muy, muy importante, ¿vale? 00:38:30
Digo muchos muis, porque es uno de los quebraderos de cabeza que hay al principio cuando interactuamos a través de colliders, que es que un collider, digamos, y todos, sucede, bueno, en el mes collider, sí, también sucede, pero con asterisco, todos los colliders van a tener un parámetro desactivado por defecto, que es este de list trigger, ¿vale? 00:38:35
están el modo colisión, que el collider funcione como un colisionador, que es lo que hay ahora mismo, 00:38:57
y tenemos esta bola y choca con el terreno, que si os fijáis tampoco tiene marcado esto East Trigger. 00:39:06
Pero hay que pensar que en ocasiones, y es otro de los usos que tiene los colliders, 00:39:13
es que gracias a estas áreas verdes asociadas con el collider, estas áreas que tenemos aquí, 00:39:17
Que no tienen ni por qué ir asociadas a una malla 00:39:24
Yo puedo desactivar esta malla 00:39:26
Y si este GameObject solo... 00:39:28
De hecho, mirad, yo puedo añadir aquí un Entity 00:39:30
No tiene nada 00:39:33
Y decir, yo quiero que esto tenga un Boss Collider 00:39:34
Aunque no se vea nada, aquí hay un Boss Collider 00:39:36
Y fijaos que hay una caja ahí 00:39:39
Voy a resetear la posición porque me la he llevado un poco lejos 00:39:41
Tengo aquí un Boss Collider 00:39:43
Y ahí está 00:39:45
Un cubo que no se ve 00:39:49
Pero hay un área que sirve para cosas 00:39:51
O está ahí para algo 00:39:54
Vale, como esto tiene un Bosch Collider 00:39:56
No se ve ningún cubo 00:39:58
Pero fijaos que cuando yo dé a la bola 00:39:59
La bola se queda ahí encima 00:40:01
Esto de primeras no es nada intuitivo 00:40:04
Pero es lo que os he contado 00:40:08
Un Collider sirve para detectar colisiones 00:40:09
Y comportarse como un límite natural 00:40:13
A lo que un Rigidbody se enfrenta 00:40:15
Este Rigidbody está intentando seguir bajando por fuerza de la gravedad 00:40:18
Y dices, si que ahí no hay nada 00:40:21
Vale, efectivamente no hay nada, pero hay un collider y como tal se está detectando y está funcionando acorde a ello. ¿Qué sucede? Que los colliders tienen otro uso y este además me viene muy bien. Tienen otro uso que es delimitar áreas para que sucedan cosas. Y el ejemplo lo pongo ahora muy rápido. 00:40:23
Imaginaos que yo quiero, y esta es la lógica que tenéis que meteros en la cabeza 00:40:42
Que es cuando yo llegue con la pelota, consiga que la pelota se meta en este agujero 00:40:48
Vamos a tener que decirle al programa de alguna forma que cuando la pelota se meta aquí 00:40:53
Se active un código o sucede algo que nos pase al siguiente nivel 00:40:58
O que saliera una pantalla que diga ha superado el nivel o lo que sea 00:41:02
Pero que active algo, que detecte algo 00:41:08
Para eso se usan los colliders también, solo que en vez de usarlo en modo colisión, porque aquí vamos a querer que la bola se meta y aunque haya un límite, imaginaos que este cubo lo muevo y lo meto aquí dentro, queremos que la bola se meta ahí, pero que haya un área definida que no sirva, que no funcione como un límite físico, 00:41:09
Pero sí sirva para detectar que algo 00:41:33
Cuando traspasa sus límites o se mete en su interior 00:41:35
Pueda desencadenar eventos 00:41:37
Puede desencadenar acciones 00:41:39
Para eso está esto de Eastrigger 00:41:41
Y son excluyentes 00:41:43
Si yo tengo un non-collider 00:41:45
Así 00:41:47
El software sí va a detectar que está chocando 00:41:48
Con los límites y entre otras cosas 00:41:51
Lo que hace es que no permite que lo atraviese 00:41:53
¿Vale? Va a haber un método 00:41:55
En código que permita detectar estas colisiones 00:41:57
Físicas, digamos, yo lo llamo así 00:42:00
En plan que respetan los límites físicos de este cubo, en este caso. Si yo en el cubo, no en la bola, en el cubo, porque yo la bola quiero que cuando siga, si yo la dejara aquí y la sacara de esta caja y le doy al play, yo quiero que se siga comportando con algo físico que tiene límites. 00:42:01
Pero, sin embargo, este cubo ahora mismo yo no quiero que tenga un comportamiento físico 00:42:19
Se podría buscar por algún motivo 00:42:27
Pero este cubo lo que quiero es que cuando detecte que se ha metido una bola 00:42:30
Puedan lanzarse estos sucesos 00:42:37
Si yo a este cubo le digo, no, no, tú no vas a funcionar como un collider 00:42:41
Vas a funcionar como un trigger 00:42:44
Trigger en inglés significa disparador 00:42:46
sirve para lanzar, para servir de excusa, digamos, de detector de acciones, ¿vale? 00:42:48
Vais a ver que el primer efecto que tiene es que cuando doy a play, a nivel físico, ¿vale? 00:42:55
No está ahí, es como si no existiera, lo ha atravesado, pero ojo, que el programa sí ha detectado 00:43:03
a nivel interno, de momento, que esta bola ha entrado en esta área, ¿vale? 00:43:08
Y eso es lo que haremos cuando, de hecho, cojamos y usemos un collider, en este caso un boss collider, 00:43:12
porque de esta forma no viene bien 00:43:18
que vamos a hacer más pequeñito 00:43:20
vamos a decirle que esto sea de 0.1 00:43:22
en todas las dimensiones 00:43:25
un cubito 00:43:27
que lo que vamos a hacer es meterlo aquí dentro 00:43:28
y ahí va a estar 00:43:31
lo vamos a llamar 00:43:32
detector 00:43:34
bueno 00:43:35
trigger o como queramos 00:43:38
o meta, vamos a decir que esto es meta 00:43:41
y esto 00:43:44
como trigger que es va a estar aquí 00:43:45
esperando a que alguien lo atraviese o lo toque 00:43:47
o lo que sea, pero en ningún momento 00:43:50
va a suponer una resistencia 00:43:52
física, simplemente va a servir 00:43:53
de disparador, de trigger 00:43:56
¿vale? 00:43:57
esto es lo que haremos, me han dicho 00:44:00
una precarga de nivel, bueno no 00:44:01
precarga no, sino detector de que cuando 00:44:03
la bola llegue aquí y toque este trigger 00:44:06
lance un nuevo nivel 00:44:08
eso se lo diremos por código 00:44:10
hasta aquí que tal 00:44:12
¿entendéis de momento la 00:44:14
diferencia de East Trigger y no East Trigger, lo importante es, y es lo que decía la compañera, 00:44:16
yo estoy detectando ya que la bola, y es lo que está haciendo, ella lo que ha hecho, 00:44:23
entiendo, es poner debajo un cubo Collider, aquí debajo, para que cuando la bola caiga 00:44:27
y toque ese cubo, reinicie el nivel. Si lo pones como East Collider, es decir, como viene 00:44:33
por defecto, la bola cuando llega ahí abajo se queda ahí, suspendida, porque hay un límite 00:44:40
Físicamente suspendiendo 00:44:45
Si la opción, si lo que buscamos solo es 00:44:47
Que desencadene, que se reinicie el nivel 00:44:49
Se pondría Nice Trigger, ¿vale? 00:44:51
Ese es el detalle 00:44:55
Ahora vemos de todos modos 00:44:56
Cómo se activan 00:44:58
La función, por código lo que queremos 00:44:59
Que suceda 00:45:02
Al detectar 00:45:04
Estas colisiones, ¿vale? 00:45:07
Hasta aquí creo que me seguís, ¿no? 00:45:10
Vale, y voy a llamarlo 00:45:12
Ahora 00:45:13
Disparador 00:45:14
Bueno, no, disparador no 00:45:16
Sucesos, collider, yo que sé 00:45:18
Porque voy a enseñaros 00:45:24
También viene el tema 00:45:26
Que hay dos métodos 00:45:27
Bueno, en realidad hay más, pero hay como dos métodos base 00:45:29
Que sirven para trabajar con estas colisiones 00:45:31
O con estos triggers 00:45:34
Imaginaos 00:45:35
Yo voy a generar un script 00:45:37
Que se va a llamar 00:45:39
Y lo hago aquí durante el tutorial 00:45:40
Que se va a llamar 00:45:42
Sucesos, también 00:45:43
Collider, yo que sé 00:45:46
que mata y lo voy a asociar a este cubo transparente visualmente pero que tiene este 00:45:48
collider vale para que sucedan cosas abro este código y aquí está preparado para trabajar vale 00:45:56
este es el objeto que yo quiero que capte lo que va a ocurrir también se podría poner a la bola lo 00:46:03
que vamos a ir viendo pero hay que ir midiendo a quién se le pone según quién dispara que o 00:46:09
O quién tiene ciertas acciones, ¿vale? 00:46:14
Hay dos métodos, ¿vale? 00:46:17
Y esto es importante con respecto a alguna de las tareas, 00:46:19
no en general, pero de las tareas, 00:46:21
que es que penséis siempre que estas llaves engloban, 00:46:23
y hablábamos del encapsulamiento en su momento, 00:46:28
engloban acciones que se dan en ciertos momentos 00:46:30
o que recopilan acciones, ¿vale? 00:46:32
Cuando creábamos un método, etcétera. 00:46:34
Cuando vamos generando nuevas... 00:46:36
Imaginaos que yo hago el método, voy a saltar o impacto, 00:46:39
como en la tarea número 1, hay que tener bien en cuenta dónde lo declaramos, es decir, si lo declaramos dentro del update, realmente no se está llamando en ningún momento 00:46:43
y se está ejecutando dentro del update, no es el punto, de hecho pone error, hay que hacerlo fuera de los tiempos de ejecución, que luego ya cada fotograma, 00:46:56
Si lo metemos en el update, llamaremos a impacto y ahí buscará el método fuera de estas llaves. 00:47:05
Es un método independiente que se llama impacto y hará lo que tenga que hacer. 00:47:12
Lo mismo va a suceder con estos que voy a indicar ahora, que se declaran fuera de los tiempos de ejecución. 00:47:15
Siempre dentro de la clase, pero como otro método aparte. 00:47:21
Esos métodos son los onTrigger y vais a ver que luego tienen distintos apellidos, que son el enter, el exit, el stay. 00:47:26
por ejemplo el enter voy a poner aquí 00:47:34
y tiene muchas cosas 00:47:36
mucha parafernalia ya escrita 00:47:38
importante que esté esa parafernalia 00:47:40
porque si no, no funciona bien, por tanto 00:47:43
cuando pongáis un trigger, dadle 00:47:44
a la que queráis, doble clic 00:47:46
que se os crea ya ese método 00:47:48
alguien ya lo ha creado por vosotros, ¿vale? 00:47:50
alguna de estas librerías, bueno el MonoBehaviour 00:47:52
está este 00:47:54
este comportamiento de onTrigger 00:47:55
¿vale? y de hecho está en UnityEngine 00:48:00
está dentro de esta biblioteca 00:48:03
y por otro lado, lo pongo 00:48:04
ahora vamos discriminando, están los onCollision 00:48:07
que también tienen las mismas etiquetas 00:48:10
enter, exit y stay 00:48:11
la forma más rápida en este momento para asociarlo 00:48:12
con que es esto de enter 00:48:16
stay o exit es 00:48:18
lo mismo que hablamos de cuando 00:48:19
usábamos los input.getKey 00:48:22
que estaba el getKeyDown, el getKeyUp 00:48:24
o el getKeyAsecas 00:48:26
que dependía de, en el momento en el que 00:48:27
se pulsa, si se mantiene la tecla 00:48:30
pulsada o si se suelta, y en ese 00:48:32
momento es cuando se producía el efecto. Aquí es un poco igual. Nosotros, imaginaos 00:48:34
que tengo el onTrigger, ¿vale? Porque esto es un trigger. Vamos a poder lanzar acciones 00:48:39
según si un objeto, el que sea, ya veremos que luego, gracias a este parámetro, podremos 00:48:43
incluso discriminar qué objeto lanza el trigger y qué objetos no, ¿vale? Pero vamos paso 00:48:50
Cuando un objeto atraviesa, entra, mejor dicho, por eso es enter, este trigger, que es el que tiene este script, y por eso sucede, al tocarlo se activará o se hará lo que ponga aquí. 00:48:55
Por ejemplo, si yo tuviera otro método aquí llamado impacto, lo pongo aquí, lo creo y le pongo el void pertinente y digo cuando un objeto, vamos a hacer la prueba inmediatamente de si esto funciona o no, si yo pongo que impacto, ahí está, preparado, aquí es como otro tiempo de ejecución, pero dependiente de, oye, esto ha entrado un elemento en el trigger. 00:49:16
vale vamos a decirle que cuando entre por ejemplo esta bola en este en este cubo que tenemos aquí 00:49:46
que es trigger que es de tipo trigger lo tenemos marcado si no fuera trigger estaríamos usando 00:49:55
este otro vale son dos diferentes que se lance lo que pone el impacto y en impacto voy a poner 00:50:02
un debate como siempre la forma más rápida de comprobar que sucede algo que es trigger activado 00:50:06
activado vale lo guardo que sucederá vale que cuando este objeto detecte que le han entrado 00:50:13
en su trigger pues va a ejecutar lo que hay dentro que en este caso nos lleva a que la 00:50:23
consola muestre trigger en activado lo guardado le doy a play voy a poner la bolica un poco más 00:50:27
arriba para que se vea que tarda un poco y que según entra en el trigger y una sola vez vale 00:50:34
trigger activado. Esto imaginaos en la tarea 00:50:41
de los obstáculos de la nave, que cuando la nave toque 00:50:46
ese obstáculo, ya por código podríamos decir que la propia nave 00:50:50
el propio 00:50:54
pivote, el obstáculo, pues se destruya. En vez de hacerlo 00:50:55
con esa condición de si sobrepasa 00:51:02
tal profundidad, se desactive, etc. Ya se podría hacer directamente con el 00:51:06
trigger y de hecho ahora en vez de aparte de que ponga debate log en impacto voy a hacer que se 00:51:10
destruya a sí mismo vale cuando ponemos game object así con minúscula significa que estamos 00:51:17
hablando del propio objeto que tiene este código vale vais a ver ahora que lo que va a conseguir 00:51:23
es que cuando esta bola vale y veréis que en todo momento estaba atravesando la caja es un 00:51:29
trigger recordad no hay límites físicos sirve para detectar que algo entra o permanece si 00:51:36
sale state o sale si es el exit veis y no sé si os habéis fijado que lo que hace y fijaos en este 00:51:42
que es el que tiene el script que dice destruyeme a mí si algo me entra en mi trigger al darle a 00:51:48
play miraos fijaos que lo ha destruido el game object vale aquí ya es lo que queramos poner en 00:51:52
en este interior, ya lo que vayamos sabiendo, ya vamos detectando acciones que se desencadenan 00:52:00
con este evento. Voy a hacer otra cosa, voy a quitar esto del destroy que me servía de 00:52:12
ejemplo, que en vez de poner onTriggerEnter, uso otro de los onTrigger que había, que 00:52:15
es el onTriggerStay, es decir, stay de permanecer. Esto va a ser igual que cuando poníamos el 00:52:22
getKey sin down o up, el onTriggerStay va a ir ejecutándose en cada fotograma que esté 00:52:28
el objeto dentro, pues la orden, en un modo, una especie de update, pero relacionado con 00:52:37
esto que estamos hablando hoy. Si yo aquí pongo stay, pues lo que vais a ver es que 00:52:43
ahora impacto he puesto muestra este mensaje de trigger activado. Ahora en vez de solo 00:52:48
mostrarlo cada vez 00:52:52
y solo ese fotograma que se mete 00:52:53
el otro elemento 00:52:55
en ese 00:52:58
GameObject, vais a ver 00:52:59
que va a lanzar ese mensaje múltiples veces 00:53:02
porque en todo rato 00:53:03
que se esté 00:53:05
ese elemento 00:53:08
dentro 00:53:10
de la caja, se va a seguir 00:53:11
y aquí sigue contando 00:53:14
lanzando ese mensaje 00:53:15
si yo muevo la bola y la saco 00:53:17
fijaos que ahora la he sacado 00:53:19
en el momento en el que no está adentro, ya no se está lanzando, ¿vale? 00:53:20
Fijaos que en cuanto vuelvo a entrar aquí, otra vez se activa, porque estamos dentro, un trigger state. 00:53:24
Esto imaginaos que entráis en un área de un juego en el que cuando entras en una habitación 00:53:32
tiene que haber un peligro y se activa una luz y el enemigo es más fiero, ¿vale? 00:53:37
Pues se podría delimitar que haya un trigger, un collider, como East Trigger, dentro de esa área 00:53:43
y que detecte que cuando entra tal personaje y esté dentro, pues está en ese modo alerta. 00:53:49
Cuando sale, es decir, cuando ya no está dentro, pues se desactiva. 00:53:53
Existe otro que es el exit, que es un poco lo mismo, ¿vale? 00:53:58
Está ahí, es el tercero, que es cuando sale, ¿vale? 00:54:03
No pone nada, a ver, vale, bueno, hay un problema aquí seguramente, 00:54:07
que es que, y esto cuidado también porque es importante, 00:54:11
que es que los triggers, atención, que si yo lo metiera aquí, pues básicamente está todo el rato tocando a otro elemento, ¿vale? 00:54:14
Que estamos hablando todo el rato de la bola, pero si esto también tiene un collider, y por eso está lo de la matriz que os hablé antes, ¿vale? 00:54:24
También entre otras herramientas, pues estaría todo el rato detectando algo. 00:54:30
si yo 00:54:34
vamos a ver 00:54:36
si yo dejo la caja bien ajustadica 00:54:40
para que no toque nada 00:54:42
y pongo la bola que cuando entre 00:54:44
vale, es que está detectando 00:54:46
que sale en todo momento y de todos modos 00:54:50
a ver, porque no está haciendo 00:54:52
el comportamiento, vale, es que no había guardado 00:54:54
que eso, tened en cuenta 00:54:57
que hay muchos tipos de triggers 00:54:58
que no solo es uno, hay que discriminarlo 00:55:00
cuál sería, ahora, la bola 00:55:03
no se lanza ningún mensaje 00:55:04
hasta que la esfera sale 00:55:06
Ha salido y trigger activado. Se ha lanzado el mensaje cuando ha salido la instrucción que estamos dando. Esos solo son triggers. Pensad que son, por ejemplo, ponerlo para cuando atravesamos una puerta que detecte que pasamos esa puerta o cualquier cosa. 00:55:08
Gracias a los colliders podemos ir determinando áreas y dibujando áreas. ¿Qué sucede con el otro que tenemos por aquí? Que existe otro método, que también es versátil, que es este onCollision, que también la lógica no la voy a explicar porque es la misma, 00:55:27
Enter, Stay o Exit 00:55:51
Que es cuando choque con ese objeto 00:55:53
Es decir, yo ahora mismo 00:55:55
Vais a ver que la bola 00:55:57
Se queda suspendida 00:55:59
Bueno, espera, porque igual la he movido 00:56:00
Vale, lo primero 00:56:02
Es que para que suceda esto del 00:56:05
On Collision, Enter 00:56:07
Como hemos dicho 00:56:08
No puede ser modo East Trigger 00:56:10
¿Vale? Son excluyentes 00:56:13
¿Vale? O puede ser o modo Collider 00:56:15
Físico o modo East Trigger Disparador 00:56:17
Si lo quito 00:56:19
vais a ver que la bola ahora sí se queda suspendida, ¿vale? 00:56:21
Lanzará un mensaje, y ahora mismo no lo hace porque nuevamente no ha guardado, 00:56:25
pero si ponemos onCollisionEnter significa que en cuanto otro objeto colisione, 00:56:29
no trigger, colisione, tiene que estar sin el trigger activado, 00:56:34
colisione con este objeto, ese fotograma de contacto, el primero, 00:56:38
se lanzará el mensaje, vais a ver que en cuanto choque, 00:56:42
Plas. Bueno, pues Plas no. Esperad un segundo. OnCollisionEnter, impacto, trigger activado. ¿Por qué no lo hace? A ver, no he guardado y seguramente sea eso. En cuanto choque, trigger activado. ¿Vale? 00:56:44
Bueno, pero veis que sigue manteniendo la lógica de contacto físico, ¿no? Si aquí en vez de decirle collision enter, digo on collision stay, es todo momento, digamos, que esté tocando, que estén contactando, colisionando los dos objetos, se lanzará el mensaje, ¿vale? 00:57:03
Ya veis que en cuanto está ahí, aquí, trigger activado, por algún momento está dejando de detectarlo, en algún momento, ¿vale? Porque también tener en cuenta, y esto también es importante, a ver, tú, tú, vale, que aparte de que se pueden limitar los contactos, etc., cuando tienes geometrías irregulares, y una esfera en cierto modo lo es, 00:57:25
Puede que haya momentos que se 00:57:50
Digamos, se mueva por física 00:57:54
Alguna de las geometrías 00:57:56
De estos detectores y ya no esté rozando 00:57:57
Pero bueno, veis que 00:57:59
Va lanzando distintos mensajes 00:58:01
Mientras nota que está colisionando 00:58:03
Como las colisiones se entiende que se colisionan 00:58:05
Chocan y no suelen quedarse pegados 00:58:08
Pues no 00:58:10
No funciona tan bien 00:58:11
Pero también se podría hacer 00:58:13
También es verdad que hay ocasiones 00:58:14
Que la gravedad 00:58:17
cuando choca en el rebote 00:58:18
pues ya deja de estar como completamente 00:58:21
alineado, pero bueno, la lógica es esa 00:58:22
y el exit es 00:58:24
lo mismo, pero cuando 00:58:26
deja de colisionar, ¿de acuerdo? 00:58:28
vais a ver que no se lanza mensaje 00:58:31
hasta que lo mueva 00:58:32
y se deja de colisionar, ¿vale? 00:58:37
otro, muevo, ¿vale? 00:58:39
lo veis, ¿no? 00:58:41
esto ya abre, creo, un mundo de posibilidades 00:58:42
¿me seguís hasta aquí? 00:58:45
vale 00:58:53
Bueno, problemas, he contado cosas creo atractivas, problemas que tiene esto o conflictos que puede surgir. Si estamos usando estos colliders que se forman dentro del ámbito de la física, ¿vale? 00:58:54
se puede hacer, pero existirán 00:59:10
problemas si los objetos 00:59:14
los movemos mediante el transform 00:59:16
como sabemos ahora 00:59:17
y queremos que 00:59:18
también reaccionen a las leyes de la física 00:59:20
y a los colliders, ¿esto qué significa? 00:59:23
igual que hemos visto ese problema de que la bola 00:59:25
se posa y en cierto momento deja de detectar 00:59:27
ese contacto 00:59:30
si yo la bola, aunque ahora lo estoy haciendo así 00:59:31
a la brava con el transform, por tanto 00:59:33
me desdigo un poco, puede haber problemas 00:59:35
porque cuando movemos los objetos 00:59:37
mediante el transform pueden no estar, ahora hay una inercia, por eso se está moviendo la bola, 00:59:39
porque empuja y ha mantenido la inercia, ahí es donde el angular drag podría haber detenido la bola, 00:59:45
esto ahora lo vemos, pero digamos que hay que discriminar los objetos que vamos a usar 00:59:50
mediante lógicas de físicas y los que vamos a mover por lógicas de transform. 00:59:55
Para que funcione lo más correctamente posible lo relacionado con las físicas, 01:00:01
como son estas colisiones, lo suyo es 01:00:06
usar métodos físicos 01:00:08
también para aplicar fuerzas al RigidBody 01:00:10
que se muevan los objetos 01:00:12
¿vale? 01:00:13
como va a ser un poco 01:00:15
largo que escriba todo el código 01:00:19
os voy a enseñar, aquí tenía la otra esfera 01:00:21
preparada, y la activo 01:00:23
y ahí está 01:00:26
¿vale? ahí está, es muy parecida 01:00:27
a la que teníamos 01:00:30
y lo único, le he subido un poco la masa 01:00:30
no es un trigger, porque no queremos 01:00:33
Queremos que se comporte de manera física, ¿no? Es decir, que choque, ¿vale? 01:00:35
Y he añadido un script que se llama PlayerManager, que os voy a enseñar ahora mismo, ¿vale? 01:00:40
Este PlayerManager, y vais a ver que la lógica es muy parecida a lo que ya hemos visto en la tarea 2 01:00:45
y a lo que hablamos en la última tarea, en la última tutoría, que es esto del GetComponent, 01:00:50
esencial ahora mismo para poder afectar a este componente de RigidBody, 01:00:57
porque recordad que menos el transform a todos los componentes que queramos acceder tendremos que llegar de alguna forma, ¿vale? 01:01:01
Recordad que esto lo vimos el otro día, pero nada, este es el código, ¿vale? Habrá que hacer este GetComponent del RigidBody del objeto que tiene este script, ¿vale? 01:01:10
fijaos, aquí están creados 01:01:20
dos floats que básicamente en el update 01:01:23
igual que hacéis el otro día, lo que hace es capturar 01:01:27
dos axes que se llaman vertical bola y horizontal bola 01:01:29
estos axes los he creado yo 01:01:34
como ya hemos visto en la anterior tarea 01:01:37
los project settings, input manager 01:01:39
y ahí horizontal bola, horizontal terreno, vertical bola 01:01:42
y vertical terreno, porque 01:01:45
Lo pone en el enunciado, voy a hacer con el WASD y con la cruceta del teclado, que en unos niveles el WASD sea el que mueva la bola y en otros niveles sea la cruceta la que mueva el terreno. 01:01:47
En el primero el terreno está fijo, no se mueve, no va a tener fuerza, pero en los otros dos, si miráis en lo que se pide, pues sí va a hacer que se incline la propia tabla. 01:01:58
Entonces, bueno, lo primero es que para a la bola en este caso, que es la que tiene este script 01:02:12
La que queremos es que mueva el RigidBody, importante porque de primera no es lo más intuitivo 01:02:19
Y de hecho lo han hecho menos intuitivo en esta versión 2022 con respecto a anteriores 01:02:26
Porque en anteriores, si usáis por ejemplo Unity 2020, que por cierto en el tema 6 probablemente 01:02:31
Demos un pasito atrás en el software para simplificar explicaciones 01:02:36
Pero bueno, veréis que los Rigid Bodies tienen un apartado abajo de info que te muestran como las inercias y las fuerzas de velocidad que tienen los elementos, las fuerzas que se le aplican al Rigid Body. 01:02:40
Pero si hay un elemento, si hay un componente, perdonad, que gestiona las fuerzas y por eso hay que asociarlo a ello, es el Rigid Body. 01:02:53
Por eso, lo que vamos a hacer es acceder, mediante este tipo de variable, recordad que aquí poníamos el nombre del componente que tuviera para guardarlo como variable y luego ya lo capturábamos para su uso. 01:03:00
aquí lo vamos a capturar con RB 01:03:15
por ejemplo, luego 01:03:17
podremos acceder a 01:03:19
propiedades de este componente RigidBody 01:03:21
que no están directamente aquí 01:03:23
recogidas, pero sí pertenecen a lo 01:03:25
que está programado dentro de este componente 01:03:27
¿vale? que entre ellas son 01:03:29
y está en el tema, el AddForce y el 01:03:31
AddTorque, bueno aquí he usado una de cada 01:03:33
para que esté el variado de cómo se usa 01:03:35
pero al ser una bola, la fuerza 01:03:37
sirve para lo mismo que 01:03:39
la rotación, porque al final el rotar también 01:03:41
al final se mueve, si fuera un cubo 01:03:43
la fuerza se desplazaría al cubo y la rotación, a menos que le demos mucha, por las esquinas que tiene en los cantos, no giraría. 01:03:45
Pero mirad que en esencia es lo mismo que hacía un holanave para moverlo, solo que estamos usando otros métodos. 01:03:52
Y vamos a analizar esto un poquito más en detalle. 01:03:59
Lo primero es, igual que el otro día en uno de los movimientos, el axi lo guardamos en una variable, eso es lo mismo, lo hacemos en el update. 01:04:04
¿Y por qué en el update? Porque vais a ver que ahora se está digregando en el update y el fix update. Fix update, así dicho rápido, el tiempo de ejecución que habría que usar para métodos que emplean físicas. 01:04:12
A diferencia del update, que en cuanto puede va refrescando y generando más fotogramas para que sea lo más fluido el juego posible, el Fixed Update tiene un tiempo predeterminado, recordad que esto estaba en Edit, Project Settings y en el apartado de Time, que es este que está aquí, que va a decir cada 0,02 segundos, en este caso, va a ejecutar lo que haya dentro del Fixed Update, impepinablemente. 01:04:26
si el ordenador no pudiera 01:04:56
porque bueno, si lo ponemos 01:04:59
muy bajito, pues por mucho que nos empeñemos 01:05:01
el ordenador igual no tiene la capacidad 01:05:02
hay un máximo, digamos, que podemos 01:05:04
marcar antes de que de error 01:05:07
o deje de ejecutarse, o surjan 01:05:09
conflictos, ¿vale? 01:05:11
por cierto, algunos ya habéis tocado el 01:05:13
time.timescale, ¿vale? 01:05:15
y básicamente lo que estaréis cambiando en ese caso es esto 01:05:16
también podéis decir que todo el juego 01:05:19
vaya al doble de velocidad o se detenga 01:05:21
¿vale? que esto se hablaba en el tema anterior 01:05:22
Lo dicho, tiene un tiempo de ejecución fijo, ¿vale? Para que la física, los cálculos físicos que tienen sean estables, ¿vale? 01:05:25
Ahí no es tanto que en cada fotograma vaya cambiando el valor de posición X, tal, tal, en cuanto pueda, sino que aquí tiene que haber cierta coherencia también para que sea estable con este tiempo, ¿no? 01:05:35
Entonces, si os fijáis aquí, y esta lógica es la que también tenéis que ir integrando, es que en el update normalmente lo que vamos a querer es captar las interacciones, porque en cuanto pulsemos una tecla queremos que el sistema ya lo guarde en esa variable, y ya está guardado. 01:05:46
en cuanto toquemos una tecla lo más rápido posible que pueda el ordenador, va a guardar en esta variable las variaciones de input que hagamos. 01:06:05
Y aquí está, guardado como variable global. Y está aquí hasta que se lo pida en la próxima enteración física que haya este FixedUpdate. 01:06:12
Por un lado tenemos la captura, lo que nos interesa que sea lo más rápido, y luego los comportamientos de RigidBody, de física, lo ponemos dentro del FixedUpdate. 01:06:23
Este ejemplo simple es lo que se espera. Todo luego se puede buscar, que sea de otra forma, pero el comportamiento esperable o deseable para hacer inputs que muevan objetos con fuerza física sería así. 01:06:31
capturar el input en el update y luego ejecutarlo en el fix update. Recordad, este addForce sale porque estamos entrando dentro de las propiedades, 01:06:47
en este caso de los métodos que tiene el RigidBody ya programado. Entonces cuando ponemos este rb.addForce, como tantas otras ocasiones, 01:06:59
Al empezar a escribir nos ponemos y nos dice qué argumentos espera dentro de estos paréntesis y cuando abrimos el paréntesis puede tener distintos, cuatro sobrecargas y aquí hay distintas formas de aplicar fuerza. 01:07:09
Lo importante normalmente, y en este, aunque hay cuatro, en realidad son lo mismo, 01:07:27
podemos pasarle un vector 3, igual que hacíamos en el Translate, por ejemplo. 01:07:31
Luego, opcionalmente, es otra sobrecarga, podemos decirlo, el modo de fuerza, 01:07:36
porque se puede añadir que las fuerzas sean más explosivas, 01:07:40
que una sea como que coja, que lo sea con respecto a la masa, 01:07:43
que ya tenga ahí, por ejemplo, al dar un salto, pues no sea una aceleración continua, 01:07:48
sino que respete el peso que tiene ya el objeto, y por eso un salto, un impulso, 01:07:52
pues sería un impulso como tal, ¿vale? Hay distintos, separado de comas, force modes, ¿vale? Y en vez de un vector 3, si queremos pasar también los distintos dimensiones de un vector 3, 01:07:56
en realidad, pues también se puede, disgregando cada uno, ¿vale? Un poco como hacíamos con el translate, el transform translate. Y al añadir fuerza, ¿vale? ¿Qué es lo que vamos a hacer? 01:08:08
Pues poner ese vector que marca la dirección, que normalmente para tener direcciones ya normalizadas, recordad que está este forward, este up, este backwards, este right, left, etc., que es este 0, 0, 1. 01:08:20
mirad la descripción, atajo 01:08:38
para escribir vector 3, 0, 0, 1 01:08:40
¿vale? yo aquí podría decir 01:08:42
en vez de esto, esto ya lo hemos visto 01:08:44
unas veces, pero está bien siempre recordarlo 01:08:46
que ese vector forward 01:08:48
sería lo mismo que hacer esto 01:08:50
¿vale? estábamos diciendo 01:08:51
que la fuerza se añada 01:08:54
en profundidad, es decir, 0 y 0 01:08:55
no se añade ninguna fuerza, pero en z 01:08:58
se añade 1, es decir, hacia el fondo 01:08:59
¿no? y luego, aparte 01:09:02
este 1, esta fuerza 01:09:04
que se está dando, será más 01:09:06
o menos intensa dependiendo del axis. Si tenemos un teclado será muy intensa, porque es pulsar una tecla y pasa de 0 a 1 directamente, 01:09:08
a no ser que cambiemos, si recordáis en el Input Manager, la gravedad, la sensibilidad, etc. ¿Os acordáis? 01:09:15
Y aparte, con fuerza, que es otro parámetro que podemos nosotros ir ajustando, lo multiplicamos para ajustarlo por la fuerza que nos interese. 01:09:22
Digamos que esto es lo que marca la dirección, esto es lo que marca la influencia del input, 01:09:31
y luego hay un multiplicador siempre que hacemos para, oye, esta fuerza es baja, pues vamos a multiplicarla por más. 01:09:37
En vez de poner aquí la fuerza se podría decir, vale, pues que esto sea 60. 01:09:45
Pero bueno, es más fácil tener un valor independiente que además se puede usar a lo mejor en más elementos 01:09:49
que también tengan necesidad de establecer una fuerza, y se pone así y ya multiplica este vector normalizado, ¿vale? 01:09:54
Y el at-torque es un poco lo mismo. Es con respecto a ese eje y pone forward, ¿vale? Porque lo hace con respecto al eje. 01:10:02
Por tanto, si yo, fijaos en el guismo general del mundo, si yo lo que quiero es que la bola rote a izquierda o a derecha, ¿vale? 01:10:11
Lo que quiero es que rote con respecto al forward, ¿no? Que es la profundidad. Si rota en base a ese z, irá izquierda o derecha. Por eso, paradójicamente, este vector no es lo mismo en el add force que en el add torque. De hecho, están invertidos realmente, ¿vale? 01:10:19
Y luego, bueno, este menos sirve para si la dirección del giro no va en la dirección que queremos, siempre lo podemos invertir, porque esto al final lo que hará es que ese 1 sea un menos 1 en el vector. 01:10:36
¿Sí? Básicamente ahora si yo guardo este código que lo tiene aplicada la esfera y voy al juego y voy aquí y clico en Game y doy adelante y atrás, fijaos que la bola ya empieza a tener ciertas inercias. 01:10:47
se mueve de izquierda a derecha 01:11:07
¿vale? 01:11:09
Importante, esto no sé si lo habréis notado ya 01:11:11
pero 01:11:13
para que las interacciones las capte 01:11:14
tenéis que clicar en Game 01:11:17
¿vale? Aunque luego 01:11:19
y estar en Game y dais a las interacciones 01:11:21
yo al WASP ahora mismo, que es como está configurado 01:11:23
¿vale? Pero eso no quita que luego 01:11:25
podáis seleccionar 01:11:27
en el Scene y arrastrarlo 01:11:28
ponerlo en otro sitio y clicar otra vez 01:11:31
al Game y que vuelva a capturar 01:11:33
las interacciones ¿vale? 01:11:35
Si os fijáis, los he puesto públicos, o serializados, no lo sé, para que se vea la interacción, el axis, como estoy dando a las teclas, de 0 a 1 o de 0 a menos 1. Esos valores intermedios son la gravedad y la sensibilidad que hablamos el otro día. Y eso ya tiene influencia en cómo aplica fuerzas. 01:11:37
Entonces, bueno, pues 01:11:54
Este es el comportamiento para mover la bola 01:11:58
Y en el siguiente 01:12:00
Niveles 01:12:02
Voy a los siguientes niveles 01:12:03
Para 01:12:05
Voy a una de las escenas que ya tengo guardado 01:12:06
En este lo que voy a hacer es 01:12:10
Con la otra cruceta 01:12:12
Porque lo he configurado así 01:12:13
En el input manager 01:12:15
Se va a ir moviendo, no la bola 01:12:17
Sino la 01:12:19
Plataforma, es decir, ahora mismo 01:12:21
La plataforma, la tengo aquí, es el que tiene este terreno move, el que mueve el terreno. 01:12:23
Entonces, si me meto en ese objeto, en ese código, vais a ver que al final es un poco lo mismo. 01:12:29
Tengo el moveH, el moveR, me meto en el... 01:12:38
Bueno, recordad el otro día que podía hacer esto de GetComponent o arrastrar, si es serializado, 01:12:43
y vais a ver, arrastrar el objeto para que coja el RigidBody de en sí mismo, en este caso, ¿vale? 01:12:48
En realidad está cogiendo a sí mismo, ¿vale? Que es la otra forma de llegar a ello, ¿vale? 01:12:54
Pues tengo esta fuerza, en el update cojo el axis, lo he configurado en este caso en vez de bola, se llama terreno, 01:12:58
son otras teclas las que he indicado y añade un torque en este caso, ¿vale? 01:13:06
Porque no quiero que sea una fuerza de desplazamiento, sino que gire con respecto al centro de su gravedad, ¿vale? 01:13:10
Que es el centro de la tabla en sí, pues hacia derecha, hacia la izquierda, multiplicándose por los valores que esté capturando y por el valor de torque que hayamos establecido. 01:13:15
Torque, que es igual que speed o fuerza o lo que queramos, una convención o una variable que creamos para multiplicar por ese valor. 01:13:24
Que puede ser, pues si nos parece que está lento, pues subimos aquí, podemos 10 y se aplicará mayor torque a esta tabla, ¿vale? 01:13:31
En realidad el código, ahora me preguntan cómo se cambia el color de fondo de la pantalla de game. Creo que eso lo pone en el enunciado, si no me equivoco. Os lo digo por si lo tenéis, por que lo sepáis. 01:13:39
aquí, si quieres que el fondo 01:13:58
de la escena sea un color plano puedes hacerlo seleccionando 01:14:01
la cámara, en el inspector de la cámara 01:14:03
indica en su opción clear flags que es 01:14:05
un solid color y a continuación elige el color de fondo 01:14:07
¿vale? vamos a ser obedientes 01:14:09
me voy al otro nivel para que partamos 01:14:11
de lo que suele suceder 01:14:13
y me dice si me meto en la cámara 01:14:15
hay una opción que se llama clear flags 01:14:17
solid color y yo aquí 01:14:19
le digo que sea verde, ahí está 01:14:21
¿vale? lo pone en la tarea 01:14:23
¿vale? básicamente porque por defecto 01:14:24
Ya veremos esto también en siguientes temas. Se crea un cielo, que también es manipulable, que son estos skybox. Si queremos que lo que no sea una geometría o un elemento físico o visual de nuestra escena, no se fabrique este cielo, este HDR de cielo, sino un color sólido. 01:14:27
¿Vale? Bien, hasta aquí me seguiré, ¿verdad? Vale, espero que sí. Siguientes cosas. Ya os digo, os estoy intentando desgranar todo, no voy a hablar de todo lo que pone en el enunciado, que es lo que os deje leer e intentar interpretar también. 01:14:47
Vamos a ver alguna cosilla más sobre lo que me importa. Hay dos cosas que me importan y a las 7 y 10 como tarde tenemos que acabar porque Alejandro necesita dar otro módulo. 01:15:05
A ver cómo lo jerarquizo, vale, vamos a hablar de cómo, vale, ya tengo la bola aquí, vale, y fijaos, bueno, la cámara, voy a ajustarla, aquí habría que hacer, si nos interesa un seguimiento de cámara, igual que hicimos el otro día, con la tarea me refiero y voy a hacer que aún así no se va a ir moviendo con la cámara, que eso se haría con un script que siga a la bola, por ejemplo, vale, 01:15:20
O al tablero cuando gire a los otros niveles. Lo voy a dejar ahí para que se vea mejor. 01:15:53
Vale, entonces muevo aquí la bola y voy al agujero y no sigue para adelante. 01:15:58
¿Por qué será? Alguien me lo sabría decir así rápido. 01:16:06
Porque aunque voy para atrás y voy para adelante y ahí de pronto se queda anclado. 01:16:10
¿Por qué pensáis que es? Es un error. 01:16:15
efectivamente, recordáis que 01:16:17
teníamos un cubo aquí puesto 01:16:22
que no es un trigger, si fuera un trigger 01:16:24
si lo dejaría pasar, si ponemos 01:16:26
un trigger en ese código, pues haría 01:16:28
algo, ¿vale? de momento 01:16:30
esto no lo quiero, de hecho 01:16:32
me voy a cargar, bueno, no lo voy a cargar porque 01:16:34
igual luego me sirve para explicar lo de la meta 01:16:36
pero bueno, lo desconecto 01:16:38
el collider y ahora ya sí 01:16:40
seguimos, intento llegar al agujero 01:16:41
al agujero, al agujero 01:16:44
y me pongo ahí y 01:16:45
anda, que no se mete 01:16:47
Lo que habíamos hablado. Esto sucede porque tenemos puesto un Bosch Collider que está haciendo una forma básica de Collider. Por tanto, este Collider para este caso no sirve. 01:16:49
Si hubiera creado esta plataforma por defecto con un cubo, no tendría ese agujero y tendría este Bosch Collider. Pero es que, claro, estamos buscando algo que es un poquito más complicado. 01:17:02
Y el FBX que hemos metido de estos, cuando lo arrastramos, si clicamos, tampoco viene con este Mesh Collider. Hay que añadirlo, ¿vale? Importante. Son muchas las cosas que vamos viendo y voy saltando una a otra, pero espero que me vayáis siguiendo bien. 01:17:11
Hay otra sección que lo pone en el enunciado sobre cuando importamos FBX dentro de Unity al dar al GameObject en general, esto que está si no desgregamos los elementos que hay dentro del FBX, hay varias secciones que ya iremos viendo que aquí hay tela para cortar. 01:17:32
Pero hay una que nos interesa ahora mismo y está también hecha a propósito, que es el de las medidas de los objetos. Porque imaginaos, este objeto lo hemos hecho en Maya, lo hemos hecho en Blender, lo hemos hecho en otro software de modelado y imagino que también ya habréis tocado un poco de esto. 01:17:52
pero cada software luego tiene sus propias convenciones de medidas, incluso cuáles son los ejes de dirección del guimón del mundo. 01:18:09
Si habéis usado Blender, el X, Z e Y no están en las mismas direcciones que, por ejemplo, en Maya, ¿vale? 01:18:18
Y la Z en Blender es, si no me equivoco, la vertical y Y es la horizontal. 01:18:24
Entonces eso, según el software, pues puede generar bastantes conflictos, ¿vale? 01:18:30
Igual pasa con las medidas. Si trabajáis en malla, y para eso está este parámetro de aquí, ¿vale? Esta casilla, solo vamos a tocar el inspector de los modelos FBX, ahora mismo solo vamos a tocar lo relacionado con el modelo, porque ni estamos rigueando, ni animando, ni ahora mismo usando materiales, ¿vale? Ya os digo, ya lo veremos. 01:18:34
Si nos metemos en el modelo, lo primero que salen son dos parámetros muy interesantes. El primero, ya lo he cambiado, cuando lo metáis por defecto va a estar con el 1, de hecho, mirad, lo voy a meter igual que estaba, para que lo veáis in situ, y dame un segundillo que lo tengo por aquí, ¿vale? 01:18:55
A ver, aquí, estos son los tres elementos, los voy a arrastrar a ver si me lo admite, otra vez, duplicados, los he duplicado, luego los voy a borrar, pero según meto un nuevo FBX va a venir con su escala de factor 1, es decir, el valor por defecto que tenga de ese modelo, de ese software, ¿vale? 01:19:15
Y luego está el de conversión de unidades, y dice que un centímetro del archivo valga 0,01 metros de Unity, ¿vale? Porque no es lo mismo un software que dice que la unidad es un centímetro, que Unity, si recordáis, que el 1 en la escala, en Transform, cuando cambiamos, 1 significa un metro, ¿vale? 01:19:39
Entonces, digamos que hay una variación de 100. 01:19:59
Si meto aquí, por ejemplo, este collider, la geometría sin haberla adaptado, 01:20:02
que es lo que he hecho yo para que mida lo mismo, vais a ver que es enana. 01:20:09
Ahora mismo solo mide un metro. 01:20:13
Recordad que esta cuadrícula es solo un metro y es esto lo que mide. 01:20:16
Podríamos nosotros hacer la bola aún más pequeña y meterla ahí, etc. 01:20:19
Pero hay algo importante y por lo que cuando modeléis, 01:20:23
Si hacéis objetos para un videojuego, modeléis teniendo en cuenta las unidades reales de los objetos, que es que ahora estamos en el mundo de las físicas, y en las físicas influye el tamaño de los objetos, igual que influye también la iluminación, influye las partículas, ¿vale? 01:20:26
Entonces, aunque aquí ahora intentemos hacer todo a medida, si esto mide solo un metro, esta tabla de madera sería el juego para un roedor, porque sería muy pequeña, ¿vale? Entonces, ¿qué es lo que habría que hacer? Hombre, podríamos hacer que la escala aumente y lo aumentamos y lo damos por 10, que es precisamente, creo, la conversión que he hecho, etc. 01:20:42
El problema de tocar las escalas, aparte de que ya deja de estar normalizado en uno y estáis usando otros valores, que a veces ya es un fastidio, es que en ciertos momentos, cuando uséis animaciones basadas en rigs, con esqueletos, etc., tocar mucho lo que son las escalas, la escala en sí no suele tener problema, 01:21:05
pero factores como la escala o las conversiones de unidades pueden traer conflictos de que se deformen esos rigs o nuevamente la influencia de los tamaños alteren lo esperable en esos rigs, ¿vale? 01:21:26
Pero si, por ejemplo, venimos de un software que sabemos que tiene como unidad convencional el 1 basado en centímetros como magnitud en vez del 1 basado en metros como es Unity, 01:21:39
Y solo al desmarcar esta casilla, lo que va a hacer es que va a haber una diferencia de 100 del tamaño. 01:21:48
Esto significa que yo... 01:21:56
Ah, perdón. 01:21:58
Cuando hagáis cualquier cambio en una de estas pestañas, tenéis que bajar y darle a aplicar. 01:21:58
Importante. 01:22:03
Y veis que ahora, de pronto, ese elemento se ha hecho mucho más grande. 01:22:04
¿Por qué? 01:22:09
Porque ha aumentado de tamaño. 01:22:10
Ahora mide, si nos acercamos, vemos que cada cuadrícula, cada cuadradito de estos pequeños es un metro. 01:22:11
ahora medirá del orden de 100 metros, lo cual probablemente también sea muy grande. 01:22:18
Esto es un poco, cuando me entreguéis la tarea, bueno, yo voy a querer que funcione bien, 01:22:23
que lo pongáis de 100 metros o de 1, bueno, va a influiros en los valores que vais a tener que dar, 01:22:28
en la masa, en las fuerzas, etc. Pero podéis resolverla con distintos tamaños. 01:22:33
Pero me interesa esto para que conozcáis que las medidas influyen en el resultado. 01:22:37
Y luego, esto lo he hecho aquí ya, digamos, que 100 me parecía mucho, puedo hacer este factor de escala y cuando digo, este que estoy arrastrando aquí, a ver, este que tengo aquí, digo, se ha pasado mucho, digo, quiero que lo corrija por 0,1. 01:22:45
Le doy a aplicar y lo hace del tamaño que era. Es decir, según he dado a la casilla y desmarcado, era 100 veces más grande de lo que venía por defecto cuando lo hemos visto que era como una tabla de roedor. 01:23:02
Cuando he dicho eso, podemos reajustar con ese factor de escala esta conversión. Fijaos que la variación entre dar a esta casilla y desmarcarla es que pasa de 1 cm a 0,01 m, es decir, hay 100 unidades de diferencia. 01:23:17
Por eso pasa de 1 a 100 y con esto pasaría a 10. Lo dicho, esto del Scale Factor solo lo usaría en caso de que no sea un elemento con armadura o que tenga animaciones en sí. 01:23:32
En este caso, como todas las animaciones que vamos a hacer, es porque estamos influyendo nosotros en la malla por fuerzas, etc. 01:23:47
Nos da un poco igual, pero en caso de que haya un esqueleto, como veremos, es mejor tocar la escala 01:23:54
o lo preferible desde luego es tenerlo ya en las medidas que nos interesen desde el modelo 3D. 01:24:00
Aunque imaginaos que jugáis al Super Mario, tenéis el modelo a una medida y de pronto queréis con ese esqueleto que sea más grande. 01:24:10
Pues lo que haríamos es aumentar la escala, ¿vale? Pero, bueno, son situaciones diferentes y es sobre todo por evitar conflictos. Por poder se puede hacer todo, pero por evitar problemas que puedan surgir. 01:24:15
A ver, un segundillo, si me habéis escrito algo. Vale, de momento espero que me sigáis, ¿vale? Y, bueno, me cargo esta plataforma y voy a ir para atrás para cargarme todas las que incluí, que no quiero tener aquí cosas duplicadas. 01:24:26
bueno, a ver si quiere 01:24:43
como he explicado tantas 01:24:48
a ver 01:24:50
fbx, nada 01:24:52
bueno, voy a ir al final porque al final 01:24:54
estoy dando a control z y control y, ¿vale? 01:24:56
para deshacer, bueno, me voy a cargar 01:25:00
estos que he añadido después 01:25:02
lo porro y me quedo con los que había importado, ¿vale? 01:25:04
que están ajustados 01:25:06
para que veáis, en todos quité esto de 01:25:07
convertir unidades y en este quería 01:25:10
que la tabla del nivel 2 fuera un poco más grande 01:25:12
pues le di un poquito más de Scale Factor. 01:25:14
Vale, bueno, y este me lo he cargado. 01:25:18
Vale, ¿qué tenemos que conseguir con y por qué? 01:25:20
Además en el terreno 1, en el 2 vais a ver que esto no sucede. 01:25:24
Lo que os había dicho de que tenemos por un lado el terreno 1 con la malla suavizada 01:25:27
para que se vean los bordes definidos, básicamente la que queremos usar a nivel visual 01:25:31
y luego tenemos la que tiene el Collider versión resumida, 01:25:37
Es decir, con pocos vértices para que no sobrecargue el ordenador o directamente el collider no funcione por esta sobrecarga o haga una reducción que considere y por tanto nos cargamos un poco el objetivo de intentar tener este agujero ahí accesible, ¿vale? 01:25:41
Vale, pues voy a borrar esta, ¿vale? Y empezamos. Digo, yo quiero que la malla, el GameObject de la malla, sea este que tengo aquí, y lo incluyo. Yo tengo aquí la malla, que ojo yo, además, como quiero que la profundidad en Z sea hacia donde va la bola, pues voy a coger y le voy a dar una rotación de 180, ¿vale? Para que esté en el horizonte el agujero y no aquí. 01:25:57
Simplemente por tener en cuenta que el horizonte, por convención, es hacia donde mira este Z. 01:26:22
¿Qué sucede ahora? Si os fijáis, tenemos el GameObject, que trae el FB, que es como conjunto, 01:26:29
y luego lo que es el hijo, que es el GameObject que tenemos aquí. 01:26:35
Realmente, si os fijáis, este primero que tenemos aquí no sirve para nada, 01:26:41
excepto para ser cápsula de lo segundo. 01:26:45
Por tanto, yo podría coger, desempaquetar, me voy al padre, el prefab, desempaqueto y digo, ala, lo saco de hijo y fuera. Dejo el terreno 1 que es el que hace que se visualice porque tiene el mesh renderer con la geometría y la malla de visualización, el mesh filter. 01:26:47
pero a esto le falta otra cosa 01:27:06
le falta, porque si ahora doy play 01:27:08
como no hay ningún collider, nada que detenga 01:27:10
la bola, veis que se hunde y 01:27:12
cae para abajo 01:27:14
¿qué es lo que voy a añadir? pues un collider 01:27:15
como hemos dicho un boss collider sería 01:27:18
lo más eficiente a nivel de cálculo 01:27:20
pero no nos va a permitir meter ese 01:27:22
agujero o lo que sea 01:27:24
que la forma que tenga una malla 01:27:26
¿vale? si voy a 01:27:28
no, el collider no, ese es para ruedas 01:27:30
ese es aún más avanzado 01:27:32
Sería el mes de malla, mes collider, ahí está 01:27:34
Cuando son collider los iconitos vais a ver que son verdes 01:27:37
¿Vale? ¿Y qué puedo hacer con eso? 01:27:41
Tiene un apartadito aquí de la malla que va a usar para hacer ese mes 01:27:43
Que es en la que podemos arrastrar esta que tenemos aquí reducida 01:27:48
Entonces yo puedo decir que este es el terreno 01:27:53
Y aquí cojo la malla, ¿vale? 01:27:55
No el GameObject en sí, sino la malla 01:27:57
Y además, fijaos, como siempre sucede, que aquí está pidiendo un iconito que se corresponde luego con los iconitos de lo que es compatible y lo que no. 01:28:00
Si yo arrastro esta malla, vais a ver que ahora tengo en un mismo objeto lo visual y el collider. 01:28:09
Y el collider es la versión simplificada que vimos. 01:28:16
Veis que tiene este agujero, pero no es el que tiene tanta geometría como este que teníamos aquí. 01:28:18
¿Vale? Es este. 01:28:27
Vale, con esto ya hemos conseguido, pues, que la bola, este objetivo que teníamos de que cuando la bola llega al agujero, voy a coger el terreno para que veáis, vale, sí que se va a meter porque cabe en el agujero y lo está respetando. 01:28:27
Y ahí se ha quedado, ¿eh? Ahí está la bola, ahí se ha quedado. Ya podéis hacer un juego de golf, ¿vale? ¿Por qué no pasa más? Pues porque nuevamente ahí hay un límite de esta malla. Y ojo, esto nuevamente en el Mesh Collider puede venir, ahora vemos algo más, la opción de que permita ser trigger o no. 01:28:45
Como no queremos que atraviese ningún caso, esto nunca va a ser trigger, ¿vale? No lo marcamos. Pero ojo, el otro objetivo es lo que habíamos dicho, queremos que haya un detector aquí de que, ¿vale? Y veis que ya tengo aquí preparadito este cubo, que ahora mismo es muy grande, 0,1, 0,1, y voy a hacerlo pequeño, 0,1, 0,1, ¿vale? 01:29:05
Lo estoy haciendo con el propio Bosch Collider, los tamaños, etc. También, les hago un segundo, se puede hacer con la escala, ¿vale? Nuevamente, si se puede hacer algo con el propio componente, lo haría antes que con la escala, ¿vale? Y también se queda con ese tamaño. 01:29:27
Voy a activarlo para que esté 01:29:44
¿Vale? Y entonces, bueno, voy a ponerlo 01:29:46
Como a mí me gusta, que es 01:29:49
Oye, pues si es un Boss Collider, en vez de cambiar 01:29:50
Toda la proporción del GameObject 01:29:53
Vamos a hacerlo con 01:29:55
Esta 01:29:56
Con las medidas del propio 01:29:59
Collider. Entonces, ojo, ahora lo que vamos a hacer 01:30:02
Es poner aquí, podría ser incluso más pequeño 01:30:04
Lo importante es que haya algún momento 01:30:06
Que la bola lo atraviese 01:30:08
No queremos que sea un impedimento 01:30:10
Y por eso va a ser un trigger 01:30:12
marcado ahí, ahora va a detectar 01:30:14
los onTriggers 01:30:16
y lo dejamos ahí para que en cuanto la bola 01:30:17
pase por ahí, pues diga 01:30:20
eh, cambia de nivel, o eh, lanza el mensaje 01:30:22
o eh, lo que sea 01:30:24
importante, y lo he 01:30:25
dejado caer antes, si esto 01:30:30
lo hiciéramos más grande 01:30:32
en plan, bueno, el cubo lo meto ahí 01:30:34
y que sea así de grande, ten en cuenta 01:30:36
que esto estaría en todo momento tocando 01:30:38
la malla del padre, ¿vale? 01:30:40
entonces hay que ajustarlo 01:30:42
bien de tamaño, a menos del momento que no estamos haciendo nada para discriminar, ¿vale? 01:30:44
Entonces, si no me equivoco y si no lo vuelvo a recrear, este trigger que tenemos aquí 01:30:50
preparado, cuando, vuelvo a poner aquí el código, cuando, ahora no es un on collision 01:30:56
sino que queremos usar el on trigger, ¿vale? Y el on trigger enter, solo una vez cuando 01:31:02
entre, ¿vale? Cuando entre en ese cubito, se lanza impacto que es trigger activado, 01:31:07
simplemente un mensaje de control 01:31:12
con debug log, ahora vamos a ver 01:31:14
que ya con esto 01:31:16
voy a jugar a la partida 01:31:17
aquí, fijaos que tengo 01:31:19
la escena preparada para ver como se mete ahí 01:31:22
pongo el sucesos collider 01:31:24
voy a game, empieza a mover 01:31:26
la pelota, se irá 01:31:28
acercando por esta parte, la vais a ver 01:31:30
le estoy dando fuerza 01:31:32
fuerza, paro ahí 01:31:34
voy a abrir la consola 01:31:35
para que veáis que en cuanto toque ese 01:31:37
trigger 01:31:39
trigger activado 01:31:40
aquí hemos puesto trigger activado 01:31:44
en este método que hemos creado de impacto 01:31:46
o meta o como lo llamemos 01:31:47
pero aquí podríamos decir 01:31:49
que explote el juego, que la tabla 01:31:51
cambie de color, que pasemos de nivel 01:31:54
que es lo que nos interesa, etc 01:31:56
lo mismo sucederá 01:31:58
si creamos otro trigger 01:32:00
como este, lo hacemos muy grande 01:32:02
y lo ponemos debajo 01:32:04
que cuando la bola se caiga por un lado 01:32:05
y toque ese trigger, también podemos decir 01:32:07
reinicia el nivel, destruyete 01:32:10
haz lo que sea, ¿vale? eso ya 01:32:12
sabemos crear entis 01:32:14
objetos con sus colliders y 01:32:15
que capte posiciones 01:32:17
o colisiones 01:32:20
de objetos que tocan con objetos 01:32:21
¿vale? 01:32:23
¿qué tal hasta aquí? 01:32:26
dame 01:32:29
10 segundos que hablo mucho 01:32:30
y me hago bien 01:32:31
vamos, me quedo sin aire 01:32:34
¿qué tal hasta aquí? ¿bien? 01:32:34
bueno, no sé si no me contestáis 01:32:45
en otro lado, denso pero bien 01:32:46
vale, lo que me importa es que lo entendáis 01:32:49
y luego poco a poco 01:32:50
os pongáis a irlo haciendo 01:32:52
el aprendizaje es ese 01:32:54
no hay otra forma, por mucho que os hable 01:32:57
hasta que no os pongáis a hacerlo vosotros 01:32:58
y me da un poco de rabia 01:33:00
casi, bueno, como explicación está bien 01:33:02
pero me da un poco de rabia que no lo intentéis hacer de primeras 01:33:04
leyendo el enunciado 01:33:07
porque ahí es cuando más os vais a pegar 01:33:08
mejor que si estáis siguiendo el paso a paso 01:33:09
que estoy un poco haciendo ahora 01:33:11
pero bueno, hay que hacer un mix de todo 01:33:13
Bueno, entiendo que lo importante y lo que me importa es que estéis entendiendo, más que que me estéis copiando para entregar la tarea y listo, ¿vale? Bueno, vamos a ello. 01:33:15
Voy a hablar de algo que se profundiza más en la unidad 4, pero que está esbozado aquí en el enunciado de la tarea 3, que es lo de cambiar de nivel. 01:33:27
Voy a decir que ese onTrigger que ya está en el cubillo este que he puesto dentro del agujero, pues que sirva para cambiar de nivel. 01:33:44
Simplemente cambia el nombre, ahora lo importante es lo que hay adentro. 01:33:56
Como no va a ser un collisionEnter me lo cargo porque quiero que sea en base a onTrigger y aquí estoy haciendo esto. 01:33:58
Importante, importantísimo, porque no es solo para este momento. 01:34:04
Muchas veces hay operaciones, funciones, propiedades que tienen que ver de librerías o de capacidades que no hemos incluido en este script. Y esta va a ser una. Cuando hagamos gestión de escenas, es decir, para poder cambiar entre niveles, para ir navegando o activando distintos niveles o escenas, mejor dicho, yo identifico mucho escenas con niveles, pero son escenas en sí, 01:34:06
Hay que cargar otra librería que es UnityEngine.SceneManagement. Así se llama. Hay que aprendérselo. Habrá otros que iremos viendo que son importantes. Esto es esencial porque si no de pronto os ponéis a escribir, ponéis cosas que luego no existen. 01:34:32
Me voy a abrir yo aquí mi chuletilla un segundo para ir más rápido y no tener que pensar tanto. 01:34:55
Y si eso ahora lo enseño. 01:35:02
Pero prefiero explicaros primero un par de cosas. 01:35:04
Cuando incluimos esta línea de código va a haber una clase importante que es esta que se llama SceneManager. 01:35:07
Que existe aquí para poner bastantes cosas, bastantes métodos. 01:35:14
Uno de ellos es el de cargar escena. 01:35:21
Vale, y aquí vamos a poner 1. Bueno, veis que no da fallo, ¿vale? Si yo esta línea no la hubiera incorporado, da fallo, ¿vale? Por eso es importante esto de las librerías. Cuando vayamos a hacer algo de gestión de escenas, significa que habrá que usar, habrá que incluir en este script la librería relacionada con el Scene Management, ¿vale? 01:35:22
¿Cómo hacemos esto de la gestión de escenas? 01:35:45
Hay, volveremos también en el futuro 01:35:49
Un menú esencial 01:35:51
Para cuando acabemos el juego 01:35:53
Y poder compilarlo, es decir, sacar el ejecutable del juego 01:35:54
Que es este file 01:35:57
Aquí 01:35:59
Build settings, ¿vale? 01:36:01
Si nos metemos en esta opción 01:36:03
Nos abre otra ventanita 01:36:05
Que, ya os digo, esto es más avanzada 01:36:06
Lo veremos sobre todo en el último tema 01:36:09
Ciertas cosas de aquí 01:36:11
Podremos sacar nuestro juego para 01:36:12
Para ordenador, para Android, para web, para PlayStation 4, varias plataformas. Eso nos hará, tendremos que ir configurando historias, pero lo importante es que todos los niveles que vaya a tener nuestro juego hay que incluirlos en este build de escenas. 01:36:14
Y cuando decimos build escenas es de un proyecto. Yo ahora, si os fijáis, estoy creando aquí más escenas, pero el proyecto solo va a tener un gestor de build settings, así, digamos, hecho por defecto a través de un menú. 01:36:30
Entonces aquí lo que tendremos que ir haciendo es ir arrastrando las distintas escenas que va a tener nuestro juego. Podemos añadir, cambiar de orden y aquí a la derecha veréis también que tenemos nivel 1, nivel 2, nivel 3, nivel 4, son estas cuatro y al irlas incluyendo tendrán un índice que empezarán, ya hablamos de esto también cuando hablamos de los arrays, empezarán por el número 0. 01:36:45
La primera escena que, al menos que estipulemos algo diferente, la primera escena que se ejecutará cuando lancemos el juego será esta del índice 0, que se llama level 1, pero en realidad esto de level 1 es porque aquí lo hemos llamado level 1. 01:37:09
Si esto se llamara como tutoría, aquí cuando la arrastro y la pongo aquí la primerita, pues es tutoría. Esto de Level 1 es la convención que yo he usado. Para que el Scene Manager pueda usar o pueda llamar a distintos niveles, tienen que estar incluidos en este Scenes en Build. 01:37:23
aquí cuando demos estos botones será cuando creemos 01:37:42
es ejecutable, pero de momento 01:37:45
solo nos interesa esta sección 01:37:47
para incluir los niveles que vamos a ir usando 01:37:48
¿vale? ahí están preparados 01:37:51
lo he puesto en orden 01:37:53
con los índices, pero vamos a ver que eso tampoco 01:37:55
es muy importante, más allá del primero 01:37:57
que es el que arranca el juego 01:37:59
¿vale? entonces 01:38:00
yo estoy en el nivel 1 y le doy a play 01:38:02
bueno, o tutoría 01:38:05
¿vale? y cuando acabe tutoría 01:38:07
quiero ir a level 2 01:38:09
Para eso, lo que podemos hacer es que cuando suceda cierta cosa, vamos a usar el SceneManager y su método LoadScene para decirle aquí cuál es el número de índice de la escena a la que tiene que ir cuando llegue ese punto. 01:38:10
¿Vale? Si yo quiero ir al nivel 2, realmente tendré que darle el índice 1, ¿no? ¿Vale? Pues vamos a mi nivel, que es este, y vamos a ir a sucesos collider, que es el objeto que cuando, vuelvo a abrirlo aquí, sucesos collider, ¿por qué no me lo abres? ¿Dónde lo tengo? Tengo ya aquí un montón de cosas. 01:38:34
aquí. Cuando el sucesos collider detecte ese trigger, llega aquí y dice, vale, estoy 01:38:54
a tu disposición. ¿Qué hago cuando entra esa bola? Pues vamos a decir que el scene 01:39:00
manager, igual, manager, load scene, cargue la escena de índice 1, ¿vale? Porque sabemos 01:39:04
que esta es la escena a la que queremos ir. Entonces, ya de una forma muy rápida, me 01:39:14
vuelvo a poner para que veamos cómo llega la bola, me muevo, me muevo, me muevo y ta ta ta ta ta ta ta y 01:39:22
cuando se meta, ala, ya hemos pasado al nivel 2 y ahora estoy, fijaos aquí, en el nivel 2 y ya pues 01:39:30
tengo el juego del nivel 2, es este de que muevo la plataforma y la bola gira en base, vamos, se adquiere 01:39:36
la inercia en base a él, ¿vale? Esta es la forma rápida para esta tarea de ir incorporando, no dejan 01:39:43
de ser números, lo que ponemos aquí, esta forma de cargar 01:39:50
la escena, las hay más, ya veremos algunas, pero yo aquí puedo decir que esto sea un int 01:39:54
son números enteros, que se llame númeroNivel 01:39:58
¿vale? Creo aquí una variable y es la que uso aquí 01:40:02
númeroNivel, ¿vale? Entonces 01:40:06
yo por ejemplo esto puedo hacerlo serializado 01:40:12
o público y decirle, guardo, voy y decirle 01:40:16
Aquí, en el propio inspector, que el número del nivel al que vaya sea el 4 o al 3, 4 creo que no había, o al 0, y cargará el primero que había en el build settings. 01:40:22
¿Vale? Y entonces de esa forma podemos decir hacia qué nivel tiene que ir. 01:40:32
Y ha cargado el nivel 1, que es el mismo, pero el otro que tenía preparado, ¿vale? A cambio de escena. 01:40:37
Esta es la forma rápida, porque, y os voy a abrir el que yo tengo preparado en esta que hay aquí, bastante más avanzada, es la que tengo en el nivel que yo ya tenía creado para que detecte que la bola ha llegado al trigger de la meta. 01:40:41
Aquí lo que hacemos, bueno, es un poquillo diferente, pero es básicamente que si, bueno, he creado un número que es la escena para ir, que es lo mismo que os acabo de decir, pero he hecho otra cosa que es poner en empleo la variable que se genera como argumento del onTrigger o del onCollision. 01:40:58
¿qué significa esto? y la forma rápida de entenderlo es esto 01:41:21
si voy a un collision me pasará lo mismo 01:41:24
solo que en vez de poner other pone collision 01:41:26
pero tenemos que entender que esta variable 01:41:28
si luego en el interior de este método 01:41:31
la nombramos, la apelamos a ella 01:41:33
estamos accediendo a información 01:41:36
del objeto que está colisionando contigo 01:41:39
o está metiéndose en tu trigger 01:41:43
es decir, con el otro 01:41:44
si este es el cubo que detecta la meta 01:41:45
gracias a este other vamos a poder decir 01:41:48
oye, pero el otro objeto se llama de tal forma o no, porque si no, con este if no pasa esto. 01:41:50
Cada vez que yo ponga other, aquí dentro, other, y pongo punto, van a salir propiedades que se pueden usar, 01:42:00
como por ejemplo el nombre de ese otro objeto, el tag, que son etiquetas que vamos a poder, 01:42:09
esto también lo veremos en el tema 5, el tag que podemos ir añadiendo para ir discriminando. 01:42:15
Lo que he dicho antes, si ponemos un cubo que está tocando en todo momento el collider de la tabla, en todo momento está el trigger lanzándose o hay un momento ya que se ha lanzado. Pero gracias a esto podemos ir discriminando. 01:42:20
Oye, si el nombre del GameObject del otro, del que está tocando, el nombre es bola, ¿vale? Hay que meterlo como string y efectivamente en el nivel que tengo aquí tengo este objeto que es bola, que es la bola, ¿vale? 01:42:33
si es ese objeto que se llama bola 01:42:50
el que me está tocando 01:42:53
pues hago este cambio de escena 01:42:54
vale 01:42:56
si se llama cualquier otra 01:42:58
cosa de la jerarquía, si es cualquier otro 01:43:01
del objeto que está tocando 01:43:03
pues no, se está activando, así que se están 01:43:04
digamos confluyendo, que hasta que no hay 01:43:06
esta entrada en el trigger 01:43:09
no se ejecuta lo de dentro, pero es que aunque haya 01:43:09
algo que lo toque, podemos discriminar 01:43:12
qué es eso que toca, vale 01:43:14
y fijaos que aquí 01:43:16
tengo otro que si el 01:43:17
game object 01:43:20
bueno, esto no es dentro 01:43:21
de un trigger, pero si el propio objeto 01:43:24
vale, que tengo 01:43:26
que tiene el script, se llama precipicio 01:43:28
vale, carga 01:43:30
el nivel, bueno, esto es 01:43:32
un poco más avanzado, con lo que 01:43:34
tenemos aquí ya se puede 01:43:36
realizar la tarea, vale, pero 01:43:37
fijaos que hay otra forma aquí 01:43:40
ya os lo cuento, de 01:43:42
digamos, saber cuál es la escena 01:43:43
a la que queremos ir, es decir, qué variable, qué contenido damos a este sin2o, que es si el objeto que tengo aquí se llama precipicio, 01:43:46
al empezar el script, si el objeto que tiene este código se llama precipicio, aquí no estamos hablando de ningún other, 01:43:56
sino del propio objeto que tiene el script, se llama precipicio, y efectivamente, si voy a este nivel, hay un elemento que se llama precipicio, 01:44:02
que casualidad de la vida 01:44:10
es ese que os he dicho que se pone abajo 01:44:12
para que detecte que se cae la bola 01:44:14
y tiene ese collider que es un trigger 01:44:15
para que siga cayendo 01:44:17
y detecte que hemos perdido la partida 01:44:18
básicamente, si este objeto 01:44:21
que tiene este script 01:44:23
que se llama precipicio 01:44:24
si se llama así este objeto 01:44:27
lo que tiene que hacer es 01:44:29
en la escena 01:44:30
guardame, y es otro de las propiedades 01:44:32
otro de los métodos que tiene el scene manager 01:44:35
que es, consigue 01:44:37
el número de índex de la escena activa, es decir, guarda en el scene to go, mira y dice en qué nivel estoy ahora mismo, 01:44:39
y dice en el nivel cuyo índex de los build settings es 1, pues ya tienes este 1 preparado para que sea este el número. 01:44:47
Esto es relevante porque nosotros podemos estar definiendo un número al que ir, pero de esta forma automáticamente, 01:44:55
a lo mejor lo que podemos, si tenemos bien ordenados en el build settings los distintos niveles, es al arrancar el nivel, 01:45:02
coge en qué nivel estoy 01:45:08
ahora mismo, ¿no? GetActiveScene, 01:45:09
es decir, la escena en la que me encuentro ahora mismo. 01:45:11
Y cógeme el número. Y digo, cuando 01:45:13
llegue a cierto punto, la que quiero que 01:45:16
me cargue es ese 01:45:17
build index, pero no que se 01:45:19
recargue a sí misma la escena, que es lo que estaría 01:45:21
haciendo en este momento, sino que si le ponemos 01:45:23
más uno, para pasar de 01:45:26
nivel, cuando la bola toque la meta, pues es 01:45:28
que va al siguiente nivel. 01:45:30
¿Vale? Entonces, hay distintos métodos, 01:45:32
esto es lo de siempre, pues que 01:45:34
a ver, que 01:45:35
mirando la documentación de Unity 01:45:37
yo os digo que en el siguiente tema 01:45:39
se habla más de esto, pero si vamos a 01:45:41
Scene 01:45:43
Manager 01:45:45
Unity 01:45:47
en el API, en la documentación del 01:45:49
API, tenemos distintas 01:45:51
métodos que habría que ir 01:45:53
desde crear una escena 01:45:55
porque en cierto momento queremos que se 01:45:57
añade una escena a la que tenemos abierta 01:45:59
o oye, coge de la escena 01:46:01
que está activa, esto que estábamos cogiendo ahora 01:46:03
de esta escena activa, pues quiero 01:46:05
que me cojas el 01:46:07
build index 01:46:09
de getScene 01:46:10
y aparte tiene luego 01:46:13
sus propios parámetros, quiero que de esa escena 01:46:15
me cojas 01:46:17
la ruta de donde 01:46:18
está encontrada, o el build index 01:46:21
o el nombre 01:46:23
y entonces, pues ahí se puede 01:46:25
se pueden ir guardando 01:46:27
valores relacionados con la escena 01:46:29
perdonad que oigo una duda 01:46:31
por ahí, pero simplemente que sepáis 01:46:33
que para cargar una escena, si no queremos recurrir a los números de, aunque tienen que estar en los build settings también, ahí metido, si en vez del número del índice queremos usar el nombre, 01:46:35
también se puede decir un array que sea el nombre del nivel, por ejemplo, level 2 creo que se llamaba, y entonces va a buscar dentro de todos los que haya level 2, pero era junto, 01:46:47
Va a buscar dentro de todos los que hay aquí en los build settings el que se llame como eso y cargará ese por nombre, ¿vale? Entonces yo aquí puedo poner level 2 y ahora sería el que cargaría, ¿vale? El level 2, no estamos invalidando porque no estamos usando esto del número para la escena, pero estaría ahí, ¿vale? Lo dejo un poco como estaba. 01:46:57
Y hasta aquí, el primer nivel ya no deberíais tener dificultades para irlo sacando. En el segundo hay algún pero más. A ver, alguien me ha pedido palabra, creo. Si no, decidme. He oído un pitido por ahí, igual no es nada. Si no, decidme. ¿Nada? ¿Sigo? Bueno, en los últimos 10 minutos. ¿Sigo? No veo lo de la mano, así que igual me lo he inventado. 01:47:19
En el nivel 1 la tabla está estática y si os fijáis el terreno no tiene ningún script, no está desactivado y por tanto lo que se mueve es la bola, pero en los siguientes niveles lo que se mueve es la tabla, entonces a la que hay que darle el script es a la tabla. 01:47:55
Es la que va a tener, lo que os lo he enseñado antes, de hecho, es la que va a tener, a ver, terreno move, pues eso, el torque. Esto os lo he enseñado antes, el torque que añadirá fuerza para que rote. La bola estará encima y por inercia, ahora es la bola, de hecho, la que tiene su script de movimiento desactivado porque no quiero que se mueva con la cruceta que tengo establecida en el input manager para el movimiento de la bola. 01:48:12
Quiero que sea plenamente solidaria, que reciba la inercia según la inclinación de la tabla. Pero hay un problema, que es que esta tabla, igual que hemos hecho antes, tiene un mesh collider que considera que tiene un agujero para que no pase lo de antes de que no se meta la bola. 01:48:37
¿Qué problema hay? Que para aplicar fuerzas al terreno, y por tanto le tenemos que poner un Rigid Body, a diferencia del nivel 1, que no hace falta un Rigid Body, va a ser un objeto estático, cuando metemos un Mesh Collider, para que coja esta geometría con el Rigid Body, el Rigid Body os va a salir un error que va a implicar que tenga que estar en kinemático. 01:48:57
Si no, veis que no se ve aplicado y no funcionaría. De hecho, si lo quito y le doy a play, o dará error o se sumergirá en la tabla. 01:49:27
¿Veis? Esta bola. Entonces, intentadlo, pero va a haber un problema, que es que es imposible que con un solo GameObject podáis aplicar la rotación en el RigidBody para que se mueva y que el MesCollider respete el agujero. 01:49:38
Para esto, y es la dificultad y está hecho a posta, normalmente no se llega a estos escenarios porque no queremos mover por físicas algo que tiene una malla más detallada, hay que disgregar en dos elementos esta tabla. 01:49:57
Por un lado, un elemento padre que si os fijáis no tiene nada de geometría, no tiene ni MeshFilter ni MeshRenderer, se podría llamar también MovedorTerreno, que lo que tiene es un RigidBody para efectivamente que este script mueva este RigidBody y haga que se gire, ¿vale? 01:50:16
y luego un hijo, que al ser hijo va heredando la posición de su padre, en el que sí que esté este RigidBody, pero no está el movimiento por código, ¿vale? 01:50:33
Y en este sí que podéis activar un MesCollider sin el convex, ¿vale? Para que sí que, para que no sea, cuando leáis los apuntes veréis que puede estar en modo convex, 01:50:44
que intenta minimizar o reducir directamente la geometría, 01:50:54
pero nuevamente hace eso de que lo convierte en un elemento que no tiene el agujero 01:50:59
y si queremos que mantenga ese convex, pues hay que añadir un rigidbody que sea de tipo kinemático 01:51:04
y cuando hacemos eso ya no se puede mover por código este rigidbody. 01:51:10
Entonces lo que hacemos es mover ese movimiento de físicas, lo hacemos en un padre 01:51:14
Y lo hereda el hijo, que es el que sí tiene el collider y la geometría de ese agujero. 01:51:19
Esta es la mayor dificultad. 01:51:25
Pero sabiendo esto un poco en cuenta y teniéndolo en cuenta, creo que ya resulta gran parte. 01:51:29
Fijaos que es este tipo de error. 01:51:35
Los non-convex mescollider con no kinematic rebody no se soportan desde hace tiempo. 01:51:38
Entonces hay que ir ajustando 01:51:45
Bueno, ahora mismo lo tengo bien 01:51:50
Cuando dé a play este error se va a marchar 01:51:51
Pero si desactivara lo de kinemático 01:51:54
Para que, por ejemplo, se pudieran aplicar esas fuerzas 01:51:58
Pues cuando dé a play va a funcionar 01:52:01
Pero no va a estar aplicándose ese collider 01:52:04
De manera correcta 01:52:09
Entonces ahí lo tenemos 01:52:09
Bueno, he soltado muchas cosas, creo que he introducido muchas cosas 01:52:15
Ya os digo que también hay cosas que se verán en siguientes temas 01:52:21
Y en ciertos momentos hay que ir dando saltos de fe 01:52:26
Pero bueno, también sirve para ir introduciendo conceptos 01:52:30
Y creo que hoy se han explicado un montón de cosas 01:52:33
Y creo que además cosas interesantes 01:52:35
Así que ya solo me queda deciros que os pongáis a la tarea 01:52:38
Y intentéis pegaros con ella 01:52:42
Que es como vais a aprender 01:52:44
Y creo que esta unidad ya, si sabéis 01:52:45
Los conceptos y asimiláis lo que se ve en esta unidad 01:52:47
Ya podéis hacer muchos tipos de juegos, realmente 01:52:50
¿Vale? 01:52:52
Así que nada, es el tema 3D7 01:52:54
Así que todavía queda 01:52:56
Pero, ¿qué tal? 01:52:58
¿Os queda menos sensación de... 01:53:00
No de densidad, imagino, pero de abrumarse 01:53:02
Ante el enunciado? 01:53:04
Al menos entender un poco por dónde tirar 01:53:06
Vale 01:53:08
Aparte he dado muchas vueltas 01:53:10
Para explicaros cosas, pero realmente 01:53:12
sabiendo es una tarea 01:53:13
que tampoco es tan tan compleja 01:53:17
como parece la primera vez 01:53:18
pero entiendo 01:53:19
yo soy el primero que lo ha padecido 01:53:21
las primeras veces que te enfrentas a códigos así 01:53:23
pues claro que abruma 01:53:25
pero bueno, que es como hablar un idioma 01:53:27
nadie aprende inglés en tres meses 01:53:29
así que bueno, que es parte del proceso 01:53:32
lo dicho 01:53:35
me tengo que marchar ya 01:53:36
no sé si hay alguna duda rápida 01:53:38
y si no, recordad que está en los foros 01:53:40
¿Alguna duda así para cerrar o algo que queráis que tratemos? Nada más. Vale, ya os digo, en general creo que está planteado lo necesario. Así que, bueno, pues muchas gracias por asistir. Me alegra que seáis unos cuantos los que venís a las tutorías, aunque queden grabadas, pues siempre creo que se agradece por si surgen dudas en el directo, ¿no? Pues irlas atajando. 01:53:42
así que nada, pues muchísimas gracias 01:54:10
si no hay nada más que añadir 01:54:12
y bueno, pues ánimo con la tarea 01:54:13
venga, hasta luego 01:54:15
Materias:
Imagen y Sonido
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Segundo Curso
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
66
Fecha:
28 de enero de 2025 - 20:04
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
1h′ 54′ 26″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
705.01 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid