Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Introducción a Unity. Mover objetos (parte 1) - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Aplicaremos conceptos como el uso de vectores o el componente Transform para desplazar objetos por nuestro escenario
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
00:00:17
o el del componente transform. Pero insisto, a lo largo del curso veremos muchísimas formas en las que podemos
00:00:22
desplazar un objeto que al fin y al cabo es una parte fundamental en la creación de videojuegos.
00:00:29
Para ello, me voy a ir a mi Unity. Tengo aquí una escena vacía. Voy a crear un objeto 3D.
00:00:35
Pues vamos a desplazarlo, pero antes de desplazarlo quiero que nos fijemos que aquí en la ventana del inspector
00:00:43
tenemos un componente que es el de Transform. Este componente es peculiar primero porque todos los objetos lo tendrán
00:00:49
y no lo podemos quitar ni siquiera desactivar porque es el que ubica este objeto, este GameObject en el espacio tridimensional
00:00:55
y tiene otra peculiaridad que ahora mismo no entenderemos muy bien pero que más adelante veremos lo útil que es
00:01:01
que es que está integrada por defecto ya en el objeto, es decir, en la clase, cuando creemos un script que crea una clase sobre este GameObject,
00:01:09
veremos que la propiedad o el método transform está integrado, es decir, que no lo tenemos que llamar de ninguna forma.
00:01:17
Lo tenemos ya disponible y lo vamos a comprobar ahora mismo. De hecho, voy a crear un script para este GameObject.
00:01:24
Os recuerdo siempre que tengáis muy ordenado todos vuestros assets. En este caso voy a crear aquí un script.
00:01:29
Pero además lo voy a hacer de una forma diferente a como lo he hecho hasta ahora.
00:01:35
Lo que voy a hacer es, directamente sobre la carpeta sobre la que quiero crear el script,
00:01:38
le damos a crear, create, y veremos que la primera de las opciones que nos aparece,
00:01:43
aparte de la carpeta nueva, es un script en C Sharp.
00:01:48
Es decir, que lo tenemos ahí y le damos un nombre, por supuesto.
00:01:51
Os recuerdo que va a crear una clase con el nombre del archivo.
00:01:54
Es decir, que si hacemos caso de las convencionalidades que tenemos en programación,
00:01:57
pues debería ser con la primera letra en mayúscula.
00:02:02
Le voy a llamar cubo, para identificarlo bien y que sepamos que es el script que está vinculado a este cubo.
00:02:04
De momento no está vinculado, siempre tenemos que recordar que los scripts tienen que estar vinculados a un GameObject o si no, no se ejecutarán.
00:02:11
Así que voy a seleccionar mi cubo y lo voy a arrastrar, el script, a donde pone Add Component, a ese apartadito.
00:02:19
Vale, ahí lo tengo. Ya se me ha añadido como un componente más que de hecho puedo activar o desactivar.
00:02:30
Lo gente lo quiero activo. Vale, voy a ejecutar, voy a editar este script.
00:02:38
Antes de continuar voy a explicar un concepto, que es el de vectores.
00:02:42
No nos preocupemos demasiado porque dedicaremos un capítulo exclusivamente a vectores.
00:02:47
Y hablaremos de cómo son, de qué nos permiten, de qué operaciones podemos hacer con ellos.
00:02:51
En fin, es algo bastante más complejo como para hablar de ello en este vídeo.
00:02:55
Pero no está de más que sepamos ya lo que es. No es más que una ubicación en el espacio.
00:02:59
Es decir, esto que tenemos aquí en nuestro cubo, que dice posición, tengo una posición en x, lo voy a cambiar por 0,
00:03:05
una posición en y y otra posición en z. Eso es una ubicación en el espacio cogiendo los tres parámetros tridimensionales,
00:03:13
los tres ejes y sus valores, por supuesto. Entonces eso es un vector.
00:03:21
Es algo más complejo que eso, pero quedémonos con eso.
00:03:26
Esos tres parámetros son un vector, concretamente un vector de tres dimensiones, es decir, un vector tres.
00:03:28
También existen los vectores de dos dimensiones.
00:03:33
Voy a poner un ejemplo.
00:03:36
Como bien sabemos, y si no lo recordamos, por el mero hecho de utilizar una clase, la que he creado,
00:03:38
que hereda de otra clase que nos incluye Unity, pues automáticamente tengo a mi disposición muchas otras clases
00:03:46
que yo no he creado pero que existen ahí. Aprovecho para recordaros que tenemos el
00:03:54
scripting reference de Unity donde podemos buscar la información sobre cualquier elemento
00:03:59
de nuestros scripts. Si tenemos dudas podemos buscar, por ejemplo, le digo, oye, ¿qué
00:04:04
sabemos de los vectores 3? Entonces Unity nos hará una búsqueda y nos dirá todo lo
00:04:09
que tenemos que saber de los vectores 3, que es lo que vamos a usar ahora, desde qué son
00:04:14
hasta sus métodos, esto recordad que son métodos
00:04:18
y sus atributos, en fin, como podéis ver
00:04:21
tenemos muchas cosas relacionadas con los vectores 3
00:04:24
muchas más de las que vamos a ver ahora
00:04:27
al haber heredado las clases de MonoBehaviour
00:04:29
significa que yo puedo crear una clase
00:04:33
de tipo, voy a ponerla de momento privada
00:04:38
¿qué tipo de clase?
00:04:43
pues esta no es ni cadena de texto
00:04:47
ni booleana es tipo vector3
00:04:49
es decir, ahora mismo he creado una variable de tipo vector3
00:04:53
ahora le voy a dar un nombre a mi variable, por ejemplo
00:04:56
initPost, por ejemplo, le voy a llamar, es decir, la posición inicial en la que estoy
00:05:00
y ahora
00:05:07
recuerdo que esto es una clase, es una clase heredada y como se declaraban las clases
00:05:11
en programación orientada a objetos, es decir, como se instanciaban
00:05:15
con el comando new
00:05:19
y ahí me va a aparecer, como podéis ver
00:05:21
me sugiere, lógicamente, que sea
00:05:23
un vector 3. Y ahora le añadimos
00:05:25
los paréntesis, pero fijaros, esto es muy interesante
00:05:27
porque los vectores
00:05:29
que son tridimensionales, para declararlos
00:05:31
nos piden tres parámetros
00:05:33
de hecho, ahí sale la ayuda de nuestro
00:05:35
entorno de desarrollo, diciéndonos
00:05:37
que está pidiendo
00:05:39
parámetros. Nos pide
00:05:40
tres parámetros. Como es un vector
00:05:43
de tres dimensiones, nos pide
00:05:45
como podéis ver, un número float, es decir, un número con decimales
00:05:47
que represente la posición en X, en el eje X
00:05:51
otro decimal que representa la posición en Y y otro decimal que represente la posición en Z
00:05:54
pues voy a dárselos, le voy a decir que por ejemplo
00:05:59
mi objeto esté en la posición X
00:06:02
0, Y 0 y Z 0
00:06:06
ahora mismo acabo de declarar una variable llamada initPos
00:06:10
que es una variable de tipo vector3
00:06:15
y lo que ha hecho es crear una nueva instancia de esa clase
00:06:18
de la clase vector3 con estos parámetros
00:06:23
x0 y 0, z0
00:06:25
ahora ya puedo hacer con ella lo que quiera
00:06:28
es decir, usarla, por ejemplo
00:06:31
un uso muy habitual
00:06:33
posicionar mi objeto en el escenario
00:06:35
voy a comprobarlo
00:06:37
ya sabemos que el método start lo que hace es ejecutarse cuando lanzo el juego
00:06:38
y yo le puedo decir, y aquí viene lo interesante
00:06:43
ya os he dicho antes que el método, el componente transform
00:06:45
de Unity que tenemos aquí
00:06:50
ya viene incluido directamente en nuestra clase
00:06:53
no otros, si quiero acceder a estos componentes
00:06:57
veréis que no puedo acceder a ellos de forma fácil, tengo que incorporarlos
00:07:01
ya veremos cómo, pero la de transform ya está incluido
00:07:06
¿qué significa? que si yo empiezo a escribir transform
00:07:09
veis que me autocompleta, recordad que esto lo tengo que hacer en un método
00:07:13
no lo puedo hacer en cualquier sitio, en este caso en el método start
00:07:16
transform, y si le pincháis veréis que me reconoce
00:07:20
todos los atributos y los métodos disponibles en esta clase
00:07:24
que ya está declarada, no hace falta que yo la declare
00:07:29
y entonces pues ahí tenemos, por ejemplo, y no hace falta si queremos
00:07:31
una chuleta, fijaros, quiero cambiar su posición
00:07:36
Entonces, si busco entre los atributos de esta clase transform, está el position.
00:07:40
Y si nos fijamos, y además aquí te podemos tirar del ayudante de nuevo, nos dice, este parámetro es un parámetro de tipo vector3, es decir, no es una cadena de texto, no es un integrir, es un vector3, como el que hemos creado.
00:07:53
Entonces yo le digo transform position, es decir, la posición en la que está aquí el GameObject al que está asociado este script.
00:08:07
Y si le digo que es igual a, por ejemplo, al que yo he creado aquí, ¿qué ocurrirá?
00:08:14
Pues que mi GameObject al que está asociado, es decir, mi cubo, en cuanto lance el script se posicionará en las coordenadas 0, 0, 0.
00:08:27
Lo voy a comprobar. ¿Cómo? Moviendo mi cubo en las tres coordenadas veo que ahora estos son los parámetros, pero si todo va bien, en cuanto la hace el script se moverá a la posición 0, 0, 0, como podéis ver.
00:08:37
Vayamos poco a poco.
00:08:54
Ya sabemos que los vectores 3 es un tipo de clase que pide tres parámetros, x, y y z.
00:08:55
Lógicamente los vectores 2 piden solo dos porque son bidimensionales.
00:09:01
Una vez que los tenemos declarados y a nuestra disposición, podemos asignárselos a la posición de un objeto.
00:09:06
En principio del que tenemos asociado, pero ahora veremos que también lo podemos asociar a otros GameObjects que tenemos en la escena.
00:09:13
Antes de hacer eso, vamos a mover este objeto.
00:09:20
¿Cómo se mueve un objeto?
00:09:22
Insisto, hay muchas formas
00:09:24
Una de ellas es por ejemplo aplicando fuerzas
00:09:26
Y cuando tengamos gravedad, por ejemplo, en nuestra escena
00:09:28
Si le tiramos una fuerza a alguien, también con un vector
00:09:31
Porque los vectores también pueden determinar vectores de movimiento o de fuerza
00:09:35
Pues lo desplazaremos
00:09:39
Pero aquí lo vamos a hacer un poco a las bravas
00:09:41
Entre otras cosas también para entender el concepto
00:09:43
Por ejemplo, ¿y si yo le digo que en cada fotograma se desplace en una dirección?
00:09:46
a lo largo de un eje.
00:09:52
Pues bien, para eso tenemos que entender otra cosa y es que los vectores se pueden
00:09:54
sumar.
00:09:58
Es decir, yo puedo coger un vector, el que he creado, por ejemplo, 0, 0, 0
00:09:58
y poner otro vector en otra posición y sumar los dos. ¿Qué obtendré? Pues para
00:10:03
verlo
00:10:08
vamos a ver algo
00:10:09
muy interesante
00:10:11
es que os he comentado que
00:10:13
yo en todo momento puedo
00:10:15
actuar sobre la posición de mi objeto
00:10:17
Pero no solo eso, sino que también puedo obtenerla.
00:10:20
Ejemplo.
00:10:24
Voy a declarar una variable de tipo vector3 que se llama initPos.
00:10:29
Y no le he dado ningún valor, lógicamente.
00:10:37
Pero se lo voy a dar ahora.
00:10:40
Y se lo voy a dar, cuidado, esto lo tengo que hacer dentro del método start o de cualquier otro método.
00:10:41
Le voy a dar cuál, la que tengo yo ahora mismo.
00:10:45
¿Vale?
00:10:48
Entonces le voy a decir que la variable que acabo de crear, su valor es igual a, y le tengo que dar un valor de vector3.
00:10:48
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.
00:10:57
Pero sabemos que mi posición, esto, hace referencia a mi posición inicial, que antes he redeclarado, pero yo en cualquier momento puedo ir a ella y preguntarle, digo, oye, ¿cuál es mi posición? Pues mi posición en la que estoy ahora mismo, asígnaselo a ese vector 3 que he creado.
00:11:05
y lo voy a mandar a la pantalla para ver si efectivamente
00:11:26
todo funciona
00:11:28
ves que ahora no lo estoy moviendo al iniciar el juego
00:11:30
sencillamente le estoy diciendo que me diga cuál es mi posición
00:11:34
voy a lanzar el script
00:11:36
y la gente me dirá que mi posición es
00:11:39
esta, vamos a comprobarlo
00:11:43
correcto, voy un paso más allá
00:11:46
y si le digo
00:11:49
que esta posición me la diga en el método update
00:11:50
recordad que el método update lo que hace es ejecutarse en cada fotograma
00:11:58
24, 48, 30 fotogramas por segundo al que se ejecute el juego
00:12:01
si yo le digo
00:12:05
la variable de posición, la de initPos
00:12:07
es en la posición en la que estoy en este momento
00:12:11
dámela, escríbemela en la consola
00:12:13
¿qué ocurre? que si yo modifico o muevo ese elemento
00:12:17
me lo estará diciendo constantemente cuál es su posición
00:12:21
vamos a comprobarlo
00:12:23
esto va a ser un poco loco porque
00:12:25
lógicamente me lanzará un montón de
00:12:27
imágenes de datos a consola
00:12:29
en principio empezará
00:12:31
por la posición inicial, por esa
00:12:33
pero
00:12:35
en cuanto yo empiece a mover
00:12:37
el objeto
00:12:39
vemos, esto no varía, está en la misma
00:12:40
posición, pero si yo desplazo el objeto
00:12:43
en cualquier eje
00:12:46
si nos fijamos
00:12:47
los datos aquí van cambiando
00:12:49
en función de donde lo
00:12:51
desplace yo. Bien, acabamos de descubrir
00:12:53
por qué es muy importante o es
00:12:56
muy útil poder hacer modificaciones en nuestros
00:12:58
objetos mientras se está ejecutando el juego
00:13:00
porque así vemos cómo afecta
00:13:01
a nuestros scripts directamente
00:13:03
y también por qué es importante que cuando termina
00:13:06
esa ejecución vuelve a la posición
00:13:08
en la que estaba antes para que digamos
00:13:09
todo lo que haya hecho no haya tomado
00:13:11
valor sino que solo ha sido como una prueba
00:13:14
pues hagamos una cosa, antes de hacerla voy a
00:13:15
hacer un
00:13:18
pequeño truco de magia que es sumar un vector
00:13:18
De hecho, voy a hacer una cosa también para que sepamos que un vector, el que he creado antes, es privado.
00:13:26
Yo no tengo acceso a él, pero yo puedo crear uno que sea no público,
00:13:35
pero sí que puedo acceder a él a través de la interfaz de Unity, como ya vimos.
00:13:39
Una variable serializada de tipo vector3, que le voy a llamar destinationPosition, es decir, hacia dónde se dirigirá.
00:13:44
Y ya está. Y no le doy nada más, no le doy ningún valor. ¿Por qué?
00:13:53
Y esto es lo bueno de las variables serializadas, igual que de las variables públicas, ya lo tenemos que saber, es que me permite dar los valores directamente en el inspector.
00:13:56
Vemos que aquí nos aparece esa variable creada y como es de tipo vector3 nos aparece con sus tres parámetros. Maravilloso.
00:14:06
¿Eso qué significa? Que yo le voy a decir, por ejemplo, desplázate 1 en x, 0 en y y 0 en z.
00:14:14
Esto que en realidad se correspondería con posición 1, 0, 0, si yo lo sumo, de hecho voy a poner mi cubo en la posición 0, 0, 0.
00:14:20
Si yo cojo el vector en el que estoy ahora mismo y le sumo este otro vector, ¿qué me dará? Pues vamos a comprobarlo.
00:14:30
Y así comprobamos que efectivamente podemos sumar vectores.
00:14:40
De hecho, voy a crear otro vector, este también lo voy a crear privado, no lo necesito, que es finalPosition, por ejemplo, de tipo vector3, se va a llamar finalPosition.
00:14:45
Entonces, aquí tengo la posición inicial, es el vector3 en el que estoy cuando arranco.
00:15:03
pues la posición final, que es otro vector 3
00:15:10
va a ser la suma de la posición inicial
00:15:15
más el... lo he puesto con minúscula
00:15:20
lo voy a corregir ahora mismo. Es decir, tengo la posición
00:15:26
inicial, que va a ser en la que empieza el objeto. Tengo la
00:15:34
de destino, que esa la voy a añadir a través de la interfaz de Unity
00:15:37
que es la que se va a sumar. Y tengo
00:15:41
la posición final
00:15:46
que va a ser la suma de una y otra
00:15:49
¿y cuál va a ser esta?
00:15:52
pues lo vamos a comprobar ahora mismo
00:15:54
porque lo voy a mandar a pantalla
00:15:55
voy a limpiar la consola
00:15:56
si lo lanzo
00:15:59
recordamos, nuestro cubo está en posición 0, 0, 0
00:16:00
la de destino será
00:16:04
1, 0, 0
00:16:07
1, 0, 0
00:16:08
¿y cuál es la posición final?
00:16:09
pues ahí me lo dice
00:16:13
1, 0, 0
00:16:14
Es la suma entre uno y otro. De hecho, si yo, por ejemplo, le digo que el vector que voy a sumar va a ser de 10, 5, 2 y la posición inicial es de 2, 1, 0, pues si lanzo, ¿cuál es mi vector final?
00:16:15
Ahí lo tenemos. 12, 6, 2. ¿Por qué? Porque es la suma de 2 más 10, de 1 más 5, de 0 a 2.
00:16:36
- Idioma/s:
- Materias:
- Informática, Imagen y Sonido
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Segundo Curso
- Autor/es:
- Álvaro Holguera
- Subido por:
- Alvaro H.
- Licencia:
- Reconocimiento - No comercial - Compartir igual
- Visualizaciones:
- 183
- Fecha:
- 14 de septiembre de 2021 - 22:54
- Visibilidad:
- Público
- Enlace Relacionado:
- https://laultimapregunta.com/me/aula/apuntes?mod=deim#deim
- Centro:
- Sin centro asignado
- Duración:
- 16′ 45″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 326.05 MBytes