Saltar navegación

Tutoria 11 - DEIM - UT 6 - Curso 23·24 - 25 Abril - 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 25 de abril de 2024 por Daniel M.

13 visualizaciones

Grabación de tutoría de DEIM

Descargar la transcripción

¿Estás con la tarea 6? ¿Qué tal la llevas? Es decir, ¿en qué punto te encuentras o cómo la estás gestionando? 00:00:01
Vale, ya he hecho lo del terreno. Estoy viendo el vídeo de Álvaro y estoy en los distintos nodos para hacer la animación. 00:00:09
Sí. 00:00:22
Vale. 00:00:23
En el animator, ¿verdad? 00:00:24
Sí. 00:00:26
En el animator. 00:00:27
En el Bren Tree. 00:00:27
Vale, estás con un 00:00:29
Entry 00:00:31
He puesto dentro de 00:00:32
Bueno, yo le he llamado 00:00:35
Corre, donde él 00:00:39
Dentro del Entry hace como tres 00:00:41
Estaciones 00:00:44
De movimientos 00:00:46
Mira Esther, si te parece 00:00:48
Como me lo vas explicando 00:00:49
Tienes ahí el proyecto abierto y lo vamos viendo 00:00:51
00:00:53
Venga, pues si quieres compárteme pantalla 00:00:54
Y lo vemos ya directamente en tu proyecto 00:00:56
Vale, ahí te tengo con el Blend Tree 00:00:59
Si te parece, dale abajo, que sale un cuadrado blanco 00:01:01
Dale a ocultar, ¿vale? 00:01:03
Para que no estéis molestando eso 00:01:04
Y lo vemos 00:01:06
Vale, tienes un Blend Tree que has llamado a correr 00:01:07
Bueno, explícamelo tú 00:01:09
Y así también voy viendo cómo lo explicas 00:01:12
Que creo que va a ser mejor 00:01:14
Vale, pues aquí en el vídeo 00:01:15
Ponía que teníamos que 00:01:19
Como en donde pone 00:01:21
O sea, aquí, ¿no? 00:01:23
El threshold, el umbral 00:01:24
Vale 00:01:27
Como darle tres parámetros 00:01:28
Como para luego 00:01:31
Hacerlo en 00:01:33
En un script, ¿no? 00:01:34
00:01:37
Entonces, él dice 00:01:37
Que 00:01:41
Él tiene de reposo 00:01:42
A correr 00:01:45
Y entonces 00:01:45
Él abre aquí esto 00:01:46
¿No? 00:01:49
Un parámetro 00:01:50
¿Float? Sí. Vale. Y yo lo que he hecho ha sido darle aquí a menos 5, porque si reposo es menos 1, entre menos 1 y 0 será menos 5. 00:01:52
Vale. 00:02:10
Porque él hace de 0 a 1, pone 0,5. 00:02:11
Vale, mira, a ver, vamos a plantear esto de otra forma 00:02:17
Tú ahora mismo, por lo que estás, corrígeme si no, por lo que estás haciendo un blend trino 00:02:21
Digamos, es para hacer los estados desde que está parado hasta que arranca a andar 00:02:26
Y incluso que vaya a correr, ¿verdad? 00:02:31
00:02:34
Vale, él lo que pasa, por lo que pone 0.5 y 1, si no me equivoco 00:02:35
Es porque tiene un joystick que tiene sensibilidad 00:02:42
Es decir, tú si das a un teclado a las teclas, puede pasar del cero, que es la nada, al uno o al menos uno, que sería el negativo. ¿Vale? Que es lo que tienes aquí. Pero realmente es un poco extraño que el idle, la animación de que está parado, que tienes ahí puesta con menos uno, ¿vale? 00:02:44
Sí. Claro, normalmente el menos uno es si estás dando un valor negativo. Si quieres el estado neutro, debería ser el cero, ¿vale? Entonces, aquí lo que se puede hacer es el id, el ponerlo en el cero, ¿vale? El caminar se podría poner en el uno y el run en el dos. ¿Por qué? Ponlo si quieres. 00:03:01
mira, el id es el 0 00:03:22
y de hecho lo vamos a hacer todo 00:03:23
porque los dos parámetros de inicio, andar 00:03:25
inicio, correr, ¿por qué los has puesto? 00:03:28
¿de cara a este 00:03:31
blendtree o para otras cosas? 00:03:32
porque si 00:03:34
no, de cara a esto 00:03:35
vale, si lo digo porque si no 00:03:38
no es necesario, vale, mira 00:03:40
de hecho te voy a pedir que borres 00:03:41
los dos parámetros que no está 00:03:44
si no los estás usando para otra cosa 00:03:45
el que pone inicio, andar, inicio, correr 00:03:47
clic derecho y borralos 00:03:49
¿vale? para que veas que no hace falta 00:03:52
se puede usar para más cosas pero 00:03:54
de momento vamos a ir a lo básico 00:03:55
vale, lo primero 00:03:57
el personaje, para ir viendo 00:03:59
luego cómo funciona, el personaje 00:04:02
que tiene esto, que entiendo 00:04:04
no sé si es Izan o el que pone Armature 00:04:06
¿cuál sería? 00:04:08
no, es que ¿sabes qué pasa? 00:04:10
que es que he descargado 00:04:12
los dos, uno que era 00:04:14
el primero 00:04:15
y luego en el resto 00:04:17
de los apuntes, o sea 00:04:20
en el vídeo era el que 00:04:22
hacía él 00:04:24
O sea, Izan 00:04:25
era el del vídeo 00:04:28
Vale, enséñamelos y vemos 00:04:29
qué tiene cada uno, porque como hay que aplicarlo 00:04:32
a una de las geometrías, a uno de los 00:04:34
personajes... Es que el de Izan 00:04:36
no me salía bien, porque 00:04:38
a ver, yo 00:04:40
cuando yo lo descargué y todo 00:04:41
en el 00:04:44
O sea, en el animator, cuando hay que ir a Rig, que este tiene como dos fallos y tal, pues lo puse, pero es que resulta que me anda de lado, ¿sabes? 00:04:46
Vale, lo podemos ver y así vemos qué ocurre. 00:04:58
Es que creo que lo he borrado, creo. 00:05:02
Vale. 00:05:04
Sí, simplemente es ahora mismo en la escena con qué personaje vas a ir trabajando, por explicarlo algo. 00:05:06
Ah, con este, con el... 00:05:11
Vale, el Izan incluso, si no lo usas, bórralo. 00:05:12
Y enséame el panel de escena. 00:05:14
Es que si no, no sé bien qué estamos haciendo, ¿vale? 00:05:16
Vale. 00:05:20
Ahora mismo tenemos en el que estás configurando el Blend Tree, ¿para qué objeto va a ser? 00:05:20
¿Para qué personaje? 00:05:26
Para este. 00:05:27
Para ese, vale. 00:05:28
Pues el de Ethan, si quieres no lo borres, pero ocúltalo. 00:05:29
Es decir, dale en el inspector, dale al tick, a la derecha del inspector, pues donde... 00:05:32
Seleccionalo y dale al tick que está a la izquierda donde pone Ethan. 00:05:38
Ah, vale. 00:05:42
¿Vale? Para que no esté molestando. 00:05:43
Vale, vale. 00:05:44
Vale, entonces ahora Armature, selecciónalo para ver su inspector, para ver qué tiene aplicado. Lo digo porque es que si no igual hacemos cosas y luego no se ve. Vale, Armature tiene un Animator Controller que se llama Armature, perfecto. Y tiene el avatar y entiendo que tiene todo bien seleccionado porque las animaciones de Idle y Avanzar y eso, ¿de dónde las has sacado? ¿Del Mixamo? 00:05:45
Sí, de aquí 00:06:08
A ver, de aquí 00:06:10
O sea, de todo esto 00:06:12
¿Y armature de dónde sale? 00:06:15
Lo que es el muñeco 00:06:17
¿Esto? 00:06:18
No, el personaje 00:06:20
¿Ese os lo compartí yo? 00:06:23
Esto viene en los apuntes 00:06:26
Ah, vale, es el otro personaje 00:06:28
Que te ha bajado de los apuntes, vale, vale 00:06:31
Ya entiendo, vale, que estamos juntando 00:06:32
Los dos, vale, perfecto 00:06:35
Pero este vale, ¿no? 00:06:36
es que lo que ponía aquí 00:06:37
que había que 00:06:40
se puede hacer 00:06:42
en Mixamo 00:06:43
y como no 00:06:45
sea así mucho pues 00:06:48
he cogido este 00:06:50
es decir, de cara a la práctica a mí lo que me interesa 00:06:51
es que a un personaje lo podáis mover 00:06:54
me da igual cual sea 00:06:56
lo que sí, que para sacar diferentes 00:06:57
animaciones, aunque aquí estás cogiendo 00:07:00
las que 00:07:02
pasaba ya en el paquete 00:07:04
que están ahí marcadas 00:07:06
ahí ya están hechas, lo bueno de Mixamo es que tú puedes 00:07:07
meter cualquier personaje y puedes 00:07:09
sacar más animaciones, pero bueno 00:07:12
vamos a hacerlo con estas que tenemos aquí 00:07:13
entonces 00:07:15
ahora mismo tú tienes 00:07:16
ese 00:07:20
personaje con ese animator 00:07:20
vamos adentro con el animator, otra vez 00:07:23
ya sé entonces 00:07:26
cómo está contextualizado 00:07:27
ahora mismo tienes un estado de idle 00:07:29
por lo que veo 00:07:31
que esa animación es que está 00:07:32
quieto, y luego 00:07:35
lo que vas a 00:07:37
querer es 00:07:39
que corra, entonces 00:07:40
o sea 00:07:43
o sea 00:07:45
de tranquilo 00:07:47
andar y correr 00:07:49
yo lo que he puesto aquí, no sé 00:07:50
o sea, andar, correr 00:07:53
vale, esto 00:07:55
por ejemplo funciona más 00:07:57
y vamos a 00:07:58
hacerlo así ahora mismo si te parece 00:08:00
Funciona más para, digamos, opuestos 00:08:02
Igual que el getAxis sirve para tener el menos uno y el uno 00:08:07
¿Sabes de qué te voy hablando? 00:08:11
De que es un input que permite coger dos extremos 00:08:13
Este lo vamos a hacer para ir, por ejemplo, hacia adelante y hacia atrás 00:08:15
Más que hacia adelante y hacia correr 00:08:20
Ahora te digo el porqué 00:08:22
Vale, es que en el vídeo pone de parado a correr 00:08:23
De 0 a 0,5 y a 1 00:08:30
Claro, pero ahí tienes que tener en cuenta 00:08:31
Que es que el GetAxis que está usando 00:08:33
Tiene valores intermedios 00:08:35
Entonces tú si coges 00:08:37
A no ser que me digas que tú estás haciéndolo con un Gamepad 00:08:39
Con un mando de consola 00:08:41
Tú si el joystick 00:08:43
Que estás configurando para coger el GetAxis 00:08:45
No lo tocas 00:08:47
Está en 0 y por tanto está en el idle 00:08:49
Si lo mueves un poquito 00:08:51
Hacia arriba 00:08:53
Irá sumando decimales hasta el 1 que es el máximo 00:08:54
Entonces tú empujando un poquito 00:08:57
tú haces que el personaje ande, ¿vale? 00:08:59
Y al subirlo del todo, corre. 00:09:02
Pero tú en un teclado, si es con lo que estás trabajando, 00:09:04
eso no lo puedes hacer. 00:09:06
Ah, vale, vale. 00:09:07
Porque tú la tecla, sí. 00:09:08
Claro, es que yo pensaba, o sea, él dice una frase, 00:09:10
¿por qué pongo menos uno? 00:09:13
Porque él en correr pone correr para adelante, 00:09:14
correr hacia la izquierda y correr a la derecha, ¿vale? 00:09:19
Entonces, yo veía como tres estados, pero, ¿sabes? 00:09:22
Pero distintos. 00:09:26
entonces, él dice, ¿por qué pongo 00:09:26
él pone menos uno para 00:09:29
normal, cero 00:09:31
para la izquierda y 00:09:33
menos uno para la derecha, ¿no? 00:09:34
entonces, él dice, ¿por qué pongo 00:09:37
estos para luego hacer el 00:09:39
script? entonces, claro, yo he 00:09:41
relacionado ese script 00:09:43
con 00:09:45
luego las teclas, ¿sabes? no con un 00:09:45
joystick. Claro, si 00:09:49
depende de cómo se haga, hay que saber cómo 00:09:51
se juega, digamos, es decir 00:09:53
hay que pensar, pues eso, que una tecla 00:09:55
tú cuando pulsas en el teclado no hay valores 00:09:58
intermedios, o la pulsas que es uno 00:10:00
o la sueltas y es cero 00:10:01
entonces, hay cosas 00:10:03
que se pueden hacer con un joystick porque tiene una 00:10:06
sensibilidad intermedia y otros 00:10:07
inputs, otros 00:10:10
dispositivos que no, es decir 00:10:11
tú si tienes un mando, por ejemplo, de Xbox 00:10:14
que se puede conectar al ordenador 00:10:15
esto se podría hacer y Álvaro lo está haciendo en base a eso 00:10:17
¿vale? pero 00:10:20
hay que ir pensando según 00:10:21
que se vaya haciendo 00:10:23
entonces, para lo que sí 00:10:25
se puede hacer, por ejemplo 00:10:27
lo que podemos probar 00:10:28
es que el id sea 0, es decir 00:10:31
no estás tocando nada y está parado el personaje 00:10:33
si le damos por ejemplo la w 00:10:35
por decir una flecha 00:10:37
una dirección de hacia adelante, sería el 00:10:38
caminado normal y sería un 1 00:10:41
en realidad, y luego 00:10:43
el correr lo vamos a poner con 00:10:45
un 2, pero no porque 00:10:47
hay una tecla que sea 00:10:49
2, el valor lo va a recoger 00:10:51
como 1 o tecla pulsada 00:10:53
pero sí que podemos decir de alguna forma 00:10:55
que si estás dando adelante y aparte 00:10:57
pues por ejemplo pulsas el shift 00:10:59
valga 2 y entonces 00:11:01
el blend tree irá al 2 00:11:03
¿vale? vale, vale 00:11:05
si quieres 00:11:07
lo hago yo o prefieres que 00:11:08
lo hagamos contigo, lo digo 00:11:11
es decir 00:11:12
que no sé que es más ágil 00:11:13
yo creo que es más ágil si lo voy haciendo contigo 00:11:16
ah, vale 00:11:19
o prefieres que vea como lo hago yo 00:11:20
Sí, es que ¿sabes qué pasa? Que estoy más pendiente de lo que me estás diciendo que realmente verlo y así me quedo yo con el... 00:11:22
Venga, pues vamos a ello. Lo del mixamo, por ejemplo, no lo has intentado, ¿no? Lo digo a hacer algo con mixamo del personaje. Estás usando el armature, ¿no? Básicamente de... 00:11:33
si he visto si he visto que hay los apuntes como lo descargarlo y también 00:11:44
he visto una cosa que no he entendido muy bien que es que pone por ejemplo 00:11:53
aquí no por ejemplo si tú el muñeco quieres que meta la mano en para como 00:12:02
para desenfundar, como que había que tener cuidado de no meterlo entre las mallas o... 00:12:11
Vale, vale, venga, pues vamos a hacer una cosa, dale otra vez al botón de dejar de 00:12:20
compartir y comparto yo, vale, entonces, a ver, me encantaría hacerlo, vale, de hecho, 00:12:27
si me das un segundo, yo tengo otros personajes, pero incluso para que sea con el mismo me 00:12:35
lo bajo de los apuntes el que estás usando tú vale y lo hacemos juntos y así al menos lo que 00:12:40
es el enfoque primero lo vemos juntos dame un segundo porque esto estaba en dame en el tema 00:12:45
6 y si cuando se explicaba lo que era el ejemplo del carácter controller si no me equivoco pero 00:12:51
bajo vale dame un segundo que tardo poco vale vale el que entiendo que estás usando es un 00:12:59
paquetes que se llama izan estándar a sets verdad no me bajé el izan y luego 00:13:09
como no sabía cómo me lío un poco porque había que cambiar tenía mal como la 00:13:18
cadera y el esternón y tal pues luego me bajé el otro el de llama armature si 00:13:24
los starter assets vale sí lo hacemos con el izan que en el fondo 00:13:32
es lo mismo? Ah, vale, sí. Vale, lo digo porque el otro hay que bajarlo del asset store, ¿vale? Y tarda un poquito más. Ah, bueno, no pasa nada. Vale, entonces, dame un segundiete, que lo que sí voy a hacer es otro proyecto distinto. Bueno, en realidad voy a hacer otra escena y ya está. Un segundo. Vale, la cosa es eso, que en los vídeos habla de valores intermedios, pero aquí nada, es un poco lo que también nos está 00:13:39
liando 00:14:11
entonces 00:14:13
ahora mismo 00:14:14
voy a crear una nueva escena 00:14:17
que se va a llamar 00:14:20
tutorial, por ejemplo 00:14:21
y aquí voy a importar 00:14:23
el paquete 00:14:26
de Izan 00:14:27
un segundo 00:14:28
importo 00:14:29
y me lo ha metido aquí un poco 00:14:36
me ha juntado un poco todo, pero bueno 00:14:44
por aquí tiene que estar 00:14:48
Character, third person 00:14:50
Models, Ethan 00:14:53
Vale, voy a poner un plano 00:14:54
Que lo suyo es hacer 00:14:56
Un paisaje 00:14:59
De hecho, mira, voy a hacer un 00:15:01
Un terreno, terrain test 00:15:04
Esto más o menos si lo sigo haciendo 00:15:06
Voy a hacer uno de 500 por 500, así rápidamente 00:15:08
Que no tenga más, vale 00:15:10
Y pongo a Ethan aquí 00:15:12
Vamos a poner aquí a Ethan 00:15:14
Bueno, se nos ha quedado ahí pequeñete 00:15:17
pero da igual, ¿vale? Va a estar todo con sus colorines. 00:15:19
Vale, entonces, este personaje, que pasará lo mismo que Izan, 00:15:23
luego es un FBX que dentro tiene, aparte de la malla y las texturas, etc., 00:15:26
lo que se llama el armature, que es el rig, es decir, la distribución de huesos, etc., 00:15:32
que viene aquí ya como configurado, con todos los huesos. 00:15:39
Esa es la diferencia o la clave de que Mixamo ayuda mucho. 00:15:43
En el caso de que tengáis un personaje que hayáis modelado, pues por ejemplo tenéis este personaje pero no lo tenéis rigado, pues a lo mejor lo podéis meter en Mixamo y ya os da toda la estructura de esqueleto, que es algo bastante complejo de hacer directamente en un software de 3D. 00:15:46
Una vez tenemos ya el avatar, que el avatar es esa estructura de huesos ya bien vinculados con las distintas articulaciones y tal, lo que hacemos es ese controller, por ejemplo, lo voy a hacer aquí un poco de aquella manera, ese controller, es decir, me refiero que lo voy a hacer aquí todo junto, que por ejemplo en este caso va a ser Izan. 00:16:02
Voy rápido porque entiendo que esto es un poco lo que ya ha sido trabajando, ¿vale? Cuando tenemos un personaje y queremos que tenga esos parámetros, bueno, esto es con otro animator distinto, ¿vale? Pero ese animator se corresponde con uno que está en otro lado, pero en este caso vamos a querer usar uno que he hecho doble clic, que es el de Ethan, que está esperando a que hagamos algo con él, ¿vale? 00:16:24
Lo que queremos para que funcione es que todo lo que trabajemos aquí dentro, pues tendrá que el componente animator, pues que estar vinculado a este objeto, ¿vale? 00:16:49
Entonces, ahora mismo tenemos este personaje y yo tengo por aquí diferentes animaciones, ¿vale? 00:17:00
Que lo mismo, en Mixamo se pueden ir bajando muchas, pero que tenemos aquí pues preparadas para ir usando, ¿vale? 00:17:08
Son distintas animaciones, pues, por ejemplo, a ver qué nombre tenemos, con control y ruleta, ¿vale? 00:17:14
Hago esto de que se pueda leer los nombres para no volvernos locos. 00:17:21
Entonces, dime. 00:17:25
Una pregunta, o sea, tú en Misamo vas, te descargas lo que son las animaciones solo, te las importas al proyecto este, ¿no? 00:17:26
Eso es. 00:17:35
Y de aquí te lo tienes que meter en la carpeta de personaje, ¿no? 00:17:36
Lo pueden meter en cualquier punto de los assets. 00:17:43
En cualquier carpeta dentro de... 00:17:45
De los assets, exacto, en donde sea. 00:17:47
De hecho, ahora mismo se me ha importado aquí en animación, 00:17:50
porque como he importado un paquete, 00:17:53
se me ha hecho como otra estructura aquí 00:17:55
y luego, si te fijas, 00:17:56
yo tenía otras animaciones antes de otros personajes, ¿vale? 00:17:58
Es decir, que el punto donde esté no importa tanto, ¿sí? 00:18:01
Lo que sí que importa es que lo que va a bajar, 00:18:05
aunque le demos al exportar de Mixamo, 00:18:08
le digamos que no queremos la skin, 00:18:11
Es decir, no queremos que tenga geometría, sino solo lo que es el clip de animación, aún así te lo emparqueta en un FBX, ¿vale? Y aunque no tenga animación, digamos, una geometría, una malla, ¿vale? No sale aquí el personaje en sí, lo que sí nos da es una especie de rig ya hecho que coincide con la animación que tenemos aquí, ¿vale? 00:18:13
Que es este iconito que tenemos aquí de animaciones, ¿vale? 00:18:35
Este es el icono de avatar y este el de animaciones. 00:18:38
De hecho, si damos doble clic a uno, a mí se me ha abierto la otra pantalla, 00:18:40
pero te abrirá lo que es la animación relacionada con todos los diferentes elementos que ha generado para el rig, ¿no? 00:18:44
¿Y esto se corresponde con la estructura interna de tu personaje, de tu avatar? 00:18:52
Ahí está la clave. 00:18:58
Que si tú el avatar lo haces con Mixamo, luego hagas el personaje que hagas y saques la animación que hagas, al final, cómo nombra a los huesos y cómo los distribuye son siempre los mismos. 00:18:59
Entonces, cualquier animación que sacas de Mixamo es compatible, ¿vale? Porque digamos que respeta la misma estructura. 00:19:13
Si ya lo empiezas a coger de otros puntos 00:19:19
Tienes que ir haciendo coincidir 00:19:22
Pues que la articulación 00:19:24
De ese objeto 00:19:26
Pues se corresponda con este avatar 00:19:27
Pero la gracia es que si tú haces un personaje 00:19:29
Y ya lo rigueas 00:19:32
Por ejemplo en Mixamo 00:19:33
El avatar de todas las animaciones que vas sacando de Mixamo 00:19:35
Es la misma 00:19:38
Entonces digamos que todas se dirigen 00:19:39
A una misma estructura de huesos 00:19:41
¿Esto por qué lo digo? 00:19:43
Porque también 00:19:46
cuando tenemos estos distintos 00:19:47
FBX 00:19:49
que en realidad son solo animaciones 00:19:51
aunque sean FBX 00:19:53
por eso hay que hacer este paso intermedio 00:19:54
que decía de, bueno aparte de ajustar 00:19:57
tamaño y tal, que en principio si todos son 00:19:59
los mismos no habría que hacer nada 00:20:01
pero en rig sí que hay que decirle 00:20:03
¿vale? porque esto es una de las cosas 00:20:05
que se dice en los apuntes 00:20:07
que es que tiene que ser un hombre 00:20:08
vamos, un hombre, una mujer, un vípero 00:20:10
una persona, vaya, entonces 00:20:12
es una de las limitaciones que tiene 00:20:14
Pero lo bueno es que tú puedes decirle que esta animación, que en este caso, pues he cogido una cualquiera, pero es la de salto y caída, por lo que veo, ¿vale? Tú puedes decirle, vale, yo no quiero que coja su propio avatar, quiero que respete el avatar original que yo estoy usando, bueno, me pide que le diga ok, pero el avatar original que habría que buscar, que yo estoy usando, y además es este, en el animator. 00:20:17
Bueno, me dice que aplicar, ¿vale? Este cambio, pero yo en el animator ya tengo un avatar, ¿vale? Que es el que está configurado para ese personaje. Si yo estoy usando un avatar, una estructura de rig hecha en Mixamo, todas las animaciones están pensadas para ese, para ese, para esa animación, ¿vale? 00:20:41
Entonces, por ejemplo, aquí voy a buscar el de, un segundito, el control aquí, primero la de Idle, que es como digamos la que más nos interesa y de hecho, voy a decir que lo coja de, de Izan Avatar, vale, vamos a, ¿dónde está? Que se me ha ido, esta. 00:21:01
Que además, si te metes en la animación 00:21:25
Aquí te sale con otro elemento 00:21:27
Porque no le hemos todavía asignado ningún modelo 00:21:30
Pues se ve aquí la miniatura de qué hace esa animación 00:21:32
¿Vale? 00:21:35
Vale, entonces 00:21:36
Si te fijas, para asignar qué hace esta animación 00:21:38
Hay que ir al FBX padre 00:21:41
Y decirle, yo quiero que esto lo coja de otro avatar 00:21:42
Que es el de Ethan 00:21:45
Y espero que no esté ese 00:21:46
El de Ethan, ¿vale? 00:21:47
Y lo aplico 00:21:49
¿Esto qué significa? 00:21:50
Que si yo ahora, vamos a hacer la prueba 00:21:52
Todavía no tengo nada en el 00:21:54
Si yo no tengo nada en el animator 00:21:57
¿Vale? 00:21:59
Y me voy a verlo en escena 00:21:59
Cuando le de a play 00:22:02
Pues está quieto 00:22:03
Si te fijas, no está haciendo nada 00:22:06
Está como encogido, es decir, los huesos se han encogido 00:22:07
Aquí no hay ninguna animación 00:22:10
Que se esté desencadenando 00:22:11
¿Qué puedo hacer yo ahora? 00:22:14
Decir, vale, yo ya he configurado la de 00:22:16
A ver, ¿dónde lo he puesto? 00:22:18
La de idle 00:22:19
Y yo puedo 00:22:20
¿Dónde me la ha dejado ahora? 00:22:25
Espera, porque no me lo ha cogido 00:22:33
Un segundín, ¿eh? 00:22:35
Claro, el problema es que estoy juntando 00:22:44
los avatares de Ethan con el de 00:22:46
Standards Assets 00:22:48
Entonces, lo que vamos a hacer 00:22:49
es pensar otra cosa, que es que 00:22:51
este avatar del que estoy usando 00:22:54
estas animaciones 00:22:56
porque este, por el que me está haciendo 00:22:57
aquí el mismatch, lo que vamos a decir es 00:23:00
que sea esta de Idle 00:23:02
Este de idle 00:23:03
El que defina el avatar de este modelo 00:23:04
¿Vale? 00:23:07
Entonces al darle aquí nos ha creado este avatar 00:23:08
Y le voy a decir que el que se use 00:23:11
En las animaciones 00:23:13
Sea este que tengo aquí 00:23:15
A ver ahora cuando le de 00:23:16
Lo que pasa es que como estoy juntando 00:23:18
De dos sitios 00:23:20
Porque estoy usando el izan y otras animaciones que tenía 00:23:22
Se me está volviendo un poco loco 00:23:25
Pero mira, ahora está quieto sin hacer nada 00:23:27
¿Vale? 00:23:29
Si yo ahora le digo en el animator 00:23:29
que coja esta animación 00:23:32
y se desencadene por defecto 00:23:34
ya por defecto vamos a tener 00:23:36
que el personaje está 00:23:38
y si vamos aquí 00:23:39
a ver 00:23:41
si le damos al play 00:23:42
este personaje 00:23:49
debería estar haciendo el 00:23:51
idle, que es el que tenemos aquí 00:23:53
¿por qué no lo está haciendo? 00:23:55
vemos aquí 00:23:58
¿dónde está cogiendo el? 00:23:59
Un segundo 00:24:02
Pues vaya tela 00:24:09
Te estoy aquí soltando una chapa 00:24:15
Y no me hace ni caso 00:24:17
A ver, un segundo 00:24:18
Está habiendo un problema con el avatar que está viendo 00:24:19
A ver, modelos 00:24:29
Izan, quiero el avatar de Izan 00:24:33
Voy a volver a esto, que es el que está dando el problema 00:24:35
Lo cojo de ahí 00:24:37
Y las animaciones de Izan 00:24:39
Pues yo lo que quiero es 00:24:41
Que esta coja, lo voy a volver a hacer, ¿vale? 00:24:42
Perdona, lo voy a volver a coger del Izan 00:24:45
Lo aplico 00:24:48
¿Y por qué me da fallo? 00:24:49
Si es que está cogiendo el mismo 00:24:51
Esto es porque es de dos elementos 00:24:53
Que tienen una estructura de huesos distinta 00:24:56
Entonces no me lo está cogiendo bien 00:24:59
Pero debería estar cogiéndolo bien 00:25:01
Porque es del mismo paquete 00:25:02
Entonces 00:25:04
Voy a hacer otra cosa 00:25:06
si no, hacemos la solución del mixamo 00:25:11
y ya verás como con eso se soluciona 00:25:15
pero 00:25:17
vamos a hacer una cosa 00:25:18
voy a hacer un proyecto nuevo 00:25:38
porque se me está mezclando lo de todos los proyectos 00:25:39
y creo que eso es uno de los problemas 00:25:42
a ver, voy a 00:25:44
voy a hacer un nuevo proyecto 00:25:46
estoy abriendo el Unity Hub 00:25:49
hago un nuevo proyecto 00:25:51
en la versión que estamos usando siempre 00:25:52
el 3D 00:25:54
Proyecto Tutoría 00:25:55
Vale, y lo voy a guardar en 00:25:58
En el escritorio mismo 00:26:00
Aquí, Proyecto Tutoría 00:26:03
Tutoría 00:26:05
Ahí está 00:26:08
Ahí está, y lo creo 00:26:09
Vale 00:26:12
Y vamos a empezar rápidamente a hacerlo 00:26:13
Porque algo ha fallado 00:26:17
Y creo que es 00:26:18
Están mezclando distintos avatares 00:26:19
Sí, ¿no? 00:26:22
A ver 00:26:25
vuelvo a importar el paquete 00:26:26
inserto todo 00:26:29
vale, debería estar todo bien 00:26:32
importo 00:26:35
vale, entonces 00:26:36
si nos metemos en esta escena 00:26:39
vale, tenemos aquí al personaje 00:26:41
que el que vamos a usar es 00:26:44
el modelo de Ethan 00:26:48
y Ethan tiene su propio avatar, etc 00:26:49
lo vuelvo a meter 00:26:52
hago un terreno 00:26:54
como he hecho antes lo hago todo rápido bueno habría que habría que importar las terrain tools 00:26:56
entonces voy a hacer un plano ahí está con izan ahí puesto vale y lo tenemos aquí el 00:27:04
animator controller lo voy a crear de cero animator controller el personaje ahora que 00:27:13
no hay más, ponemos ese, y aquí tenemos al personaje. Vale, el avatar de Ethan tiene 00:27:21
esto seleccionado ya para poder entrar. Entonces, si vamos a las animaciones, y por ejemplo 00:27:28
vemos el Idle, vamos a volver a ir al Idle, lo que queremos es que este modelo, esta animación, 00:27:36
etcétera, ¿vale? Esta animación se configure en Idle, lo coja de otro avatar, que es el 00:27:43
de izan y lo aplicamos y me vuelve a decir lo mismo y esto es por qué entonces no está 00:27:50
cogiendo bien este avatar y por qué si además es que este modelo lo chequeé antes de subirlo 00:28:01
iba todo bien a ver pero evidentemente algo no está yendo todo bien porque a ver si usamos 00:28:16
Y está cogiendo el avatar de Ethan 00:28:29
Y aquí sí lo está haciendo 00:28:40
Vale, un segundete 00:28:42
Un segundo, perdona 00:28:46
Sí, sí 00:28:52
Claro, pero sí que lo está cogiendo 00:28:53
De este modelo 00:28:58
Vale, bueno, tiene pinta que 00:28:59
Este no se hizo en Mixamo 00:29:02
Y como que en vez de vincularlo 00:29:03
con el avatar de otro objeto 00:29:05
hay que confiar en que 00:29:07
cada una de las animaciones 00:29:09
está hecha con el mismo 00:29:11
rig y si no, no lo está 00:29:14
cogiendo bien. A ver, voy a hacer... 00:29:16
Este es de Unity, no sé si... 00:29:17
Este objeto... 00:29:20
El humanoide... 00:29:21
Este objeto viene de 00:29:23
un paquete que os he dado yo. 00:29:25
Sí, pero el otro 00:29:27
que estaba usando yo es de... 00:29:29
Sí, el otro sí. 00:29:32
Sí, sí, el problema a veces es saber, cuando te vienen de terceros, por eso lo de Mixamo ayuda, cuando vienen de terceros es saber si la estructura de huesos de todas las animaciones coincide. 00:29:33
Es decir, si... a ver, estoy perdiendo mucho tiempo en esto y estamos sin ver lo que importa, pero simplemente para que veamos lo que pasa, ¿vale? 00:29:45
Porque esta estructura habrá sido hecha en varios objetos distintos, ¿vale? Y no todos respetan este avatar, no todos, digamos, que se asocien con este avatar. 00:29:58
Entonces, cuando yo, por ejemplo, quiero, aunque lo normal sería decir que coja la estructura del objeto padre, aquí realmente lo que habrá que decirle es que respete la de su propio objeto. 00:30:08
Y aunque no se esté referenciando directamente con el avatar, y voy a ponerle la animación, a ver, ¿dónde he hecho yo la animación? 00:30:20
He hecho yo un personaje, un controller, que cuando se junta aquí, ahora sí que cuando me meto en ese controller y meto esa animación que le estoy diciendo, coge tu propia animación de tu propio rig, ahora sí que cuando lo arrastro aquí debería responder. 00:30:32
y ahí está, vale 00:30:56
entonces es algo 00:30:59
que a veces pasa que es 00:31:00
si estamos vinculando, digamos 00:31:02
todas las animaciones a un mismo rig, como cuando 00:31:05
lo que explico en el vídeo que hay en el tema 00:31:07
cuando estamos sacando 00:31:09
las animaciones a partir de Mixamo 00:31:11
o si nos pasan distintos 00:31:12
digamos FBX con animaciones 00:31:14
pero digamos que se han sacado de manera 00:31:16
independiente, pues no 00:31:18
puede haber problemas de que no se vincule 00:31:21
y es lo que está pasando aquí, en tu caso 00:31:22
yo imagino que si eso, que si buscas 00:31:25
el avatar 00:31:27
el mismo avatar que se 00:31:27
está vinculando como padre 00:31:30
en el animator, debería funcionar bien 00:31:32
¿vale? 00:31:35
si no, a ver 00:31:36
si me da 5 minutos, me bajo el armature 00:31:37
y lo hacemos exactamente igual 00:31:41
que igual es mejor 00:31:42
porque si no, me voy a 00:31:43
hablar de casos que igual hay que reconfigurar 00:31:46
cosas, que es que es verdad que esto es 00:31:49
peliagudo, hay que ir probando 00:31:51
también a veces, hasta que vemos que 00:31:52
va respondiendo las cosas. Pero 00:31:54
si quieres, me bajo ese 00:31:56
paquete y lo vemos juntos, ¿te parece? 00:31:58
Lo que quieras. 00:32:02
O sea, yo lo que tenía dudas 00:32:03
es en el de 00:32:04
menos uno, cero, uno, pero... 00:32:05
Vale. Sí, bueno, 00:32:08
si no te lo explico aquí con este, sí, porque 00:32:10
en el otro ya conseguí. Vale, vale, vale. 00:32:12
Que como quieras, sabes que... 00:32:14
Vamos a hacerlo con este. Me da igual. 00:32:16
Entonces, lo que vamos a hacer aquí, ¿vale? 00:32:18
Para ir haciéndolo rápido, es un blend tree 00:32:20
que se va a llamar, cuando me meto, 00:32:22
pues que se va a llamar correr, ¿no? Tú lo habías llamado caminado, yo que sé, lo que sea, da igual, esto en realidad no importa mucho. 00:32:24
Lo que sí importa es este parámetro, que es con el que vamos a vincular el input que vayamos haciendo, ¿vale? 00:32:33
Y entonces vamos a tener un estado que será el de idle, lo pasa que como ya lo he usado, lo voy a borrar de aquí, 00:32:40
Y me meto aquí y en el de idle, a ver, porque primero habrá que decirle que al blend tree hay que meterle las animaciones, ¿vale? Y en este caso tú lo que habías hecho y lo que hacía Álvaro, ¿no? Que esta es una referencia es que está la de parado, la de caminar para adelante, que por ejemplo sería aquí y habrá que hacer esta nueva configuración de crear por este modelo, ¿vale? 00:32:51
Ya está configurada, que es andar hacia adelante, ¿vale? 00:33:16
Aquí hay una cosa importante, que es que si te fijas, que también lo digo en el vídeo, 00:33:21
si te fijas al reproducir el clip este de animación, 00:33:27
vemos que el personaje no es solo que haga como el ciclo de caminado, 00:33:33
sino que aparte se está desplazando, porque ves que la malla del suelo se está moviendo, ¿vale? 00:33:37
aquí hay un detalle a tener en cuenta 00:33:42
que es que cuando la animación ya tiene 00:33:44
su propio movimiento 00:33:46
el personaje se va a mover 00:33:48
en este caso hacia adelante 00:33:50
igual que hace aquí 00:33:51
la escena no se me mueve 00:33:53
anda pero no se desplaza 00:33:56
no se desplaza 00:33:58
eso en principio es porque 00:33:59
entonces tiene desactivado 00:34:02
y chequéalo en el animator 00:34:04
esto de aplicar root motion, esto está desmarcado 00:34:06
A ver 00:34:08
Míralo un segundo, también sabe 00:34:11
¿Cuál has dicho? 00:34:13
¿El de debajo de la batalla? 00:34:17
Está con el 00:34:19
Chequeado 00:34:22
¿Está chequeado? 00:34:22
Vale, ¿y tú has conseguido que el personaje anda y no avanza? 00:34:24
Dices 00:34:27
00:34:28
Bueno, estamos hablando de una cosa un poco 00:34:32
Absurda, perdóname 00:34:36
Porque claro, yo estoy hablando de mi modelo, no del tuyo 00:34:37
Que el tuyo en el caminado igual está en su sitio 00:34:40
pero que en el vídeo se habla de que 00:34:42
las propias animaciones pueden tener sus propios 00:34:44
movimientos, si eso es así, habría que 00:34:46
desactivar, lo digo porque nos puede distraer, habría que 00:34:48
desactivar esto, de hecho yo lo voy a tener que desactivar 00:34:50
en un segundo, pero 00:34:52
lo digo porque hay que pensar, igual que 00:34:54
pasaba en 2D, que lo que vamos a hacer 00:34:56
por un lado es los movimientos 00:34:58
como las animaciones que tienen los 00:35:00
personajes, pero lo que es el desplazamiento 00:35:02
en el espacio lo vamos a hacer por código 00:35:04
con un translate, con un... 00:35:06
Eso es lo que ponen los apuntes, que eso hay que 00:35:07
quitarlo si tú lo quieres que se mueva 00:35:10
por código. Eso es. 00:35:12
Porque a veces podemos tener animaciones 00:35:14
que es que la animación 00:35:16
está moviéndose o que 00:35:17
solo haga como que anda, pero el suelo está quieto. 00:35:20
¿Sabes lo que quiero decir? Vale. Sí. 00:35:22
Eso es importante porque si no 00:35:24
lo desmarcáramos en algún momento, decimos 00:35:26
anda, ¿y por qué se está yendo para adelante? Y de hecho lo vamos 00:35:28
a ver, ¿vale? Ahora vamos a ver cuándo lo hagamos. 00:35:30
Vamos a decir, ¿y esto por qué se mueve? 00:35:32
Si yo no le he dicho que se mueva. Y es porque la propia animación 00:35:34
ya tiene movimiento. Igual que se mueven los brazos, 00:35:36
pues está marcado que se mueva hacia adelante 00:35:38
pero esto se 00:35:41
consigue quitando la playroom motion 00:35:42
y luego lo que se 00:35:45
pone en el vídeo también, hay otro tipo 00:35:46
de animaciones 00:35:49
de la Y 00:35:50
que en el ejemplo del vídeo por ejemplo 00:35:53
se habla de la Y porque hay animaciones 00:35:55
de salto que el personaje de verdad 00:35:57
sube y lo que queremos nuevamente es 00:35:59
que el impulso lo coja 00:36:01
por código 00:36:03
que le demos la fuerza 00:36:05
Entonces esto es donde hay que ir chequeando estas configuraciones. Pero vamos con el blend tree. Vamos a ir poniendo las distintas animaciones. Tenemos la de estar en reposo, la de caminar. 00:36:06
que a ver si me deja, que hay que ajuntarla, siempre la arrastro, pero hay que ponerla aquí, ¿vale? Y luego una que habrá aquí de correr, por ejemplo esta, que si yo la chequeo, pues corre y nuevamente también se mueve el suelo. 00:36:29
Pero bueno, ahora vemos cómo solucionar eso. Entonces yo la pongo aquí, ¿vale? Y le voy a decir que no me los haga automático, sino que yo voy a poner el valor. 00:36:43
Álvaro lo que tenía era algo como esto 00:36:53
0, 0,5 y 1 00:36:56
¿Vale? Pero el problema, que yo para que camine 00:36:57
Le voy a tener que poner un 1 00:37:00
Que es 00:37:02
Que se está cogiendo 00:37:02
En un axis el máximo del axis 00:37:06
Si lo cogemos con un axis 00:37:08
Esto se puede coger de distintas formas 00:37:09
Y lo que vamos a decirle es que el ran sea el 2 00:37:12
¿Vale? Para que cuando vayamos 00:37:14
Pasando de uno a otro y le damos a play 00:37:16
Pues si yo pulso 00:37:18
La tecla 00:37:20
Si yo pulso la tecla y esto va al 1, va caminando, pero si conseguimos que el valor que llegue a este parámetro blend, que es el que tenemos aquí, pero se llama blend porque es el que no se ha creado por defecto, pero vamos a poner caminado. 00:37:21
Estamos diciendo que lo que entre en este parámetro sea lo que determine qué animación se desencadena. 00:37:36
Y si está en el 2, pues irá en el 2. 00:37:42
Entonces vamos al código ahora mismo. 00:37:46
Hay que hacer un código básicamente para que detecte los inputs y detecte todo lo que vamos haciendo. Esto habría que meterlo en una carpeta un poquito más, pero lo voy haciendo un poco rápido para que no perdamos más tiempo. 00:37:48
que ya bastante he perdido yo antes, hasta queda con esta combinación de armature, ¿vale? 00:38:05
Tenemos este código y lo que vamos a querer, por un lado, es que esto afecte al animator, ¿verdad? 00:38:11
Porque todos los códigos que vayamos poniendo que afecten a este parámetro, por ejemplo, 00:38:19
están dentro del componente animator, ¿vale? 00:38:25
Entonces, yo ya hago una variable que enseguida yo ya digo, yo voy a querer afectar al componente animator de este objeto. Para eso hay que hacer un getComponent del nombre de ese componente, que es el animator, ¿vale? 00:38:28
Con esto ya, por ejemplo, podemos decir que en cierto momento se ponga un set float para, ¿cómo lo hemos llamado? Para caminado. Por ejemplo, para caminado que sea de 1. 00:38:44
¿Vale? 00:39:01
Hasta aquí esto estás entendiendo este código 00:39:05
Lo digo porque 00:39:07
Básicamente, ahora mismo si te fijas 00:39:07
Lo que he hecho es preparar todo 00:39:11
Para que podamos llamar a ese animator 00:39:13
Del objeto que tiene este código 00:39:15
Que por cierto, no lo tengo todavía puesto 00:39:16
¿Vale? Es decir, ahora este script 00:39:19
Va a mirar dentro del animator 00:39:21
Que hay en este objeto 00:39:22
Y así con anim, con esta palabra 00:39:23
Ya podemos acceder a todo lo que hace animator 00:39:26
Y si te fijas 00:39:28
porque es lo que he puesto, no nos hemos preocupado todavía 00:39:30
lo que hace en cada fotograma 00:39:32
es poner un valor float 00:39:34
en uno de los parámetros del animator 00:39:36
que se llama caminado 00:39:39
que coincide con este 00:39:40
y lo pone valor de 1 00:39:42
es decir, cuando arranque el juego, como no hay nada que lo varíe 00:39:44
yo cuando le de aquí 00:39:46
y voy a poner 00:39:47
esto para que se vea en la escena 00:39:49
que se va a ver mejor 00:39:52
perdón 00:39:53
voy a hacer esto un poco más grande 00:39:56
Porque imagino que si no nos vamos a quedar ciegos tú primero, digo de que se están muy pequeñetes. 00:39:58
Vale, y ahora, como esto está en cero y en teoría, según el blend tree que tengo, debería estar quieto, pero como le estoy diciendo que es uno, 00:40:04
¿vale? Por eso le estoy diciendo así a Capón, lo que va a hacer es caminar por defecto. 00:40:11
Yo le doy y el tío no me hace ni caso. Vale, bueno, importante. A ver, se está metiendo aquí. Vale. 00:40:15
Bueno, ves que cuando yo voy cambiando este valor, ¿vale? Sí que se ve que camina el hombre. Vale, vamos a ver por qué no me está cogiendo esto. Esto es un float que se llama caminado. Sí, y quiero que lo ponga en el valor de 1. 00:40:28
Animator 00:40:43
Component 00:40:45
Animator 00:40:47
Está en movimiento personaje 00:40:48
Y debería hacerlo, a ver 00:40:51
Vuelvo a darle, que a veces se le va la pinza 00:40:53
A esto 00:40:56
Vale, ¿por qué puede estar pasando? 00:40:56
Porque de primeras 00:41:00
Según empieza esta condición 00:41:01
Nos metemos aquí 00:41:04
¿Y por qué no lo cambia? 00:41:09
A ver, perdona 00:41:11
Ay, pero es que no 00:41:12
Están pasando cositas 00:41:16
Animator, animator, lo está cogiendo 00:41:18
Float, caminado 00:41:20
Uno, sí 00:41:23
Debería estar perfecto esto 00:41:24
No hay que poner ninguna librería 00:41:26
¿No? 00:41:31
Y esto 00:41:38
Es un float, sí, porque 00:41:39
Tiene decimales, así que sí 00:41:41
A ver, caminado 00:41:43
Caminado, caminado 00:41:45
Caminado 00:41:47
voy a hacer yo que sea otro 00:41:48
probando 00:41:51
adelante 00:41:53
¿vale? estoy diciendo 00:41:55
porque cuando hacemos el blend tree nos lo pone 00:41:57
por defecto, voy a decir que el que 00:41:59
afecte a esto sea el 00:42:01
parámetro 00:42:03
adelante 00:42:04
el parámetro adelante 00:42:06
entonces voy a decir que este es adelante 00:42:09
adelante 00:42:11
y lo guardo y le doy 00:42:13
y a ver ahora 00:42:15
Ahora sí, no sé 00:42:16
¿Vale? Ves que a veces es dar la vuelta 00:42:19
Porque estoy haciendo exactamente lo mismo 00:42:21
Y importante, si te fijas 00:42:23
El personaje no solo no se ha quedado quieto 00:42:25
Sino ves que está avanzando 00:42:27
Lo que te decía antes 00:42:28
Esto es porque la animación ya tiene avance 00:42:30
Claro, esto nos puede interesar en cierto momento 00:42:32
Por ejemplo, si estamos haciendo una película 00:42:35
Y ya tenemos animado al personaje 00:42:37
No va por código, porque también se pueden hacer clips de animación 00:42:38
Aquí 00:42:42
Pero para el juego no nos interesa 00:42:43
Que él vaya cuando quiera 00:42:45
ahí es donde te digo que 00:42:46
hay que decirle, oye, olvida los movimientos 00:42:48
de raíz y tú 00:42:51
te vas a mover por lo que yo te diga 00:42:52
en código, ¿vale? y ves que hace 00:42:54
como una animación pero está en el sitio 00:42:56
¿vale? lo mismo 00:42:58
o sea, que cada vez que haga algo le tengas que dar 00:43:00
tú una tecla, si no se queda parado 00:43:02
¿no? eso es 00:43:04
más que eso piensa que es 00:43:06
que lo que estamos haciendo es 00:43:08
discriminar por un lado la animación 00:43:10
las animaciones de posición 00:43:12
para que no las haga 00:43:14
solo haga las animaciones de las articulaciones 00:43:16
pero que si se desplazan en el espacio 00:43:18
no, eso lo vamos a gestionar 00:43:20
nosotros de otras formas 00:43:22
¿vale? 00:43:24
entonces, ahora mismo por ejemplo 00:43:26
lo que vamos a hacer es decirle 00:43:28
en todo momento 00:43:32
yo no voy a 00:43:34
querer que me pongan uno 00:43:36
lo que voy a querer es que me ponga el número 00:43:38
de lo que yo capte 00:43:39
con un mando 00:43:41
con el teclado, etc. 00:43:45
profundidad, tecla, yo que sé 00:43:47
y aquí lo que voy a hacer 00:43:48
voy rápido y ahora lo vemos 00:43:50
getAxis 00:43:52
y vamos a usar uno de los 00:43:52
axis que ya están configurados 00:43:57
que es el de vertical, ¿vale? 00:43:58
esto sabes de dónde viene, ¿no? 00:44:00
y ahora lo que vamos a decir es 00:44:02
que este valor no sea uno 00:44:04
sino que dependa de que yo esté 00:44:06
activando ese axis 00:44:08
¿vale? es decir, adelante 00:44:09
ahora mismo este valor va a ir 00:44:11
variando según yo pulse o no 00:44:13
ese axis, entonces empieza el juego 00:44:15
y está quieto 00:44:17
y está haciendo una animación de 00:44:19
el idle, ¿no? que es la de que está ahí parado 00:44:21
¿vale? en el momento 00:44:23
y me meto aquí en el juego 00:44:24
pero voy a poner una cámara también o la voy a mover 00:44:26
para que se vea mejor donde está el personaje 00:44:29
porque si no, no 00:44:31
vamos a verlo nunca 00:44:32
a ver, lo voy a poner a menos 180 00:44:34
y en 00:44:37
profundidad ahí le tengo al chico vale yo ahora cuando en el juego le dé a la w ves que pasa de 00:44:39
uno a otro al 1 porque el axis el máximo que da es el 1 vale entonces ahora mismo no se está 00:44:48
moviendo el sitio pero está haciendo esa animación que es lo bueno de esto que si yo por ejemplo lo 00:44:55
estoy haciendo voy a hacer con el translate vale pero lo suyo sería hacerlo con él con fuerza del 00:45:01
RigidBody o con el 00:45:06
o con el CharacterController, ¿vale? 00:45:08
Es más fácil con este, ¿no? 00:45:10
Claro, ahora si quieres vemos 00:45:13
porque aunque parezca más fácil 00:45:14
no es más fácil, ¿vale? Porque 00:45:16
sí que es verdad que 00:45:18
hay veces que no... 00:45:20
A ver, ¿por qué no me coge el Translate ahora? 00:45:22
Translate, ah, vale. 00:45:25
Translate y lo que vamos a decir es 00:45:26
que 00:45:28
haya un nuevo vector 3 00:45:29
y lo vamos a mover en 00:45:32
0, 0 00:45:34
y lo que sea 00:45:35
profundidad tecla 00:45:38
¿vale? con esto 00:45:40
y bueno, acabamos la instrucción 00:45:42
y recordemos que 00:45:44
cuando hay una animación 00:45:46
también hay que lo suyo 00:45:47
ponerle un time delta time 00:45:49
para que siempre sea estable 00:45:52
el movimiento 00:45:53
esto, digo, tú cosas 00:45:55
que vayas, digo que además 00:45:58
como no te he visto en más tutorías pero tú lo que 00:46:00
quieras o hace mucho 00:46:02
de este módulo, de parándome 00:46:03
y veamos, viendo lo que no vayas entendiendo 00:46:06
¿vale? ¿entiendes por qué pongo esto de 00:46:08
Time Delta Time? 00:46:10
Sí, en principio todo el código 00:46:11
que has puesto, sí que lo entiendo 00:46:14
pero yo, si me dan 00:46:15
sin nada, pues 00:46:17
puedo tardar como 00:46:19
15 horas, pero 00:46:21
todo lo que vas poniendo, sí que 00:46:23
porque lo pones, ¿sabes? 00:46:25
Claro, esto es práctica, y es ir 00:46:27
dedicándole tiempo, es decir 00:46:29
y ves que yo también fallo más 00:46:31
que una escopeta de feria, digo que me cuesta 00:46:34
a veces llegar porque es que hay que darle vueltas 00:46:36
es que, claro, porque hay que estar pensando 00:46:38
qué es lo que quieres hacer y 00:46:40
cómo es la lógica y eso es lo que 00:46:42
me cuesta a mí, ¿sabes? 00:46:44
encontrar esa lógica, pero porque no 00:46:46
estoy ahí acostumbrada 00:46:48
pero cuando tú lo haces o cuando lo 00:46:49
hace Álvaro y 00:46:52
sabes, los tutoriales, entonces sí que 00:46:53
digo, claro, o sea, sí, pero 00:46:56
sí, a ver, por ejemplo 00:46:58
lo de cara al examen, en el examen 00:47:00
no va a haber una práctica en ordenador como tal. 00:47:02
Va a haber preguntas tipo test y alguna 00:47:04
desarrollo, pero va a ser en base a cosas 00:47:06
que ya estáis viendo, digamos, ¿sabes? 00:47:08
Lo que 00:47:12
falta aquí es ya 00:47:12
el ponerse, y para eso están las tareas, ¿vale? 00:47:14
Que aunque son voluntarias, 00:47:16
lo que siempre os digo, son muy recomendables porque es donde 00:47:18
se fuerza a 00:47:20
que lo uséis y a que vayáis haciendo el pensamiento 00:47:22
a ir llegando 00:47:24
a las 00:47:26
soluciones. 00:47:28
Espera un segundo, que es que me estoy haciendo un lío con un cable 00:47:29
y yo solo me voy a caer aquí 00:47:32
Dame un segundo, ¿eh? Vale, ah, perdona 00:47:34
Esto es, por ejemplo 00:47:43
el usar un GetAxis 00:47:44
y lo voy viendo a veces en las entregas 00:47:46
Por defecto lo que se suele hacer es usar 00:47:48
un GetKeyDown o algo así 00:47:53
pues para decir, cuando das a la 00:47:54
letra W o cuando das a la S 00:47:57
ya a medida que lo vas usando 00:47:58
y vas haciendo ejemplos como este, te das cuenta 00:48:01
de que el GetAxis es muy potente 00:48:03
en el sentido de que te permite 00:48:05
solo con un input meter un montón de valores 00:48:07
¿vale? por ejemplo esto que te he dicho 00:48:09
nosotros lo estamos haciendo con un teclado 00:48:11
pero este que era axis vertical 00:48:12
si lo hacemos con un joystick 00:48:14
va desde el menos uno hasta el uno 00:48:16
pasando por todos los decimales intermedios 00:48:18
entonces eso da un montón de recorrido 00:48:21
que no se puede con 00:48:23
solo cuando puses una tecla pasa esto 00:48:24
¿vale? 00:48:26
entonces ahora mismo tenemos 00:48:28
que lo que vayamos metiendo por input 00:48:30
se multiplique por este 00:48:32
estabilizador de tiempo 00:48:34
porque es lo que ponía los apuntes y tal 00:48:36
el update según el ordenador 00:48:38
va cargando en un tiempo concreto 00:48:40
lo más rápido posible 00:48:42
entonces si este valor no lo hacemos estable con un time delta time 00:48:43
va a ir dando como tirones 00:48:47
el problema que tiene esto 00:48:48
es que reduce mucho 00:48:50
al multiplicarlo porque los valores 00:48:52
del time delta time que es cuánto tiempo 00:48:54
tarda entre cada actualización 00:48:56
de frame es un 0,0 00:48:58
algo a veces entonces el valor 00:49:01
es pequeñísimo, eso lo que nos obliga 00:49:02
es siempre poner a una especie de multiplicador 00:49:04
que se suele llamar speed, pero se puede llamar 00:49:06
como queramos, lo voy a poner 00:49:08
aquí, speed 00:49:10
para, digamos, remontar 00:49:11
esta caída que ha habido de valor 00:49:14
porque si no se va a mover en décima 00:49:16
esto que va a llegar aquí 00:49:18
va a ser mínimo 00:49:20
entonces 00:49:22
por un lado, vamos a estar 00:49:23
moviendo al personaje con este 00:49:26
translate en profundidad 00:49:28
voy a poner una velocidad de 00:49:30
por ejemplo 10, no lo sé 00:49:32
esto es luego ir probando y poner 00:49:35
el valor que nos sirva para 00:49:37
darle la velocidad que queremos que tenga el personaje 00:49:38
¿vale? pero ahora mismo lo que estamos 00:49:40
haciendo es que estamos cogiendo 00:49:42
el axis 00:49:44
que en el teclado por defecto ¿vale? 00:49:46
esto si lo repaso 00:49:48
también, estos axis 00:49:50
tradicionales 00:49:52
en el input ya viene uno 00:49:53
que se llama vertical, que nosotros podemos 00:49:56
cambiar, pero bueno, por defecto viene 00:49:58
que la W sea el más uno 00:50:00
y la S el menos uno, que normalmente es cuando se juega al juego la cruceta, ¿no? 00:50:02
Pues la tenemos ahí. Evidentemente esto lo podemos ir cambiando nosotros 00:50:07
o en vez de decirle, importante, que coja los valores de un teclado o un botón de un mando, 00:50:11
que lo coja de un eje de un joystick, que es lo que haría Álvaro, en plan, 00:50:20
y en este caso querríamos que lo cogiera del eje Y, ¿vale? 00:50:23
Esto según el mando tiene muchos axis y habría que configurarlo, ¿vale? 00:50:27
Aquí queremos todavía que sea de un ratón o una tecla, pero ahí se configuraría para que fuera entre un valor u otro del Axis. 00:50:31
Y os dejé los apuntes, por ejemplo, en el mando, cada mando tiene una construcción, pero los que son de la Xbox o imitaciones de la Xbox, 00:50:39
aquí te pone a qué se requiere cada uno de estos ejes, ¿vale? Si lo configuráramos como un joystick Axis. 00:50:46
Vale, entonces yo ahora mismo, cuando arranco el juego, va a estar en cero porque no estoy pulsando nada. 00:50:53
Bueno, pero si había cambiado 00:50:58
Ah, bueno, claro, es que he cambiado la cámara 00:50:59
A ver, espera 00:51:01
Quiero, vale, importante, hay un truqui 00:51:03
Para la cámara 00:51:05
Que tenemos aquí con estas coordenadas 00:51:07
Si vamos a 00:51:09
GameObject y ponemos 00:51:10
Move to view 00:51:13
No, move to view no 00:51:15
Align with view 00:51:16
Vale, nos coge la misma posición 00:51:18
Vale, ahí tengo el personaje y está quieto 00:51:21
Esperando, ahora yo cuando doy a la W 00:51:23
¿Ves? 00:51:25
Aunque hay un momento de transición, porque es esto que tenemos aquí de la gravedad, etc. Es cuánto tiempo tarda en ir de un valor a otro cuando pulsamos. Esto se puede ir cambiando la sensibilidad. Vemos que pasamos a caminado y a no caminado. Y ves que casi no avanza. Es decir, está haciendo la animación, pero casi no avanza. 00:51:26
Esto es porque, nuevamente, habrá que subirle la speed bastante 00:51:47
Bueno, aparte de que igual no he guardado directamente 00:51:51
Voy a ponerle 100 00:51:54
Y ahora sí que, por un lado estamos haciendo la animación con el blend tree 00:51:54
Y con otra, bueno, ahora se ha ido a cuenca 00:51:58
Ves que ahora va súper rápido, ¿vale? 00:52:00
Bueno, porque antes seguramente no habría guardado y tampoco hacía falta 00:52:03
¿Vale? Entonces, al personaje lo que habrá que hacer es encontrar ese momento de equilibrio 00:52:06
Sigue siendo muy rápido para la animación que tiene 00:52:10
Dos 00:52:13
A ver 00:52:15
ahí lo tenemos 00:52:17
¿vale? y ahora sí que parece que está 00:52:19
caminando, incluso le doy para atrás 00:52:22
y como no hay animación 00:52:24
a menos uno 00:52:26
se queda en el idle 00:52:27
pero realmente 00:52:29
también podría yo ir añadiendo más 00:52:32
animaciones 00:52:34
en este blend tree 00:52:36
pero dame un segundo que me tengo que sonar los mocos 00:52:37
perdón 00:52:40
va viendo ¿no? lo que vamos haciendo 00:52:40
00:52:46
¿Qué haríamos para cuando queremos correr? Lo que no podemos hacer aquí es hacerlo con un... ¿Cómo se llama? Directamente con el teclado. 00:52:47
Pero lo que sí podemos decirle es que esta profundidad tecla, si además de moverlo, pulsamos, por ejemplo en este caso, decimos Get Key Done, Get Key, no Get Key Done, sino Get Key, mientras estemos pulsando una tecla, que en este caso, por ejemplo, va a ser la del C, yo que sé, mayúsculas, el C Left Shift, ¿vale? 00:52:58
Que es en mayúsculas este que hay debajo del block mayús, ¿no? 00:53:25
Le puedo decir que entonces en ese caso, profundidad tecla, ¿vale? A ver, joven, no me sale, profundidad, bueno, a ver si quiere. 00:53:29
Profundidad tecla, ¿vale? Se multiplique por 2, es decir que profundidad tecla se multiplique por 2, ¿vale? 00:53:45
Bueno, aquí estoy escribiendo cosas que no son. ¿Entiendes qué es esto? Vamos a decirle que el valor de profundidad tecla, mientras estemos pulsando este shift, pase a valer por 2. ¿Sí? ¿Esto lo entiendes? 00:53:55
A ver, repítelo otra vez. 00:54:11
Ahora mismo tenemos una variable que se llama profundidad tecla. 00:54:13
Sí, eso sí. 00:54:15
Vale, entonces aquí le decimos que profundidad tecla pase a valer lo que valga profundidad tecla en este momento, pero multiplicado por dos, ¿vale? 00:54:16
Importante, esto también es que va sirviendo de repaso de cara al examen de los primeros temas. 00:54:26
Esto ya lo hablamos, pero cuando vemos un igual no hay que verlo como un álgebra, que es que los dos lados son iguales y son dos lados, digamos, que tienen que ser equivalentes. 00:54:31
No, aquí significa que a esta variable, siempre lo que pone antes del igual, es que a esta variable lo que pase aquí, ¿vale? 00:54:40
Entonces, aquí lo que estamos diciendo es que esta variable guarde que el valor que tenga se multiplique por 2, ¿sí? 00:54:48
Que esto también en su momento se vio en el tema 1, que también se puede escribir así, de forma simplificada, ¿sí? 00:54:53
Vale. 00:55:01
Esto lo vimos en otra tutoría, hace unos meses. 00:55:02
Entonces, ¿qué ocurre? 00:55:06
le voy a dar aquí 00:55:08
a ver, profundidad 2 00:55:10
¿qué ocurre? que yo por un lado 00:55:12
voy para adelante 00:55:14
y no pulso el shift y hace lo mismo de antes 00:55:16
¿vale? pero si 00:55:18
y ahora lo voy a hacer ¿vale? si le doy 00:55:20
a la mayus, lo tengo pulsada y adelante 00:55:22
vas a ver que de pronto 00:55:24
esto pasa a valer 2 o menos 2 00:55:26
si sigo manteniendo el mayus 00:55:28
y por un lado 00:55:30
al translate como 00:55:32
aquí le está, siempre que estemos manteniendo 00:55:33
esto, ¿vale? Porque si no, esta condición la salta. 00:55:36
Si no, pues es lo mismo que teníamos 00:55:39
antes, ¿no? Se multiplica por 2, 00:55:40
llega el translate y claro, este valor 00:55:43
se moverá hacia adelante, en este caso 00:55:44
en el eje Z, el doble de rápido. 00:55:46
Por eso va más rápido. Pero aparte, 00:55:49
al parámetro adelante 00:55:51
que tenemos aquí, no le pasa un 1, 00:55:52
le pasa un 2. Entonces, 00:55:54
aquí ya sí que hace lo que esté aquí 00:55:56
en el 2 del blend tree. 00:55:58
¿Vale? O sea, que es porque se multiplica 00:56:00
y porque vale 2, o porque solo vale 00:56:03
dos correr claro no aquí lo siempre hay que pensar esto como cajas que guardan valores no 00:56:05
se me dijimos aquí cuando yo pulso la w vale al de estar aquí vale uno pero si yo a esto que vale 00:56:13
uno le añado que si pulso esta tecla ese valor que tengo aquí valdrá el doble vale pero no porque tú 00:56:21
le hayas puesto que correr vale 2 no hay que correr en el sí es decir para que haga esta 00:56:29
animación de run es porque aquí le he dicho que está la haga cuando este valor sea un 2 00:56:36
vale entonces es por eso y porque vale doble no la multiplicas por dos y porque lo has puesto 00:56:40
dos por un lado mira por un lado tenemos lo que es el movimiento real del personaje en el espacio 00:56:50
¿vale? Con este translate, ¿vale? Esto entiendo 00:56:56
que sí. Sí. Y luego 00:56:58
aquí lo que estamos haciendo es cambiar 00:57:00
el valor de este parámetro, ¿vale? 00:57:02
Lo que ponga en el segundo 00:57:04
parámetro que tenemos aquí 00:57:06
en adelante, si le llega un 1, aquí 00:57:08
pondrá un 1 y si le hacemos 00:57:10
para que aquí llegue un 2, aquí pondrá 00:57:12
un 2. Y tú fíjate 00:57:14
que es que todos los blend trees se basan en un parámetro 00:57:15
que en este caso es el de adelante 00:57:18
pero si tuviéramos más, voy a poner 00:57:20
uno de ejemplo. 00:57:22
Podríamos decir que 00:57:25
lo que afecta a esto sea 00:57:26
el parámetro ejemplo 00:57:27
pero claro, es que el que estamos cambiando aquí es adelante 00:57:29
¿vale? vale 00:57:32
entonces, luego, entre aquí lo que vamos a ir 00:57:33
marcando es que animación hay 00:57:36
en el momento en el que este adelante 00:57:37
valga estos valores 00:57:40
vale, vale, vale 00:57:41
y bueno, aparte, la gracia del blend tree es que 00:57:42
en el medio, pues va interpolando 00:57:45
entre las dos animaciones, ¿sabes? 00:57:47
que con un joystick no pasa 00:57:49
de andar a correr 00:57:51
de uno a otro, sino que va 00:57:54
haciendo como en el intermedio va haciendo interpolación mira de hecho si 00:57:55
es que se ve se ve así si yo le doy al play aquí vale esto sirve para hacer la 00:57:59
simulación y yo empiezo a mover verás que aquí empieza a andar un poco pero 00:58:05
cuando llega el uno hace completamente la animación de andado y aquí hace el 00:58:09
intermedio y aquí a medida si tuviéramos un joystick otra vez a medida que vamos 00:58:13
dándole más valor hasta que damos a tope al joystick pues vamos dando esos 00:58:17
diferentes valores, que es la gracia de tener 00:58:22
el axis, ¿vale? que estamos vinculando 00:58:24
las dos cosas, y ojo 00:58:26
que el axis también tiene un 00:58:28
valores 00:58:30
negativos, yo aquí 00:58:32
lo que puedo hacer, no sé si aquí 00:58:34
vienen animaciones de caminado 00:58:36
hacia atrás, ahí hacia 00:58:38
adelante, pero 00:58:40
incluso si hubiera hacia atrás 00:58:42
bueno, no la hay 00:58:44
walk, turn 00:58:48
turn left, no la hay 00:58:49
Pero se podrían ir haciendo más valores y vamos a decirle, vale, esta que sea cuando sea menos uno. Y se pone ahí. Y le voy a decir, simplemente para que se vea, que es andar, pero hacia atrás. Vas a ver que también va... 00:58:54
El pasaje va a parecer que va hacia adelante, pero voy a poner que vaya hacia atrás, ¿vale? 00:59:07
Ahora lo vemos. 00:59:11
Y también le voy a decir que haya otra animación que es de... 00:59:12
No, esta no. 00:59:19
Porque aquí esta nueva que va a ser el menos 2. 00:59:23
Bueno, hay que recolocar todas. 00:59:27
Y esta va a ser el id, el 0. 00:59:29
Esto es 1, esto es 2, que es lo que teníamos. 00:59:33
Esta menos 1 y esta menos 2. 00:59:36
Y esta menos 2, ¿vale? Y entonces aquí vamos a meter la de correr hacia atrás, la de andar hacia adelante, aquí, ¿vale? 00:59:39
¿Y qué va a pasar? Que ahora el personaje va a ir hacia adelante o hacia atrás por este translate que tenemos aquí, ¿vale? 00:59:54
Que cuando es menos 1 va en el eje Z hacia atrás, pero aparte también estamos activando las distintas animaciones. 01:00:01
Es decir, yo ahora voy hacia adelante y cuando voy hacia atrás también como que anda, ¿vale? No es la mejor animación porque sigue haciendo la misma animación que si andara para adelante, pero ves que está pasando entre uno y otro. 01:00:10
Y si yo incluso pulso el shift y doy para adelante, corre, pero si doy hacia detrás, corre para atrás. Lo mismo, no es la animación que haría alguien corriendo para atrás porque no es la que le hemos puesto, ¿vale? 01:00:22
pero ves que va respondiendo a eso sí vale vale más o menos veis cómo funciona algo importante 01:00:31
el blend tree es un nodo aquí vale ya los nodos se llega según las condiciones intermedias entonces a 01:00:41
veces para que se active esto que hay en el blend tree hay que llegar hasta este nodo por ejemplo 01:00:49
Imagínate que yo pongo una 01:00:54
A ver, que sea de agachado 01:00:58
Me parece que había una 01:01:00
Por hacer algo que sea muy exagerado 01:01:01
Esto, ¿vale? 01:01:05
Este personaje también se va a agachar 01:01:06
Y se lo voy a poner 01:01:08
Que esto es importante 01:01:09
Que sea la que hace por defecto 01:01:10
Ahora mismo, digamos que no está conectado 01:01:11
Este blendtree que hemos hecho por ningún lado 01:01:14
Que por cierto, le voy a cambiar el nombre 01:01:15
Para que sea caminado también 01:01:17
¿Vale? 01:01:21
Y ahora en el nodo pone caminado 01:01:23
No hace otra cosa, es para identificarlo 01:01:24
Ahora yo cuando le doy a play 01:01:26
Pues simplemente va a estar agachado el muchacho 01:01:28
¿Vale? Ya está 01:01:30
¿Qué pasa? Que si yo de pronto 01:01:31
Hago lo de que quiero que pase aquí 01:01:34
¿Vale? 01:01:36
Por mucho que yo esté sin pulsar teclas 01:01:38
Estoy diciéndole que esté agachado 01:01:41
Porque es la que va por defecto 01:01:43
O sea, uno entra en el sistema de estados 01:01:44
¿Vale? En el animator 01:01:46
Entonces habrá que hacer una transición 01:01:47
Para que vaya de aquí a aquí con alguna condición 01:01:50
¿Vale? Porque si no 01:01:52
nunca entramos aquí, es decir, para acceder 01:01:54
a lo que estamos configurando 01:01:56
hay que ir siguiendo la lógica de transiciones 01:01:58
¿me vas siguiendo? 01:02:00
Sí, eso también lo había hecho 01:02:02
Vale, lo digo porque en lo que 01:02:04
te he visto que tenías 01:02:06
tenías el idle quieto 01:02:07
pero si quieres 01:02:11
correr y que salte 01:02:13
luego vas a tener 01:02:14
a lo mejor problemas porque si está 01:02:16
corriendo para que salte, bueno, habría que ir 01:02:18
configurando bien los parámetros para que lo hagan 01:02:20
pero que sea consciente de que aunque yo ahora mismo esté quieto y no esté pulsando nada bueno 01:02:22
ahora lo ha hecho porque cuando acaba de hacerlo una vez hace esta transición porque no le hemos 01:02:28
puesto ninguna condición hace esta animación y va hacia aquí vale pero que para que haga este 01:02:32
el estar quieto yo estoy quieto y ves que primero hace entera está y luego pasa a la siguiente si 01:02:37
aquí pusiéramos una condición que no se cumple por mucho que aquí configuremos un blend y no 01:02:42
llegaría al blendtree sí vale más o menos si para seguir avanzando lo ves si más dudas que tengas 01:02:46
si no te enseño un par de cosas del que tenía yo preparado vale si te enseño yo si nada simplemente 01:02:56
como referencia de qué cosas se pueden conseguir vale de bueno voy a guardar este y hablo del otro 01:03:03
De esto 01:03:09
Digo, más o menos te queda claro 01:03:13
Lo que estamos haciendo 01:03:16
Vale, vamos allá 01:03:17
Bueno, lo guardo 01:03:19
Este no me sirve para otra cosa 01:03:20
Pero tenía aquí yo uno 01:03:22
Por ejemplo este 01:03:24
Las prácticas, sobre todo en Dane 01:03:25
Lo que más me importa es 01:03:32
Que os pongáis a hacerlas y vayáis superando obstáculos 01:03:34
¿Vale? Porque por eso pongo 01:03:37
Ya en estas últimas tantas 01:03:38
Cosas opcionales 01:03:40
digamos, porque 01:03:42
es que hasta que no, por mucho que lo leáis 01:03:44
y lo 01:03:48
a ver, espera, ¿cuál era? 01:03:49
por mucho que lo veáis y veáis vídeos 01:03:52
etcétera, evidentemente tenéis que verlos 01:03:54
para saber, hasta que no os ponéis a hacerlo 01:03:56
no lo hacéis, ¿sabes lo que te quiero decir? 01:03:58
entonces... si no lo comprendes 01:04:01
claro, es que por mucho que digas 01:04:02
ya sé hacerlo, hasta que no lo haces 01:04:04
no te sale, no, si, si, es verdad 01:04:06
y es que eso yo no puedo hacer nada más allá 01:04:08
de que hagáis las prácticas 01:04:10
y me preguntéis en base a ello 01:04:11
simplemente, ahora vemos si quieres 01:04:13
cómo está hecho, para que tengas 01:04:16
una referencia, pero este es el juego 01:04:18
si se cumpliera todo lo que hay en él 01:04:19
salta, hace diversas 01:04:22
cosas, el juego 01:04:24
tiene cosas mejorables, pero bueno, ya tiene un montón de cosas 01:04:25
que es lo que pide el enunciado 01:04:28
si se completara todo 01:04:30
al menos los mínimos 01:04:31
que es que hay personajes que te siguen 01:04:33
el movimiento del personaje, incluso hay 01:04:35
una mira, por si queremos 01:04:38
apuntar una pistola 01:04:39
¿vale? entonces 01:04:41
esto es ir poco a poco 01:04:43
lo de siempre, el terreno 01:04:45
por lo que me has contado, pues aquí 01:04:47
es un terreno que está generado 01:04:49
¿vale? y tenemos 01:04:51
aquí un personaje, que es este, pero podría 01:04:53
ser el que tú tienes ¿vale? que 01:04:55
tiene un animator 01:04:57
nuevamente con un avatar y 01:04:59
en ese animator pues hay un montón de estados 01:05:01
¿vale? y aquí 01:05:03
si no me equivoco 01:05:05
por lo que sea 01:05:06
En el zombie sí que hay 01:05:10
Pero aquí no hay un blend tree 01:05:12
Si te fijas, ah sí, este sí que es un blend tree 01:05:14
Mira 01:05:16
Tenemos un blend tree 01:05:17
Según entra, ¿vale? 01:05:21
Que lo que hace es, si te fijas y le clico aquí 01:05:23
¿Vale? Es de una dimensión 01:05:26
Porque en el vídeo también se deja caer que hay de más dimensiones 01:05:27
Que esto es para que incluso 01:05:30
Si no solo es hacia adelante y hacia atrás 01:05:32
Sino que también quieres que el personaje 01:05:34
Cuando vaya en diagonal 01:05:36
Junte la animación, por ejemplo 01:05:37
Lo estamos dando a la W y a la D, ¿no? Que es hacer la diagonal. Sirve para que, digamos, interpole las animaciones de ir hacia adelante, si pulsamos la W y de ir a la derecha, si lo hemos configurado para ir a la derecha con la D, ¿vale? 01:05:39
Entonces con eso se pueden hacer ya como ejes de en plan combinar dos parámetros, ¿vale? Está más complicada, pero lo bueno es que ya según vas haciendo que el personaje por un lado en dos ejes vaya hacia adelante o hacia la izquierda, ir poniendo animaciones, ¿vale? 01:05:55
Pero bueno, vamos a quedarnos de momento en esta. Y a ver, que yo creo que... A ver, un segundín, que creo que me he cargado algo, por eso sale este error. Vale. A ver, funciona bien. Vale, perfecto. Vale, entonces, por defecto, cuando yo entro en el personaje, ¿vale? Estoy con el personaje, se mete aquí y se queda ahí, ¿vale? En este nodo de estado. 01:06:12
y este nodo de estado es un blend tree 01:06:37
¿y cómo he configurado yo ese blend tree? 01:06:39
yo quería que este personaje, que también lo pone como propuesta 01:06:41
aparte de ir hacia adelante 01:06:44
y rotar, ¿vale? con la cruceta típica 01:06:46
con la Q y con la E 01:06:48
pueda moverse lateralmente, es decir 01:06:49
puedo hacer esto, yo le doy a la Q 01:06:51
¿vale? y ves que hace una animación de lateral 01:06:53
no de rotar, que es lo que hace cuando 01:06:55
doy a las flechas, sino lateral 01:06:58
entonces, yo el idle 01:06:59
lo aproveché 01:07:01
de hacer un idle, si está en el 0 01:07:02
Pues el chico está tranquilo, ¿vale? Y puse un axis que son los límites, la Q y la E, ¿vale? Si yo me meto en el player controller y este movimiento lateral se llama strafe, ¿vale? Así como pone aquí, en este strafe yo lo que hice es ponerle un axis que creí yo que se llama strafe, ¿vale? 01:07:06
Y nuevamente yo fui aquí a los Project Settings y hice un nuevo axis que es Strafe, ¿vale? Que tiene la Q como negativo y la E como positivo, ¿vale? Y eso es con lo que consigo que vaya, como hemos hecho antes, ¿vale? Que vaya hacia izquierda o hacia derecha. 01:07:27
Lo bueno en este caso con Mixamo es que yo he sacado la animación para ir hacia la izquierda y hacia la derecha. 01:07:43
Entonces, dependiendo de qué voy pulsando, este parámetro que yo he puesto, estrafe, es el que yo voy cambiando aquí más adelante. 01:07:54
Este código ya tiene bastante, pero voy haciendo lo mismo. 01:08:04
Pongo un float que es el valor de ese axis, ¿vale? Solo que me está cambiando ese parámetro que se llama estrafe, que es al que yo le he vinculado, podría vincularlo a otro. Entonces con eso he conseguido que por defecto esté quieto y si doy a las otras dos teclas de Q y E voy hacia los laterales. 01:08:07
Pero luego ya para ir hacia adelante, incluso correr o ir hacia atrás, son nodos distintos con su propia animación. Sí que en caminado, por ejemplo, también he puesto, aunque este realmente no es muy necesario, otro por si queremos dar sensibilidad, que este esté asociado al caminado. 01:08:27
Pero este, la verdad es que se podría haber puesto solo la animación con uno normal, tampoco hacía falta blend tree, porque con ir hacia adelante y que algo sea mayor que el valor de 0.1, que tengo aquí y que tengo vinculada al axis de vertical, pues ya iría hacia adelante. 01:08:50
no sé si me sigues 01:09:08
y luego si yo 01:09:10
estoy caminando hacia adelante 01:09:13
si aparte yo pulso 01:09:14
una tecla que activa 01:09:17
una booleana 01:09:19
que es run, pues pasará al estado de run 01:09:20
que es un poco lo que hemos hecho antes pero 01:09:23
en vez de hacerlo todo en un solo blend tree 01:09:25
lo he hecho en distintos estados 01:09:27
vale, o sea que es como 01:09:28
lo he dividido 01:09:30
en vez de hacerlo todo en uno junto 01:09:32
lo he ido dividiendo 01:09:35
que es la gracia de esto 01:09:36
que aquí puedes poner muchas animaciones 01:09:38
solo 01:09:41
y valores intermedios en un solo nodo 01:09:42
y hacer lo mismo que tú 01:09:45
en todos los 01:09:46
esto como lo que has hecho tú es como más lioso 01:09:48
eso es, y hay que poner más condiciones 01:09:50
más 01:09:53
tú fíjate, ahora está la de quieto 01:09:53
yo si doy a la Q y a la E 01:09:57
sigo en el mismo nodo porque 01:09:58
está en el blend tree, si yo me pongo 01:09:59
a caminar, fíjate que lo que hace es pasar 01:10:02
al nodo de 01:10:04
caminado, que yo le doy al 01:10:05
creo que es al shift, sí, vale 01:10:08
pues se está activando, si te fijas aquí 01:10:10
una booleana 01:10:12
de RAM, mientras yo lo tengo pulsado 01:10:14
y estoy ahí, cuando suelte 01:10:15
esa booleana se desactiva y la condición 01:10:18
que tengo es que si este RAM pasa 01:10:20
a ser falso, pues yo voy a walk otra vez 01:10:22
y bueno, como he dejado de moverme 01:10:24
el parámetro de walk es 01:10:27
menor a 0.1, es decir que estoy quieto 01:10:30
pues vuelve a estar aquí en reposo 01:10:32
Luego, por ejemplo, tengo una tecla, si vamos al código un segundo, tengo una tecla que es que si yo pulso el control, a ver dónde lo tengo, si yo pulso control, si yo pulso barra espaciadora, pues tengo un método que es saltar, pero vamos un segundo al control. 01:10:34
Si pulso la letra control, se aplica este método, ahora lo vemos, que he hecho yo, que se llama desenfundar. Y si suelto, son acciones que son o pasa una o pasa la otra. Si suelto esa misma tecla, enfunda. Por eso es la diferencia de cuando yo pulso desenfunda y cuando dejo de pulsar este app, pues se enfunda. 01:10:56
entonces desenfundar 01:11:21
yo es un método que he hecho aquí 01:11:24
y aparte de cambiar la cámara de Cinemachine 01:11:26
etcétera, lo que hago es 01:11:29
que hay un trigger que es el de 01:11:31
aim, que es el de 01:11:33
apuntar, ese trigger 01:11:34
que es que según pulsas pasa algo 01:11:36
yo lo tengo aquí configurado para que en cualquier 01:11:38
momento, sin tener que 01:11:41
pasar por otro, porque aquí es verdad 01:11:42
que tú no puedes ir de este nodo 01:11:44
a este si no pasa antes por walk 01:11:47
¿vale? 01:11:49
Pero aquí yo he configurado que en cuanto haya el trigger llamado aim, que ves que no es una booleana, no es que se quede marcada o no, bueno, aquí se queda marcada, pero mientras jugamos, cuando yo pulso se desencadena una vez ese aim y paso a esto, porque es un trigger que lo que hace es funcionar una vez como para desencadenar una acción, ¿vale? 01:11:49
Ahí lo que hago es que de pronto aparece una geometría que tengo una pistola en la mano, luego posteriormente el booleano apuntando pasa a ser true, ¿vale? Y yo le doy y lo que hace es que entonces ya está la condición que hay aquí para que pase a enfundar o desenfundar. 01:12:11
porque yo cuando esto 01:12:33
pasa a ser apuntando 01:12:35
positivo, se queda aquí 01:12:37
y en cuanto yo suelte con el 01:12:39
enfundar, esto le digo 01:12:41
que sea falso, entonces ya 01:12:43
le doy la condición para que pase 01:12:45
de aquí a aquí y de aquí a aquí 01:12:47
y vuelva a estar en el estado normal 01:12:49
¿sí? 01:12:51
sé que es lioso y que son muchas cosas 01:12:53
pero esto es lo que hay que ir pensando que se va 01:12:55
haciendo, claro, ¿vale? entonces yo 01:12:58
le doy, estoy enfundando, yo me puedo mover 01:12:59
etcétera, girar, ¿vale? eso no lo he bloqueado 01:13:01
pero en cuanto suelte 01:13:04
ese getKeyUp, el control 01:13:05
esto va a dejar de ser positivo 01:13:07
se cumple esta condición, se guarda 01:13:09
esa animación que tiene y ahora 01:13:11
pues ya empieza a andar otra vez 01:13:13
vale 01:13:15
vale, entonces 01:13:16
sí, más o menos 01:13:20
a ver aquí, borra algo, más o menos 01:13:23
sé que hay muchas cosas 01:13:25
y luego, ¿por qué? por ejemplo 01:13:27
se usa en este caso 01:13:29
en vez del translate, por ejemplo 01:13:30
se usa el character controller 01:13:33
cuando estás trabajando en un 01:13:35
terreno que es un plano 01:13:37
pues no pasa nada, porque tú estás 01:13:38
moviendo un personaje hacia adelante y hacia atrás 01:13:41
y no pasa nada, pero ¿qué pasa 01:13:43
si tú estás haciendo, como en este tipo de juegos 01:13:45
un terreno que tiene 01:13:47
pendientes? 01:13:49
Ah, vale, que las traspasas, ¿no? 01:13:51
Claro, tú lo que... 01:13:53
la gracia que tiene es que tú puedes decirle 01:13:55
hasta dónde subes, porque 01:13:57
si te fijas, el componente 01:13:59
carácter control ya está configurado 01:14:01
para cosas como límite 01:14:03
de cuestas, o si hay peldaños 01:14:05
pues que lo supere, claro 01:14:07
tú si estás diciendo que un objeto vaya para adelante 01:14:09
y hay un escalón con su collider 01:14:11
pues se queda ahí pillado, no tira 01:14:13
para adelante, esto lo que permite es 01:14:15
¿ves? aquí la pendiente es mayor de 45 grados 01:14:17
ha subido hasta ahí 01:14:19
¿vale? pero ya no sube, si yo le digo que 01:14:21
el límite sean, pues voy a poner 180 01:14:23
¿vale? vas a ver 01:14:25
que ya el personaje sí que sube eso no se puede con el transforma menos que le des un montón de 01:14:27
vueltas vale entonces el juego del mundo abierto pues es la forma digamos ya optimizada para hacer 01:14:33
estos comportamientos tiene más cosas vale pero sobre todo esto también tiene una detección de 01:14:39
piel distinta bueno tiene otro tipo de parámetros vale si yo ahora mismo le digo pues eso que 45 no 01:14:44
bueno, se caerá, pero yo ya 01:14:54
por aquí no puedo subir 01:14:56
¿vale? por mucho que me empeñe 01:14:57
¿vale? 01:15:00
esa es una de las razones para usar el carácter 01:15:02
controller, por ejemplo 01:15:04
más cosas 01:15:05
lo que me has dicho de la pistola en este caso 01:15:08
de las geometrías que se vinculan con 01:15:10
una animación o algo así, ¿no? 01:15:12
ah, sí, eso 01:15:14
lo pone 01:15:15
a ver 01:15:16
mira, fíjate en una cosa 01:15:21
a ver si es esto, o bueno 01:15:24
si sabes el punto concreto del tema 01:15:26
lo vemos, pero creo que se refiere a esto 01:15:28
Sí, creo que era por ahí, sí 01:15:29
Claro, tú cuando sacas de Mixamo 01:15:31
una animación 01:15:33
con su esqueleto 01:15:35
o bueno, o no de Mixamo, que lo has hecho tú 01:15:37
el rigging en un software 3D 01:15:39
o te has bajado una animación de internet, ¿vale? 01:15:41
aunque no se haya hecho con Mixamo 01:15:43
tú tienes aquí esta geometría 01:15:44
entonces tú lo que puedes hacer es buscar, por ejemplo 01:15:47
si te fijas aquí 01:15:49
a ver, en escena 01:15:50
tenemos todas las partes del cuerpo 01:15:52
Yo las puedo ir marcando y ves que cambia dónde está la posición de ese elemento, ¿no? De la mano, del brazo, ¿vale? En el rigging funciona así. 01:15:55
Entonces, aquí, por ejemplo, si yo quiero añadir este personaje, por defecto, no viene con esta pistola. Mira que la desactivo y ves que la pistola desaparece y aparece, ¿vale? 01:16:03
Entonces, lo que se puede hacer es hacer hijo un elemento de otra geometría para que se mueva con ese objeto. 01:16:12
Ahora mismo, en cuanto a la mano, ¿vale? Porque está vinculada a la mano. Se mueva, vas a ver... Bueno, de primera es el que está oculta la pistola. Solo la saca, ves que la ha sacado ahí y ves que se está moviendo con la mano. 01:16:21
Pues si tú la asocias y la pones en una posición, por eso de que al emparentar y hacer hijos un objeto de otro, coge sus posiciones, ¿vale? A ver, que aquí ha habido un pequeño bug, ¿vale? 01:16:34
Pues estamos adjuntando geometrías. ¿Qué es lo que he hecho? Que cuando yo se hace la animación esta de enfundar, se oculta esa pistola. Fíjate que yo cuando desenfundo, ¿vale? Tengo aquí un método, primero que la pistola, ¿vale? Que es este GameObject, que yo tengo aquí metida la pistola, ¿vale? 01:16:45
Yo aquí he hecho una variable pública que es esta pistola y la he arrastrado ahí. 01:17:09
Y entonces yo ya puedo decir que ese objeto se haga activo o no. 01:17:14
Cuando yo desenfundo y le doy al control, a ver si me deja porque me está atacando, 01:17:17
esa se hace activa y se ve. 01:17:22
Cuando desenfundo se oculta. 01:17:24
¿Por qué? Yo tengo aquí otro método que lo que hace es hacer que este objeto de pistola pase a no ser activo. 01:17:26
Entonces, lo que dirá es que, claro, tú si esta pistola la metes dentro de la mano, pues se va a ver raro porque está dentro de la mano. O si la animación, por ejemplo, hiciera que se rasca la cabeza y le pones la pistola, pues la pistola se metería en la cabeza, ¿vale? 01:17:33
Sí. 01:17:50
Entonces, entiendo que se refiere a eso. ¿Sí? ¿Te cuadra con lo que has leído? 01:17:51
Eh... 01:17:57
¿O se refería a otra cosa? Digo que... 01:17:57
Aquí pone que no puedes cambiar la jerarquía añadiendo el arma en la mano, ni borrar mallas. 01:17:59
Claro, por mucho que yo tenga... 01:18:08
Esta pistola es un elemento independiente del personaje. 01:18:10
Si tú empiezas a meter objetos en mitad, te puedes cargar la estructura de esqueleto. 01:18:12
Entonces siempre lo suyo es ponerlo al final de una de las ramas. 01:18:20
Vale. 01:18:22
Vale, porque si no, tú ten en cuenta que si de pronto metes algo que entre Right Solder y Arm, todo lo que hay dentro ya no está teniendo ese orden que detecta el avatar, ¿vale? Ese avatar, ese constructo que hay de huesos que te he enseñado antes que salí aquí, bueno, lo tengo por aquí. 01:18:23
Espera, que tendría que buscarlo, pero vamos 01:18:42
El avatar que es 01:18:44
Pues en el caso del zombie 01:18:45
Por ejemplo, este 01:18:48
Pues esto, ¿sabes? Si tú empiezas a meter elementos 01:18:49
Que ya no se cuadran con 01:18:52
Porque esto al final son 01:18:54
Como si yo arrastro estos 01:18:55
Estas posiciones, ¿vale? 01:18:57
Esta distribución de elementos 01:18:59
Al final hay que ir haciendo que respete 01:19:02
Porque es lo que hace que el software 01:19:04
Cuando vas haciendo las animaciones 01:19:06
Al abrir una animación cualquiera 01:19:07
Tú tienes aquí estos elementos 01:19:10
también, y bueno, este justo 01:19:12
no tiene mucha animación, pero 01:19:14
que la animación se basa en qué punto 01:19:15
de cada elemento es el que se tiene que mover 01:19:18
si tú no lo estás vinculando bien 01:19:20
no lo estás ajustando bien, pues 01:19:22
no lo va a respetar, claro 01:19:23
¿vale? 01:19:25
Sí, aquí pone que se puede hacer 01:19:26
otro prefab pulsando 01:19:29
el botón derecho al FBX 01:19:31
de la jerarquía y marcar prefab 01:19:33
un pack 01:19:36
complete y dejará de ser 01:19:37
dependiente del 01:19:39
fx original vale eso mira por ejemplo vamos aquí a ver no tenía yo a este hombre cuando tienes tú 01:19:40
un fx a ver tengo que buscar a este survivor y aquí tengo survivor cuando tienes un fx 01:19:52
Tú al meterlo aquí 01:20:03
Fíjate que tienes 01:20:07
Y además lo tienes marcado azul 01:20:09
Como si fuera un prefab 01:20:11
Un montón de cosas vinculadas 01:20:12
¿Vale? 01:20:16
Porque dentro del paquete FBX 01:20:16
Tenemos también estas tres estructuras 01:20:18
Que si te fijas, cada una es una cosa 01:20:20
Por ejemplo, aquí son tres elementos 01:20:23
Y yo, si quiero sacar 01:20:24
La mochila 01:20:27
Que ves que es un elemento independiente 01:20:29
Está dentro del personaje 01:20:30
pero no está rigueada 01:20:32
porque la mochila de hecho no tiene animación 01:20:34
me refiero, la mochila va siguiendo 01:20:37
donde esté el personaje, pero lo que tiene animación 01:20:39
de que mueva brazos y tal 01:20:41
es el personaje, la mochila no está rigueada 01:20:42
entonces yo si quiero sacar la mochila 01:20:44
no te deja 01:20:47
porque está dentro de este paquete 01:20:48
igual yo quiero tener la mochila porque de pronto 01:20:50
desaparece el personaje y tal, ves que no me deja 01:20:52
entonces esto se puede hacer 01:20:54
o arrastrando 01:20:56
ves que aunque yo arrastre 01:20:57
solo el backpack, borro 01:21:00
yo cojo este backpack y digo, ah mira, tengo esta geometría 01:21:02
la voy a meter aquí 01:21:04
aquí, entre las cámaras 01:21:06
y ves que lo que hace es meterme a todo el personaje 01:21:08
tengo todo otra vez 01:21:11
tengo ahí un personaje entero 01:21:12
y otra vez, digo, no, yo solo quiero la mochila 01:21:13
no me deja, que lo que hay que hacer, desempaquetar 01:21:16
cogemos este elemento 01:21:19
y en prefaz decimos desempaquetar por completo 01:21:20
y ahora ves que ya no 01:21:22
está vinculado con ese azul 01:21:24
y ahora la mochila, yo ya puedo borrar este personaje 01:21:26
y tengo la mochila solo 01:21:28
Bueno, es que este es el otro que he metido 01:21:30
Vale 01:21:32
O sea, esto es como para solo 01:21:33
De ese paquete solamente aislar 01:21:36
Una cosa que tú quieras y ya está 01:21:38
Y colocarla luego donde quiera 01:21:40
Se refiere incluso a esto, ¿vale? 01:21:42
Para desempaquetar tiene que estar dentro 01:21:44
Del juego 01:21:46
Pero eso, si tienes un FBX con muchos 01:21:47
Elementos o muchas partes 01:21:50
Porque un FBX al final es un formato que admite 01:21:52
Meter un montón de cosas 01:21:55
Dentro, o varias geometrías, como ves aquí 01:21:56
asociadas, ¿vale? Pero está todo dentro 01:21:58
de un paquete, está leyendo solo un único 01:22:00
archivo, que es este FBX. 01:22:02
Si queremos independizar las geometrías 01:22:04
hay que hacer este 01:22:07
un pack, ¿vale? 01:22:07
Vale. A eso se refiere. Vale, vale, vale. 01:22:10
Es que así 01:22:13
leído no lo entendía. 01:22:13
Ya, no, no, sí. Si es que hay cosas que 01:22:16
es complicado, que yo lo entiendo, ¿eh? 01:22:18
Pero bueno, para eso me podéis 01:22:20
preguntar también. Vale. 01:22:22
Más cosas. 01:22:24
Yo ya estaba, porque es que como 01:22:26
no ha llegado a más, pues... 01:22:28
Vale. 01:22:30
Eso, 01:22:33
si usas el Character Controller, 01:22:34
importante, para que tenga 01:22:37
gravedad, lo pone en los apuntes, 01:22:38
pero es de esas cosas que 01:22:40
si no, no se ve. 01:22:42
Mira, voy a meter... 01:22:44
Mira, voy a ocultar este personaje que tengo, 01:22:46
¿vale? Y voy a meter otro, simplemente 01:22:48
para que lo veamos rápido. 01:22:50
Si metemos a este Survivor 01:22:52
y lo meto 01:22:54
y lo voy a meter ahí 01:22:56
en esta parte, ¿vale? 01:22:58
Y lo voy a levantar, ¿vale? 01:23:00
Cuando metes un... 01:23:02
Claro, otra de las cosas que me has dicho 01:23:04
es más fácil un translate. El problema 01:23:06
es que el translate no aporta gravedad. 01:23:08
Sí, eso te iba a decir 01:23:10
que luego con el... 01:23:12
que cuando has empezado a subir montañas 01:23:14
digo, pues si ya no hay que 01:23:16
poner ni gravedad ni nada. Eso es. 01:23:18
Eso ya lo viene todo 01:23:19
junto y estaba mirando todo 01:23:22
lo que se estaba moviendo y digo 01:23:24
pues ahí no viene nada de poner nada. 01:23:26
No hay Rigidbody, por ejemplo. 01:23:28
Sí, sí, sí, claro, exacto. 01:23:29
Vale, eso, la gracia que tiene el Character Controller, 01:23:31
se lo agrego a este nuevo que he metido, 01:23:34
Character Controller, 01:23:36
es que por defecto tiene ya como una especie de cápsula 01:23:37
que hay que ajustar, ¿vale? 01:23:40
Vale, que esto hay que hacer que se ajuste bien, 01:23:42
pues yo qué sé, la altura más o menos está bien, 01:23:45
pero el center en Y, no. 01:23:47
Pero voy a hacer más grande esto para que se vea mejor, 01:23:49
que si no, no ves. 01:23:52
¿vale? y lo he puesto 01:23:53
sobre todo lo más importante es que se ajusta 01:23:55
a los pies ¿vale? a la forma de la silueta 01:23:57
yo que sé, para que lo veamos 01:23:59
aquí ¿vale? y aquí cuando yo 01:24:01
le doy al play no pasa nada 01:24:03
vas a ver que se queda ahí en volandas 01:24:04
¿vale? esto lo ponen 01:24:06
los apuntes ¿vale? pero es verdad que hasta que no se hace 01:24:09
igual cuesta, pero 01:24:11
eh... 01:24:12
Character Controller tiene, hay que hacer 01:24:14
un script, tiene varios métodos 01:24:17
que tienen cosas asociadas 01:24:18
me refiero, tiene 01:24:21
Y lo vas a ver en los ajustes, en los apuntes. Hay como dos formas de mover básicas en el Character Controller a un personaje. Character Controller Explicación, yo qué sé, voy a llamarlo así. Y le voy a juntar este script al personaje del Survivor nuevo, ¿vale? Ahí lo tengo. 01:24:22
Cuando nos metemos aquí, sí, y vas a ver que, bueno, lo mismo, para poder afectar a los parámetros y a las posibilidades que tiene un componente CharacterController, lo primero que hay que hacer es, le llamamos cc, es coger ese CharacterController, acceder al componente, ¿no? Con ese GetComponent, ¿sí? 01:24:39
Lo mismo que hemos hecho antes, pero en este caso con carácter controller, porque si no, no podemos acceder a las propiedades que tiene, ¿vale? 01:25:00
Y sin yo hacer más, en el update, ¿vale? Para que se vaya refrescando, hay una forma de mover a los personajes que se llama simple move, ¿vale? 01:25:07
El simple move te va a pedir unas coordenadas de movimiento y yo, por ejemplo, voy a poner solamente una vacía, ¿vale? 01:25:16
Que es un vector 3, 0, ¿vale? 01:25:25
Esto, no sé si sabes lo que es. 01:25:28
Esto es como un vector 0 es como hacer un nuevo vector 3 01:25:35
que sea así, 0, 0, 0, ¿vale? 01:25:41
Ahora mismo no se va a mover. 01:25:44
Simplemente estoy poniendo algo como para que veas 01:25:46
que incluso aunque no se mueva y no se pase nada más, ¿vale? 01:25:48
Al usar este método vas a ver que ya una de las cosas 01:25:51
que tiene, a ver, espera, lo guardo 01:25:54
una de las cosas que tiene 01:25:56
es que, ¿ves que el personaje ya ha caído? 01:25:58
Sí. ¿Vale? 01:26:03
Voy un segundo 01:26:05
que me parece interesante 01:26:05
un segundo, vamos a ir 01:26:07
un poco a los apuntes para que veas también 01:26:09
cómo interpretar eso, aunque lo explica Álvaro 01:26:11
más o menos ya en el 01:26:13
en su vídeo, pero en, a ver 01:26:15
joder, vale 01:26:18
tengo que ir al aula virtual 01:26:21
un segundete 01:26:23
voy a abrir los apuntes de este tema 01:26:25
vale, tema 6 01:26:27
y si vamos a la parte de los 01:26:33
CharacterController 01:26:35
bueno, os he puesto 01:26:36
bastantes recursos 01:26:39
vale, pero aquí te pone 01:26:41
que este componente tiene varias características 01:26:42
propias, se moverá 01:26:45
solo cuando lo llamamos al 01:26:47
SimpleMove y Move, cuando ponemos 01:26:49
solo referido a 01:26:51
que estemos usando ese componente 01:26:52
de CharacterController 01:26:55
SimpleMove, te lo pone 01:26:56
lo que no permite es hacer saltos 01:26:59
es un método que en este 01:27:02
aunque te pida aquí 01:27:04
un vector 3 de movimiento 01:27:05
igual que en el translate 01:27:07
que metíamos los 3 ejes para ver hacia donde se movía 01:27:09
el eje Y, el de salto, lo omite 01:27:12
¿por qué? porque lo que va a estar haciendo 01:27:16
siempre es que el personaje 01:27:18
va a estar cayendo hasta que encuentre 01:27:20
un objeto con un collider que le detenga 01:27:22
¿vale? 01:27:24
esto es porque hay muchos juegos 01:27:26
Que realmente los personajes no saltan 01:27:27
Solo se van desplazando por el espacio 01:27:30
Y quitarte, si va a ser así el juego 01:27:31
Y no salta, quitarte todo lo relacionado 01:27:34
Con el eje y simplifica mucho las cosas 01:27:36
¿Vale? 01:27:38
Porque ya te mete la gravedad 01:27:39
Te va metiendo más 01:27:41
Posibilidades 01:27:44
O te limita 01:27:47
Digamos, en tuertos que puedes tener 01:27:48
Perdona un segundo que tengo que 01:27:50
Sonarme los mocos, perdón 01:27:52
Por cierto, acabo de ver que hay otra compañera 01:27:54
se ha metido, que no la he saludado 01:28:03
ni la había visto 01:28:05
hola, sí, digo, me metí al principio 01:28:05
llevo escuchando todo el rato 01:28:09
¿ah, sí? joder, pues sí 01:28:10
pues estoy aquí 01:28:12
estás agazapada 01:28:14
estoy intentando 01:28:16
ponerme al día un poquito 01:28:19
vale, pues 01:28:20
¿qué estaba diciendo? 01:28:22
vale, eso, el simple move 01:28:25
lo que hace es que obvia 01:28:26
este eje 01:28:28
digamos que siempre lo deja 01:28:31
como si no existiera 01:28:32
¿vale? y eso es lo que significa 01:28:34
esto que estamos viendo aquí de 01:28:36
pues eso, a ver 01:28:38
que no puede saltar, ¿no? 01:28:42
sí, pero por aquí pone, por ejemplo, usando el método move 01:28:45
que es más complejo y ese sí que 01:28:48
permite usar 01:28:50
digamos 01:28:52
el eje Y en posición de reposo 01:28:53
no tiene gravedad y se la tenemos que añadir nosotros 01:28:56
es decir, cuando usamos 01:28:58
Y aquí un ejemplo de uso. Cuando usamos el simple move, no hace falta decir nada de gravedad porque ya la tiene por defecto, pero si luego en el ejemplo que ponemos después usamos un move, la gravedad hay que simularla todo el rato con parámetros que está añadiendolo. 01:29:00
Y otra cosa que tiene buena el Character Controller es que tiene un parámetro, una opción 01:29:16
Que es este IsGrounder, que lo que hace es que devuelve una booleana de si está este Collider que tenemos aquí 01:29:28
Que no es un Collider, pero es básicamente el área en el que se restringe el Character Controller 01:29:37
hay en todo momento una forma de comprobar 01:29:42
si esto está tocando el suelo 01:29:45
o otro collider, vaya 01:29:47
si nosotros por ejemplo 01:29:48
queremos que el personaje salte 01:29:51
vamos a querer que salte siempre 01:29:52
que esté tocando el suelo 01:29:54
a menos que tengamos un juego que permita hacer dobles saltos 01:29:56
o algo así, pero no es posible saltar 01:29:59
si no estás apoyado en algo, ¿verdad? 01:30:01
entonces, este 01:30:03
mira, me abro el código que tenía yo antes 01:30:05
este character controller 01:30:07
lo que permite por ejemplo es 01:30:10
a ver, que 01:30:12
si, ves que 01:30:14
bueno, aquí es la variable que he recogido 01:30:17
el carácter controller, si comprueba que está 01:30:19
aterrizado, que está tocando 01:30:21
suelo, ahí es donde entonces si puedo 01:30:23
llamar al trigger de jump 01:30:25
¿vale? y se ejecuta, si no, no 01:30:27
porque si no, es lo que me impide 01:30:29
que yo cuando le dé a la barra espaciadora 01:30:31
varias veces 01:30:33
a ver, espera, claro, es que tengo oculto 01:30:33
ese personaje, voy a ocultar este que 01:30:37
estábamos haciendo un segundo 01:30:39
y lo ponemos aquí, ¿vale? 01:30:40
cuando tenemos este personaje 01:30:42
es lo que impide que yo, aunque le dé 01:30:44
varias veces a la tecla 01:30:47
de saltar, hasta que no se vuelva a posar 01:30:49
no me deja 01:30:51
saltar más veces, y de hecho 01:30:53
fíjate que aquí hay un 01:30:55
isGrounder que está todo el rato como marcándose 01:30:57
porque cada fotograma está detectando 01:30:59
que está 01:31:01
posado, cuando yo le doy 01:31:02
al salto 01:31:05
¿vale? se quita hasta que vuelve a detectar 01:31:05
Y ese, digamos, parámetro del animator, yo lo tengo por aquí, que es, que, a ver, tengo una booleana que pondrá isGrounded en el valor que tenga este isGrounded, que es un sí o un falso o un verdadero, ¿vale? 01:31:09
Vale. 01:31:28
Me vas siguiendo, no, digo, sé que ahora estoy como yendo de un lado a otro, pero bueno, ¿sí? 01:31:28
Sí, sí, en principio sí. 01:31:34
Vale, pues eso 01:31:36
Por ejemplo aquí, como yo quería que saltara para el ejemplo 01:31:40
Que era opcional, esto lo pone en la tarea que es opcional 01:31:43
Porque complica precisamente esto 01:31:46
Yo estoy usando el move, que sí que permite que en algún momento 01:31:48
Podamos saltar, porque ya te digo 01:31:51
Con el simple move no está pensado para eso 01:31:54
Eso lo que significa es que 01:31:59
Como por defecto hemos visto que el move 01:32:01
no mete gravedad al personaje 01:32:04
hay que meter las líneas 01:32:06
que he puesto antes de que hay que 01:32:08
meterle gravedad en todo momento, hay que hacer una variable 01:32:10
de gravedad, con este 01:32:12
menos 9,8 que es la fuerza de la gravedad 01:32:14
real, en física, vale, y en todo 01:32:16
momento se está sumando 01:32:18
a una especie 01:32:19
de fuerza que luego aplicaremos 01:32:22
en el move, vale, aquí estamos sumándolo 01:32:24
en todo momento a un vector que es el que luego 01:32:26
se usa para el vector move, vale 01:32:28
que en todo momento está empujando 01:32:29
digamos hacia abajo 01:32:32
el fall direction, el eje Y 01:32:32
en todo momento está sumando la gravedad 01:32:35
para que vaya hacia abajo 01:32:37
y en todo momento está cayendo hacia abajo 01:32:38
si hay un suelo lo detendrá 01:32:40
y si no, pues está cayendo hacia abajo 01:32:42
eso sí, si yo en algún momento 01:32:44
le doy a saltar 01:32:47
le doy a la barra espaciadora 01:32:49
en mi caso y ejecuto 01:32:51
el método de saltar y está posado 01:32:52
pues lo que va a hacer es 01:32:55
aparte de que va a hacer la animación de salto 01:32:57
que es esta que tengo yo aquí 01:32:59
esta de jumping, ¿vale? 01:33:01
Que la condición es 01:33:03
pues que primero esté posado 01:33:05
y aparte se ejecute el trigger 01:33:09
de jump, ¿vale? Pues aparte 01:33:11
al fold dirección le digo, no, 01:33:13
ahora no vas a ir sumando como en todo 01:33:14
momento 01:33:16
la fuerza de la gravedad, que es hacia abajo, 01:33:17
¿vale? Que de hecho si os fijáis está sumándola 01:33:21
porque la fuerza de la gravedad, 01:33:23
y en la física también lo es, es negativa, ¿vale? 01:33:24
Por eso estamos cayendo hacia abajo. 01:33:26
No estamos yendo en el eje I positivo. 01:33:28
Entonces detenemos en ese momento y a la fuerza de caer hacia abajo todo el rato 01:33:30
Lo que le decimos es, no, no, en este momento I lo que tiene que hacer es ir hacia arriba 01:33:37
Y hay otra variable que es el jump speed, que es este 8 01:33:41
Que es lo que hace que en ese momento concreto, el move, cuando se va actualizando 01:33:44
Pues el vector move este que tenemos que va sumando la dirección hacia adelante, derecha 01:33:50
De los distintos inputs que estamos metiendo, del eje vertical, lo que hemos hecho antes para mover al personaje, pues que le añada esa fuerza hacia arriba, momentánea, porque según pase este salto, que solo se ejecuta una vez, solo se ejecuta cuando pulsamos una vez, por esto este down, la barra espaciadora, 01:33:54
pues le añade esta fuerza, sube y luego inmediatamente otra vez empieza a calcular cómo ir hacia abajo y aplicarle la gravedad, ¿vale? 01:34:15
Vale, o sea, tú en todas las acciones que hace el avatar tienes que hacer un script de esas variables que tiene cada acción, ¿no? 01:34:25
Sí. 01:34:40
Más o menos, ¿no? 01:34:41
Claro, cuando empezamos... 01:34:43
Así que si tú le das a saltar, yo pensaría que solo le doy a saltar y ya está, pero nunca pensaría que si le vuelvo a dar a saltar, porque es ilógico que tú, si le das a saltar, estés todo el rato dando a saltar hasta que el muñeco no baja. 01:34:44
Claro, eso te lo da la experiencia de ir pensando. 01:35:00
es que eso hombre en la práctica anterior 5 ya ya se hacía esto es por eso digo que si ya se ha 01:35:04
hecho la 5 el personaje el robot sólo podía saltar una vez porque había un collider que estaba todo 01:35:11
el rato también en vez de con el carácter controller es un paso más allá porque es un 01:35:16
tema posterior que cuando tocaba el suelo ese collider o con un rey cast también se podía 01:35:20
hacer vale venía ha aplicado hay una booleana que diga está posado o no está posado para lo 01:35:25
Si no está posado, aunque le des a saltar, no puede saltar porque no puede hacer más saltos. 01:35:32
Incluso se puede decir que cuando se da dos veces al saltar, sea cuando se quita ese posado. 01:35:37
Y puedes dar la opción de que entonces haya un power up que te da el poder de hacer doble salto. 01:35:42
Pero no saltos infinitos, porque entonces el juego te lo pasa porque va volando. 01:35:47
Pero sí, eso ya estaba. 01:35:52
Entonces, tú cuando empiezas un script, aquí hay que ir declarando todas las variables que van necesitando. 01:35:53
Pero tú en cualquier momento dices, ah, necesito uno de esta posado. Pues vuelves aquí, lo creas y aquí, por ejemplo, pues en algún momento habrá uno de esta posado o se creó... Bueno, no, no está el de esta posado, a diferencia de la unidad 5, que sí que había que hacer una booleana de esta posado, ¿vale? 01:35:59
porque aquí no es necesario gracias al 01:36:19
gracias al carácter 01:36:22
controller, aquí el carácter controller 01:36:23
si te fijas la condición de que esté posado o no 01:36:25
te la da él mismo cuando 01:36:27
te permite hacer esto 01:36:29
que esto devuelve 01:36:31
directamente verdadero o falso 01:36:33
porque lo detecta directamente con respecto 01:36:35
a la 01:36:37
aquí ya me está atacando todo Dios 01:36:38
con respecto a la 01:36:41
a la cápsula que tiene 01:36:43
el personaje en su carácter controller 01:36:45
y ojo lo mismo 01:36:47
la gravedad se da hasta donde 01:36:49
se encuentre esa cápsula 01:36:51
si yo por ejemplo le digo 01:36:53
como ponía por defecto 01:36:54
voy a subir al personaje 01:36:56
ves que la cápsula ahora llega hasta el suelo 01:36:58
y sobrepasa los pies 01:37:01
lo importante para detectar esa colisión 01:37:02
y por eso ahora está suspendida en el aire 01:37:05
es ajustar bien la cápsula 01:37:07
¿vale? 01:37:08
ves que ahora se posa en donde 01:37:11
pues en donde esté 01:37:13
ahora yo salto al personaje y salta 01:37:14
y todo lo hace en función a 01:37:17
igual que hacíamos con los colliders 01:37:19
y el rigidbody, pero bueno, es otra forma 01:37:21
de hacerlo, muy parecida, pero 01:37:23
que bebe de esa cápsula que te da 01:37:25
el collider. Y luego 01:37:27
los colliders normalmente 01:37:29
tienen los 01:37:31
métodos de onTrigger y 01:37:33
onCollision, ¿no? Que esto 01:37:35
se veía en 01:37:37
el tema 3, por ejemplo, y también en la 01:37:39
tarea 5. Aquí, como no 01:37:41
hay collider, ¿vale? Porque 01:37:43
ahora mismo este objeto 01:37:45
tiene algo como un collider pero no tiene el componente 01:37:46
collider, entonces no puedes 01:37:49
recurrir a esos onCollision 01:37:51
o onTrigger, tiene su propio método 01:37:53
que también lo pone en los apuntes 01:37:55
¿vale? que es 01:37:57
lo pone aquí 01:37:59
este onControllerColliderHit 01:38:01
que es un poco lo mismo 01:38:03
cuando es 01:38:04
en vez de void 01:38:07
onTrigger, enter, etc. es 01:38:08
cuando algo toque al collider 01:38:11
cuando otro collider toque 01:38:13
la cápsula esta del character controller 01:38:15
pues ya se pueden 01:38:18
ejecutar acciones 01:38:19
¿vale? 01:38:21
es como una especie de forma más avanzada 01:38:23
que permite otras cosas 01:38:26
pero que bebe un poco de lo que ya 01:38:27
hemos ido viendo en anteriores temas 01:38:29
¿vale? 01:38:31
y bueno aquí por ejemplo 01:38:35
habla de lo del root motion 01:38:37
esto que hemos dicho de la propia animación 01:38:38
etcétera ¿vale? 01:38:40
no sé, más dudas o más cosas 01:38:42
que queráis que veamos 01:38:44
hoy que tengo 01:38:46
dos alumnos 01:38:48
que otros días estaba yo solo 01:38:49
en las tutorías 01:38:52
luego está todo lo del NPC 01:38:54
pero es verdad que es más complicado 01:38:58
si queréis lo vemos 01:39:00
eso es lo de la inteligencia artificial 01:39:01
que es un apartado digamos opcional en la tarea 01:39:03
eso es el zombie, entiendo 01:39:06
eso es el zombie, ¿no? 01:39:07
si queréis lo vemos un poco por encima 01:39:09
en la 01:39:13
en la tarea viene explicado también 01:39:14
en cómo conseguirlo. Es verdad que a veces hay que interpretarlo y se tarda, pero a ver, espera, 01:39:16
que alguien me ha escrito algo. Ah, vale, que la compañera está, pero no puede participar. Vale, 01:39:21
vale. Vale, fenomenal. Sí, mira, para que veáis un poco el funcionamiento del zombie, por si 01:39:27
queréis probar. Yo ahora mismo, y me voy a la ventana, bueno, espera, primero voy a ajustar 01:39:34
viene este el collider vamos el collider el carácter controller para que esté 01:39:41
como debiera 01:39:46
yo no sé qué desecho pero yo creo que ya está como estaba al principio 01:39:51
vale ahí lo tengo y ya estaba posando el suelo vale entonces si nos fijamos yo 01:39:55
tengo varios zombies zombies o lo que queráis que están deambulando solos eso 01:40:01
no los controla nadie son inteligencias artificiales que además van andando y de 01:40:06
vez en cuando se paran y de pronto dice nada pues voy a otro lado y se pueden a patrullar y yo cuando 01:40:11
voy andando también y me acerco según ciertas condiciones me pueden ver y cuando me ven por 01:40:17
ejemplo este me va a ver enseguida ya cuando me pongo delante ves que ahora de pronto me está 01:40:23
siguiendo bueno se le va un poco la pinza pero cuando van me van siguiendo en todo momento hasta 01:40:28
que me ven y me empiezan a agredir vale ahí hay otro que está parado y no hace nada hasta que me 01:40:33
vea vale por lo mismo ahora me va a ver y ahora se puede correr y me intenta dar vale yo puedo 01:40:40
ir escapando y de hecho está configurado para que cuando me alejo 10 metros o más bueno aquí 01:40:48
no me va a dejar estoy intentando hacer le he puesto que pueda subir muchas pendientes y los 01:40:53
zombies no vale cuando llevo ya un tiempo cuando estoy a una distancia como que me han dejado de 01:40:58
ver, que yo he configurado, pues 01:41:04
a ver, zombie 01:41:06
voy aquí, pues ya de pronto como que 01:41:07
se han olvidado de mí y vuelven a hacer el patrullaje 01:41:10
que es otro estado, ¿vale? 01:41:12
Esta es la lógica que tiene en este 01:41:14
juego. Vamos a ver un poco cómo es 01:41:16
¿te parece? Sí. Esto ya te 01:41:18
digo que es más avanzado 01:41:20
y me interesa con que veáis 01:41:21
el vídeo que hay en el tema 01:41:23
el que está en la parte que hay que ver 01:41:25
la azul, ¿no? Lo saber más 01:41:28
como siempre, no son para el examen 01:41:29
Pero bueno, siempre tienen más información 01:41:32
Pero estos son, digamos, tres prefabs 01:41:34
De un... 01:41:36
Del zombie, ¿vale? Me voy a centrar en uno de ellos 01:41:38
Solo, voy a dejar uno 01:41:40
Pues los tres son iguales, en realidad 01:41:41
Yo he cogido otro 01:41:43
Personaje por ahí, de internet 01:41:45
Que de hecho creo que lo dejaba 01:41:47
Se puede... Se puede bajar 01:41:49
¿Vale? Y tiene su propio controller 01:41:51
Y este zombie 01:41:53
Y esto es una forma un poco distinta 01:41:55
De hacer el... 01:41:57
Una máquina de estados de animación, ¿vale? 01:41:59
Un animator controller que este en vez de basarse en, como no vamos a nosotros meter inputs de pues doy a una tecla o le doy a tal otra tecla, sino que va a ir haciéndolo autónomamente, tiene lo que en los apuntes se llaman estados, ¿vale? Porque es lo que se llama una máquina finita de estados, ¿vale? Una FSM. 01:42:01
entonces cada una de las acciones vale yo me pongo aquí selección me voy a desactivar estos 01:42:21
dos para que no moleste me centro en este vale yo cuando me meto en una animación vale no se 01:42:28
ve el personaje pero tengo el personaje parado el personaje caminando vale con los brazos 01:42:32
extendidos el ataque cuando me cuando está cerca de mí y otro que es que corre y vas a ver que lo 01:42:39
que he hecho es generar una variable de tipo int un parámetro del animator vale y para pasar de 01:42:47
uno a otro las condiciones son siempre que ese ese número puede ser entre el 0 y el 3 vale y yo 01:42:52
he ido como configurando este este zombi puede hacer cuatro cosas la primera es el 0 pero 0 1 01:43:00
2 3 4 cosas una estar quieto otra andar otra cuando me detecta correr hacia mí y otra atacar entonces 01:43:06
Entonces esto es lo de siempre, pues cuando empiezas a ver un poco cómo hacerlo, al empezar el juego he dicho, mira, va a haber cinco estados que voy a guardar en una variable llamada state. 01:43:13
El cero, pues lo que te he ido diciendo. Y lo que iremos detectando es, según se vayan cumpliendo condiciones, que se pase de uno a otro. 01:43:28
Si el estado es el 1 porque ya están dando y la distancia con el objetivo, que sería el personaje, es menor a 1,5, paso al estado 0. Si he llegado cerca de mi destino es cerca de... Y aparte se han generado cuatro ubicaciones en el mapa, aleatorias o las hemos puesto, que se han guardado en un array de posiciones. 01:43:35
Entonces, ¿qué es lo que va pasando? Que vamos a ir actualizando en ese array de posiciones que hay aquí, de cuatro posiciones que se han puesto en el espacio, y según arranca el juego hay un método que se llama, cuando pasan cuatro segundos de juego, en el invoke, un método que se ha creado que se llama Ronda Random. 01:44:01
Y si no se ha detectado al personaje, si hay una booleana que lo que hace es que se detecta al personaje o no 01:44:24
Que es cuando activa el estado 2, que es el que se pone a perseguir al personaje 01:44:33
Si no se ha detectado al personaje, pues habrá un momento que se pase al estado 1 01:44:37
Que por un lado animará en todo momento la animación de ese personaje 01:44:42
Me refiero a que en este caso extienda los brazos y camine 01:44:48
Pero aparte se le asigna un destino, ¿vale? Hacia el que tiene que ir. Va a coger de esos cuatro elementos de la RAI uno aleatorio que tenemos aquí y va a ser el destino hacia el que va a ir en todo momento. 01:44:51
¿Vale? Entonces, nuevamente, importante, para hacer todo lo relacionado, esto lo explica en el tema, con la inteligencia artificial hay que cargar una librería nueva, ¿vale? 01:45:05
Porque si no, por ejemplo, no se puede acceder a este NASMESH agent, que es el que sirve para acceder a las variables del NASMESH, que es el que define, igual que el character controller, cómo movemos un personaje con el character controller 01:45:19
En este caso es el que define cómo se mueve un agente, un GameObject de inteligencia artificial, que se moverá, esto también lo explica en el vídeo, en las mallas que se configuren como caminables. 01:45:32
¿Ves que hay partes del suelo que están con esta azul? Estas son las zonas por las que el personaje de inteligencia artificial, con el Namesh Agent que te he indicado antes, se va a poder mover. Por eso, por mucho que yo suba aquí arriba, el personaje, si no tiene forma de acceder por estos caminos, no va a poder caminar por ahí. 01:45:51
Entonces, con el setDestination, con este método que tenemos aquí, 01:46:15
lo que podemos ir es diciéndole sitios a los que tiene que ir el personaje. 01:46:20
En este caso, el zombie, que es el que tiene este script. 01:46:24
Y aquí vamos poniendo posiciones. 01:46:27
Y entonces el personaje va a ir hacia esa posición. 01:46:29
Y podemos ir cambiando las posiciones para que cuando llega una, 01:46:32
luego vaya otra. 01:46:36
¿Vale? Y por eso hay cuatro puntos que aleatoriamente se van a ir diciendo que sean el destino. ¿Vale? Luego, ¿cómo me detecta el personaje? Esto está en el propio enunciado del tema, lo cuenta, esto que hay aquí. 01:46:36
Pero básicamente es que hay un valor, un método que se llama distance que permite calcular distancias entre objetos. Entonces aquí tenemos por un lado la posición donde está el personaje que tiene este script que es el zombie y la posición del superviviente que en todo momento, la posición del superviviente se está calculando en todo momento con este transform que tenemos aquí, ¿vale? 01:46:58
que dice, busca 01:47:26
¿vale? 01:47:28
esto no sé si 01:47:30
os suena esto más avanzado, pero 01:47:31
igual que se pueden coger los componentes 01:47:34
de esto más o menos empecé a hablar un día 01:47:36
pero igual que se pueden coger los componentes 01:47:38
que están en el mismo objeto que tiene este script 01:47:40
¿vale? esto es lo que ya hemos hablado 01:47:42
en varias ocasiones 01:47:44
si hablamos de la 01:47:45
clase GameObject, ponemos un punto, hay diferentes 01:47:48
tipos de find, que lo que 01:47:51
hacen es, se puede por nombre 01:47:52
de objeto por encontrar 01:47:54
GameObjects que tienen un tag 01:47:56
los tags, recordad que son 01:47:57
estos tags 01:48:00
que tenemos aquí 01:48:02
y aquí le estamos diciendo, veis que el personaje 01:48:03
del superviviente tiene el tag player 01:48:06
o podemos crear otro nuevo, dice 01:48:08
busca, encuentra un objeto 01:48:10
en la escena que tenga este tag 01:48:12
y coge su transform y me lo guardas 01:48:14
en este 01:48:16
SubAerobotPost que es una variable 01:48:18
de tipo transform 01:48:20
es decir, guarda la información de un componente 01:48:22
transform entre otros las posiciones las rotaciones y la escala entonces eso en 01:48:24
todo momento ese survivor post va a estar cogiendo la posición del personaje 01:48:29
es verdad que aquí lo hace en el start coge esta survivor post y en algún 01:48:37
momento tiene que estar actualizando lo que es que si se detecta vale coge eso 01:48:43
Como hemos guardado el transform de ese SurvivorPost, en todo momento puede estar buscando dónde está la posición. 01:48:53
Una variable que hemos creado aquí va cogiendo en todo momento, porque este detectSurvivor, si os fijáis, es un método que se ejecuta cada fotograma. 01:49:06
Está en el update. Y cada fotograma va a estar calculando la distancia entre el propio zombie que tiene el script y el personaje. 01:49:15
Y por otro lado está cogiendo la dirección en la que está ese personaje. Esto también lo ponía en la práctica 5 para cuando se hacían las torretas que disparaban, para que vaya calculando en todo momento hacia dónde tiene que ir mirando la torreta, que es la posición del personaje. 01:49:22
Pero hay una forma de siempre saber hacia qué dirección tiene que ir apuntando un objeto, que es que si al objeto que tiene que encontrar le restamos la posición de sí mismo, te da el ángulo hacia el que mira, ¿vale? 01:49:44
No sé, esto lo venía explicado también en otro punto, pero si yo, por ejemplo, a ver, voy a poner un segundo, eje de coordenadas vacía. 01:49:59
Vale, un vector 2, por ejemplo, un vector 3, sería esto en tres ejes, pero voy a hacer que se vea un poquito mejor. 01:50:15
si yo tengo un personaje 01:50:22
que está en este punto 01:50:25
y vamos a decir que aquí 01:50:26
está el zombie 01:50:29
y aquí está el personaje 01:50:31
lo que estamos buscando 01:50:32
aquí es, para detectar al 01:50:35
personaje, tener tanto la distancia 01:50:37
por si se acerca mucho, ahora vemos 01:50:39
como el ángulo de visión 01:50:41
del zombie, para que si nos acercamos 01:50:43
por la espalda, tarde más en detectarnos 01:50:45
y al contrario, si estamos 01:50:47
justo delante de él, aunque estemos más lejos 01:50:49
Nos detecte. Entonces, imaginaos que tenemos, a ver, vuelvo aquí, tenemos este eje, ¿vale? Que es el espacio. Si yo le digo que me calcule la dirección del vector que hay entre este personaje y este, 01:50:51
lo que hay que coger es la posición de uno y restándole el otro, lo que nos da es la dirección que tiene, ¿vale? 01:51:11
¿Sí? Entonces, si hacemos esa operación con este vector hacia el personaje, que es un vector 3 que hemos creado nosotros, 01:51:18
es otra variable que hemos declarado aquí, lo que podemos es en todo momento ir viendo la dirección hacia la que está el personaje, ¿vale? 01:51:26
Por ejemplo, si yo pongo aquí un debug log para ir comprobando en todo momento qué vale el vector to player, que esta es la comprobación que siempre hay que ir viendo para ir comprobando que las cosas funcionan, ángulo zombie personaje. 01:51:34
más que un ángulo lo que nos va a dar 01:51:52
es un vector de 3 01:51:54
con eso 01:51:56
la dirección hacia la que mira un personaje 01:51:58
que esto se puede interpretar como un ángulo 01:52:00
realmente, los vectores 01:52:02
aparte de ser posiciones en el espacio 01:52:04
como el vector 3 que tenemos 01:52:06
aquí en posición 01:52:09
cuando por ejemplo le pasamos un vector 3 01:52:10
a un add force o a un 01:52:12
translate, lo que estamos diciéndole es 01:52:14
hacia qué dirección tiene que ir 01:52:17
añadiendo algo, entonces también sirve 01:52:19
para dar direcciones si ahora comprobamos el ángulo de mi personaje vamos a ir viendo 01:52:20
a ver porque tengo más cosas aquí vale no perdona porque detectaron de barlos 01:52:29
primero tengo que guardar importante y voy a darle a play vale y vais viendo que el ángulo 01:52:37
del personaje va variando según vamos moviendo de un lado a otro que voy a la izquierda en x se va 01:52:47
haciendo más pequeño y si voy hacia la derecha vale el ángulo con respecto al personaje veis 01:52:55
que va aumentando vale esto bueno en eje en eje z básicamente lo que estará calculando será un poco 01:53:00
la dirección y en y como siempre estamos en el mismo eje pues realmente no cambia la dirección 01:53:09
pero en eje Z básicamente lo que está calculando es un poco la distancia, un poco lo que hemos hecho aquí también, pero solo en uno de los ejes. 01:53:14
Si este vector, usamos este método de vector 3, que es el de ángulo, lo que podemos hacer es calcular en todo momento cuánto ángulo hay entre donde mira, en este caso el zombie, 01:53:22
el personaje zombie hacia adelante, donde tiene su mirada, con respecto al ángulo que hay de, es decir, la posición que tiene el que hemos calculado aquí antes, ¿vale? 01:53:36
Entonces, básicamente con esto, en esta variable de ángulo del cono, lo que estamos calculando es el ángulo que hay hacia donde mira el personaje y la diferencia que hay con este valor que hemos encontrado aquí. 01:53:49
No, eso que 01:54:04
tú lo que estás pretendiendo 01:54:06
es saber hacia dónde mira 01:54:09
el zombi para ver si te localiza 01:54:11
Siempre dentro de ese 01:54:13
ángulo de visión 01:54:15
Con esto, digamos 01:54:17
Sí, eso es lo que estamos buscando 01:54:19
Exacto 01:54:21
Todo el rato, ¿dónde estás tú? 01:54:22
Y a su vez 01:54:26
se mueve de posición 01:54:27
en posición cuando llega 01:54:29
una se traslada a la otra 01:54:31
con el otro script 01:54:33
eso es, con esto lo que estamos buscando 01:54:34
es digamos 01:54:37
el ángulo que hay, la dirección que hay 01:54:38
entre zombie y personaje 01:54:41
y aquí lo que estamos 01:54:43
haciendo es traducir 01:54:45
en grados, el ángulo en grados 01:54:47
de 0 a 180 que hay 01:54:50
entre donde está mirando el personaje 01:54:51
y la diferencia 01:54:53
es decir, si yo tengo 01:54:55
el personaje mirando para adelante 01:54:57
y el personaje está en su espalda 01:54:59
tiene un ángulo de 180. Esto devolvería 01:55:01
180. ¿Vale? Si yo estoy 01:55:04
a la derecha del personaje, este está mirando 01:55:06
para adelante, 01:55:08
esto está dando un valor que, al estar 01:55:10
a la derecha, pues sería de 90 01:55:12
grados. Guardaría un 90. 01:55:14
¿Por qué? Porque ahora lo que vamos a hacer es 01:55:16
conjugar... 01:55:18
Claro, que si la distancia 01:55:20
del personaje que hemos calculado aquí 01:55:22
es menor a una distancia que yo he definido 01:55:23
que sea, es una variable 01:55:26
que tengo aquí, de 20 metros. 01:55:28
Esto es lo que yo decida. 01:55:30
si el personaje está a 20 metros o menos, es decir, está más cerca de 20 metros del personaje, 01:55:31
y además el ángulo en el que me encuentro con respecto a la visión del zombi es menor a la que yo también he puesto aquí, 01:55:38
que es una que he declarado como 20, tiene 20 grados, digamos, de los 360 hacia la izquierda y hacia la derecha, 01:55:44
es decir, abarca una visión de 40 grados, que si esta distancia, esta referencia que hay entre donde mira el zombi 01:55:54
y donde está el personaje, que dan grados, es menor a los 20 grados de diferencia, entonces detecta al personaje. 01:56:03
Es decir, que si estoy en un campo de visión frente al zombi de 40 grados y además estoy a menos de 20 metros, 01:56:11
De pronto hay una booleana, que es la que va a ir dando condiciones aquí para ir yendo a un estado u otro, que irá delimitando qué hace el zombie, los comportamientos. Y esa booleana empieza por falsa, porque no nos ha detectado, pero cuando nos detecta, esa booleana pasa a ser verdadera. 01:56:19
Luego aparte, otra condición 01:56:37
Si esto no se cumple en todo momento 01:56:39
Mira a ver si la distancia del jugador 01:56:41
Independientemente del ángulo 01:56:43
Aquí ya da igual que estamos en su espalda 01:56:45
Si yo me acerco al zombie menos de 2 metros 01:56:47
También me detecta, me nota 01:56:49
Aunque no esté en el ángulo 01:56:51
¿Vale? Es decir 01:56:53
Esta condición es más restrictiva que esta 01:56:54
Porque esta se cumpliría siempre 01:56:57
En función de la distancia 01:56:59
Porque siempre 01:57:02
Entre 20 y 2 01:57:03
Pues siempre nos va a detectar 01:57:05
pero nos cargamos un poco la variable que es la condición del ángulo, ¿vale? 01:57:06
Y luego, si no se cumple nada de esto, pues significa que no me está detectando, 01:57:12
por tanto, sigue o estando en falso, ¿sí? 01:57:15
Y eso es lo que luego va haciendo que vayamos pasando de un estado a otro. 01:57:18
Esto es lo que hay que ir configurando. 01:57:22
Así que, bueno, esto es un poco cómo funciona luego eso. 01:57:27
Hay un método propio, ¿vale? 01:57:30
Igual del NATMES, que es este, bueno, primero accedemos al NATMES, que se refiere básicamente a este componente de NATMES agent, ¿vale? De ahí se cogen, NATMES agent, relación con NATMES agent. 01:57:32
Entonces yo guardo la información en agent, ¿vale? Y en todo momento con el set destination yo lo que voy haciendo es, este personaje que tiene este NATMES tiene que irse moviendo hacia donde yo le diga aquí en todo momento, que se puede ir actualizando, claro. 01:57:50
en todo momento va a ir calculando una meta 01:58:02
que puede ser, por ejemplo 01:58:05
la posición en cierto momento 01:58:08
va a ir cambiando 01:58:09
si detecta el personaje, cogerá 01:58:11
la posición del personaje y lo irá siguiendo 01:58:13
fotograma a fotograma, lo irá refrescando 01:58:15
y si no lo ha detectado 01:58:18
si no lo ha detectado, que es lo que pone aquí 01:58:19
ese destino 01:58:22
al que se tiene que ir moviendo el personaje es 01:58:23
uno de los puntos, las posiciones 01:58:25
de uno de los puntos que tengo aquí 01:58:28
esparcidos por el espacio 01:58:29
pues para que vaya de un punto a otro 01:58:31
¿vale? se podría hacer aleatorio pero aquí se han puesto 01:58:33
cuatro GameObjects vacíos 01:58:35
cuatro Empties y este 01:58:37
Zombie pues irá haciendo la ruta entre estos cuatro 01:58:39
¿vale? 01:58:41
que esos cuatro puntos son los que están 01:58:43
metidos en este 01:58:45
Array, entonces 01:58:47
que llega a un 01:58:49
a ver 01:58:51
que llega 01:58:52
lo tenemos aquí 01:58:54
bueno, es que he borrado 01:58:59
esto, ¿vale? que 01:59:01
en todo momento 01:59:02
el agent está yendo hacia el objetivo 01:59:05
lo que va a ir cambiando es que objetivo es ese 01:59:07
si por ejemplo 01:59:09
estamos en el modo 0 o 1 01:59:11
de los estados de que no me ha detectado 01:59:13
en el estado 1 ya irá andando 01:59:15
y pues 01:59:18
aleatoriamente cada cierto tiempo 01:59:19
va a ir 01:59:21
chequeando pues oye 01:59:22
ahora voy a sacar un número aleatorio 01:59:25
entre el 0 y la longitud 01:59:27
del array que el máximo es 3 01:59:29
y cógeme uno de esos tres 01:59:31
valores, ¿vale? y me lo guarda ese nene 01:59:34
y luego lo que va a dar es la posición 01:59:36
de el elemento de narray 01:59:38
que haya salido aleatoriamente antes 01:59:39
y el objetivo hacia el que tiene que ir es esa posición 01:59:41
entonces cada cierto tiempo se va a ir 01:59:43
reseteando para que el personaje 01:59:46
vaya a esa posición 01:59:48
el zombie, por eso cuando 01:59:49
empieza el juego, que empieza parado 01:59:52
porque digamos que este 01:59:54
cálculo de la ronda 01:59:56
se invoca para que empiece a los 4 segundos 01:59:57
y se vaya ejecutando cada cierto tiempo 01:59:59
Si el estado es 1, cada 20 segundos vuelve a ejecutar ese método de ronda random 02:00:01
Que es la que define nuevos estados de nuevas metas de las que hay aquí preconfiguradas 02:00:08
Entonces cuando llega una, cuando detecta que se ha alcanzado, se para ahí y a los 4 segundos dice 02:00:16
A ver a cuál voy aleatoriamente y va a esa 02:00:22
¿vale? 02:00:26
y el personaje se está moviendo por el 02:00:28
NADMES, no tiene ni RigidBody 02:00:30
ni nada más, se está 02:00:32
moviendo porque hay un setDestination 02:00:34
y se va moviendo a la velocidad que tenga 02:00:35
el NADMES aquí puesto 02:00:38
¿vale? 02:00:39
estas cosas 02:00:49
más o menos están 02:00:50
sugeridas o incluso hay 02:00:51
fragmentos de código iguales, por ejemplo esto del 02:00:53
ángulo de visión, etcétera, está 02:00:56
tal cual, si no me equivoco 02:00:58
en los enunciados 02:00:59
de la tarea 02:01:02
y nada, pues es ir 02:01:03
resolviendo 02:01:05
pues como se van 02:01:07
los problemas que van 02:01:10
surgiendo, como irlo resolviendo y hay que darle muchas 02:01:12
vueltas, eso seguro 02:01:14
por eso lo de inteligencia artificial lo he dejado un poco 02:01:15
en segundo plano porque sí que 02:01:18
tiene más vueltas, pero lo de mover el 02:01:19
personaje y el carácter controller y eso 02:01:22
sí que creo que es más 02:01:24
asequible y más con lo que hemos visto hoy 02:01:26
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
13
Fecha:
25 de abril de 2024 - 20:52
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
2h′ 01′ 34″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
995.35 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid