1 00:00:06,900 --> 00:00:14,439 Hay muchas formas de mover un objeto. Vamos a ver hoy la más sencilla porque me permite introducir otros conceptos como el de vectores o el del componente transform. 2 00:00:15,000 --> 00:00:24,519 Pero insisto, a lo largo del curso veremos muchísimas formas en las que podemos desplazar un objeto que al fin y al cabo es una parte fundamental en la creación de videojuegos. 3 00:00:25,219 --> 00:00:33,100 Para ello, me voy a ir a mi Unity. Tengo aquí una escena vacía. Voy a crear un objeto 3D. 4 00:00:33,100 --> 00:00:39,700 Pues vamos a desplazarlo, pero antes de desplazarlo quiero que nos fijemos que aquí en la ventana del inspector 5 00:00:39,700 --> 00:00:46,000 tenemos un componente que es el de Transform. Este componente es peculiar primero porque todos los objetos lo tendrán 6 00:00:46,000 --> 00:00:51,659 y no lo podemos quitar ni siquiera desactivar porque es el que ubica este objeto, este GameObject en el espacio tridimensional 7 00:00:51,659 --> 00:00:59,560 y tiene otra peculiaridad que ahora mismo no entenderemos muy bien pero que más adelante veremos lo útil que es 8 00:00:59,560 --> 00:01:03,460 que es que está integrada por defecto ya en el objeto, es decir, en la clase. 9 00:01:03,619 --> 00:01:06,780 Cuando creemos un script que crea una clase sobre este GameObject, 10 00:01:07,120 --> 00:01:11,959 veremos que la propiedad o el método transform está integrado. 11 00:01:12,079 --> 00:01:13,819 Es decir, que no lo tenemos que llamar de ninguna forma. 12 00:01:14,060 --> 00:01:16,099 Lo tenemos ya disponible y lo vamos a comprobar ahora mismo. 13 00:01:16,219 --> 00:01:19,379 De hecho, voy a crear un script para este GameObject. 14 00:01:19,819 --> 00:01:22,760 Os recuerdo siempre que tengáis muy ordenado todos vuestros assets. 15 00:01:23,040 --> 00:01:29,140 Le voy a llamar cubo para identificarlo bien y que sepamos que es el script que está vinculado a este cubo. 16 00:01:29,480 --> 00:01:35,659 Siempre tenemos que recordar que los scripts tienen que estar vinculados a un GameObject o si no, no se ejecutarán. 17 00:01:36,420 --> 00:01:37,359 Y lo voy a arrastrar. 18 00:01:38,560 --> 00:01:39,540 Vale, ahí lo tengo. 19 00:01:40,400 --> 00:01:45,480 Ya se me ha añadido como un componente más que de hecho puedo activar o desactivar. 20 00:01:45,819 --> 00:01:48,000 Antes de continuar voy a explicar un concepto. 21 00:01:48,000 --> 00:01:57,980 Esto que tenemos aquí en nuestro cubo, que dice posición, tengo una posición en X, lo voy a cambiar por 0, una posición en Y y otra posición en Z. 22 00:01:57,980 --> 00:02:04,280 Eso es una ubicación en el espacio cogiendo los tres parámetros tridimensionales, los tres ejes. 23 00:02:04,620 --> 00:02:08,580 Esos tres parámetros son un vector, concretamente un vector de tres dimensiones, es decir, un vector 3. 24 00:02:08,840 --> 00:02:24,819 Al haber heredado las clases de MonoVishevior, significa que yo puedo crear una clase de tipo, voy a ponerla de momento privada, tipo vector 3. 25 00:02:24,819 --> 00:02:28,400 Es decir, ahora mismo he creado una variable de tipo vector 3. 26 00:02:28,400 --> 00:02:47,840 Ahora le voy a dar un nombre a mi variable, por ejemplo, initPos, por ejemplo, le voy a llamar, es decir, la posición inicial en la que estoy. 27 00:02:48,460 --> 00:02:57,500 Recuerdo que esto es una clase, es una clase heredada, y cómo se declaraban las clases en programación orientada a objetos, es decir, cómo se instanciaban, con el comando new. 28 00:02:58,639 --> 00:03:03,139 Y ahí me va a aparecer, como podéis ver, me sugiere, lógicamente, que sea un vector3. 29 00:03:03,139 --> 00:03:12,259 Y ahora le añadimos los paréntesis, pero fijaros, esto es muy interesante, porque los vectores que son tridimensionales, para declararlos, nos piden tres parámetros. 30 00:03:12,439 --> 00:03:23,840 De hecho, ahí sale la ayuda de nuestro entorno de desarrollo, diciéndonos, nos pide, como podéis ver, un número float, es decir, un número con decimales que represente la posición en X, en el eje X, 31 00:03:24,699 --> 00:03:29,300 otro decimal que represente la posición en Y y otro decimal que represente la posición en Z. 32 00:03:29,300 --> 00:03:39,979 pues voy a dárselos. Le voy a decir que, por ejemplo, mi objeto esté en la posición X, 0, Y, 0 y Z, 0. 33 00:03:47,550 --> 00:03:50,490 Ahora ya puedo hacer con ella lo que quiera, es decir, usarla. 34 00:03:50,689 --> 00:03:55,370 Por ejemplo, un uso muy habitual, posicionar mi objeto en el escenario. 35 00:03:55,930 --> 00:04:03,349 Voy a comprobarlo. Ya os he dicho antes que el método, el componente transform de Unity que tenemos aquí 36 00:04:03,349 --> 00:04:07,250 ya viene incluido directamente en nuestra clase 37 00:04:07,250 --> 00:04:10,050 no otros, si quiero acceder a estos componentes 38 00:04:10,050 --> 00:04:13,389 veréis que no puedo acceder a ellos de forma fácil 39 00:04:13,389 --> 00:04:15,169 tengo que incorporarlos, ya veremos cómo 40 00:04:15,169 --> 00:04:17,709 pero la de transform, el de transform ya está incluido 41 00:04:17,709 --> 00:04:20,550 ¿qué significa? que si yo empiezo a escribir transform 42 00:04:20,550 --> 00:04:24,050 veis que me autocompleta, recordad que esto lo tengo que hacer en un método 43 00:04:24,050 --> 00:04:27,629 no lo puedo hacer en cualquier sitio, en este caso en el método star 44 00:04:27,629 --> 00:04:29,769 transform 45 00:04:29,769 --> 00:04:32,089 y si le pincháis veréis que me reconoce 46 00:04:32,089 --> 00:04:36,569 todos los atributos y los métodos disponibles en esta clase 47 00:04:36,569 --> 00:04:38,850 que ya está declarada, no hace falta que yo la declare. 48 00:04:40,290 --> 00:04:44,750 Y entonces ahí tenemos, por ejemplo, y no hace falta si queremos una chuleta 49 00:04:44,750 --> 00:04:47,810 fijaros, quiero cambiar su posición. 50 00:04:48,810 --> 00:04:54,069 Entonces si busco en los atributos de esta clase transform 51 00:04:54,069 --> 00:04:55,790 está el position. 52 00:04:56,889 --> 00:04:59,910 Y si nos fijamos, y además aquí te podemos tirar del ayudante de nuevo 53 00:04:59,910 --> 00:05:04,050 nos dice, este parámetro es un parámetro de tipo vector3, es decir 54 00:05:04,050 --> 00:05:07,910 no es una cadena de texto, no es un integrir, es un vector3 55 00:05:07,910 --> 00:05:11,129 como el que hemos creado, entonces yo le digo 56 00:05:11,129 --> 00:05:15,870 transform position, es decir, la posición en la que está aquí en el GameObject 57 00:05:15,870 --> 00:05:19,170 al que está asociado este script, y si le digo que es igual a 58 00:05:19,170 --> 00:05:24,829 por ejemplo, al que yo he creado aquí, ¿qué ocurrirá? 59 00:05:25,550 --> 00:05:29,629 pues que mi GameObject al que está asociado, es decir, mi cubo 60 00:05:29,629 --> 00:05:34,829 en cuanto lance el script se posicionará en las coordenadas 0, 0, 0. 61 00:05:34,910 --> 00:05:35,670 Lo voy a comprobar. 62 00:05:37,069 --> 00:05:42,029 ¿Cómo? Moviendo mi cubo en las tres coordenadas veo que ahora estos son los parámetros. 63 00:05:42,730 --> 00:05:50,470 Pero si todo va bien, en cuanto lance el script se moverá a la posición 0, 0, 0, como podéis ver. 64 00:05:51,230 --> 00:05:51,949 Vayamos poco a poco. 65 00:05:52,170 --> 00:05:57,350 Ya sabemos que los vectores 3 es un tipo de clase que pide tres parámetros, 66 00:05:57,350 --> 00:06:00,470 x, y y z, lógicamente los vectores 2 piden solo 2 67 00:06:00,470 --> 00:06:02,550 porque son bidimensionales 68 00:06:02,550 --> 00:06:05,089 que una vez que los tenemos declarados 69 00:06:05,089 --> 00:06:06,769 y una vez que los tenemos a nuestra disposición 70 00:06:06,769 --> 00:06:09,949 pues podemos asignárselos a la posición, por ejemplo, de un objeto 71 00:06:09,949 --> 00:06:11,930 en principio del que tenemos asociado 72 00:06:11,930 --> 00:06:14,250 pero ahora veremos que también lo podemos asociar a objetos 73 00:06:14,250 --> 00:06:16,550 a otros GameObjects que tenemos en la escena 74 00:06:16,550 --> 00:06:19,870 antes de hacer eso, vamos a mover este objeto 75 00:06:19,870 --> 00:06:21,089 ¿cómo se mueve un objeto? 76 00:06:21,810 --> 00:06:23,110 insisto, hay muchas formas 77 00:06:23,110 --> 00:06:25,110 una de ellas es, por ejemplo, aplicando fuerzas 78 00:06:25,110 --> 00:06:32,829 Y cuando tengamos gravedad, por ejemplo, en nuestra escena, si le tiramos una fuerza a alguien, también con un vector, 79 00:06:32,930 --> 00:06:38,850 porque los vectores también pueden determinar vectores de movimiento o de fuerza, pues lo desplazaremos. 80 00:06:39,089 --> 00:06:43,670 Pero aquí lo vamos a hacer un poco a las bravas, entre otras cosas también para entender el concepto. 81 00:06:43,810 --> 00:06:51,449 Por ejemplo, ¿y si yo le digo que en cada fotograma se desplace en una dirección, a lo largo de un eje? 82 00:06:52,029 --> 00:06:55,550 Pues bien, para eso tenemos que entender otra cosa, y es que los vectores se pueden sumar. 83 00:06:55,970 --> 00:06:59,230 Es decir, yo puedo coger un vector, el que he creado, por ejemplo, 0, 0, 0, 84 00:06:59,230 --> 00:07:04,370 y poner otro vector en otra posición y sumar los dos. 85 00:07:04,629 --> 00:07:09,370 ¿Qué obtendré? Pues para verlo, vamos a ver algo muy interesante. 86 00:07:10,290 --> 00:07:16,850 Es que os he comentado que yo en todo momento puedo actuar sobre la posición de mi objeto. 87 00:07:17,689 --> 00:07:20,209 Pero no solo eso, sino que también puedo obtenerla. 88 00:07:20,209 --> 00:07:26,930 ejemplo, voy a declarar 89 00:07:26,930 --> 00:07:28,790 una variable 90 00:07:28,790 --> 00:07:31,050 de tipo 91 00:07:31,050 --> 00:07:33,050 vector3 92 00:07:33,050 --> 00:07:34,389 que se llama initPos 93 00:07:34,389 --> 00:07:36,170 y no le he dado ningún valor, lógicamente 94 00:07:36,170 --> 00:07:38,209 pero se lo voy a dar ahora 95 00:07:38,209 --> 00:07:40,810 y se lo voy a dar, cuidado, esto lo tengo que hacer dentro del método 96 00:07:40,810 --> 00:07:42,689 star o de cualquier otro método, le voy a dar 97 00:07:42,689 --> 00:07:44,430 la que tengo yo ahora mismo 98 00:07:44,430 --> 00:07:47,089 ¿vale? entonces le voy a decir 99 00:07:47,089 --> 00:07:47,709 que 100 00:07:47,709 --> 00:07:50,250 la variable que acabo de crear 101 00:07:50,250 --> 00:07:52,029 su valor es igual a 102 00:07:52,029 --> 00:08:02,769 Y le tengo que dar un valor de vector3. Veréis que si le doy un valor, por ejemplo, de un número entero, me lo dirá. Me dice, no, no, esto lo que me está pidiendo es una variable de vector3. 103 00:08:04,569 --> 00:08:17,350 Pero sabemos que mi posición, esto, hace referencia a mi posición inicial, que antes era declarado, pero yo en cualquier momento puedo ir a ella y preguntarle. 104 00:08:17,350 --> 00:08:20,790 Le digo, oye, ¿cuál es mi posición? Pues mi posición en la que estoy ahora mismo, 105 00:08:21,069 --> 00:08:23,009 asígnaselo a ese vector 3 que he creado. 106 00:08:23,670 --> 00:08:27,790 Y lo voy a mandar a la pantalla para ver si efectivamente todo funciona. 107 00:08:29,189 --> 00:08:31,750 ¿Ves que ahora no lo estoy moviendo al iniciar el juego? 108 00:08:31,870 --> 00:08:33,850 Sencillamente le estoy diciendo que me diga cuál es mi posición. 109 00:08:33,850 --> 00:08:41,169 Voy a lanzar el script y la gente me dirá que mi posición es esta. 110 00:08:42,169 --> 00:08:44,330 Vamos a comprobarlo. Correcto. 111 00:08:44,330 --> 00:08:51,570 voy un paso más allá y si le digo que esta posición me la diga en el 112 00:08:51,570 --> 00:08:54,870 método update recordad que el método update lo que hace es ejecutarse en cada 113 00:08:54,870 --> 00:09:01,870 fotograma si yo le digo la variable de posición la de nipos es en la posición 114 00:09:01,870 --> 00:09:06,730 en la que estoy en este momento dámela escríbeme la en la consola que ocurre 115 00:09:06,730 --> 00:09:10,990 que si yo modifico o muevo ese elemento me lo estará diciendo constantemente 116 00:09:10,990 --> 00:09:14,830 cuál es su posición. Vamos a comprobarlo. En principio empezará por la posición 117 00:09:14,830 --> 00:09:23,190 inicial, por esa, pero en cuanto yo empiece a mover el objeto, vemos, esto no 118 00:09:23,190 --> 00:09:28,330 varía, está en la misma posición, pero si yo desplazo el objeto en cualquier eje, 119 00:09:29,129 --> 00:09:34,330 si nos fijamos, los datos aquí van cambiando en función de dónde lo 120 00:09:34,330 --> 00:09:38,850 desplace yo. Bien, acabamos de descubrir por qué es muy importante o es muy útil 121 00:09:38,850 --> 00:09:41,950 poder hacer modificaciones en nuestros objetos mientras se está ejecutando el 122 00:09:41,950 --> 00:09:46,889 juego porque así vemos cómo afecta a nuestros scripts directamente y 123 00:09:46,889 --> 00:09:50,129 también porque es importante que cuando termine esa ejecución vuelve a la 124 00:09:50,129 --> 00:09:54,169 posición en la que estaba antes para que digamos todo lo que haya hecho no haya 125 00:09:54,169 --> 00:09:56,470 tomado valor sino que sólo ha sido como una prueba