Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Primeros pasos en Unity: instanciar prefabs - 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:
Continuamos aprendiendo a usar los prefabs en Unity, en esta ocasión creando instancias mediante código.
Bien, hemos visto como un elemento prefab lo hemos cargado en la escena de forma manual, pero eso no es lo ideal o por lo menos no es lo más práctico, porque imaginémonos que voy a tener un NPC con toda su complejidad, sus hijos, su jerarquía, sus scripts asociados y voy a crear 100 NPCs en la escena y además les voy a decir que vayan saliendo de forma aleatoria.
00:00:06
lógicamente eso no lo puedo hacer manualmente
00:00:28
así que tengo que recurrir a código
00:00:30
vamos entonces a aprender
00:00:33
a cómo instanciar
00:00:35
prefabs directamente desde código
00:00:36
y es bastante fácil porque hay una función en Unity
00:00:38
que hace exactamente eso
00:00:40
pero no quiero asociar este script a un GameObject
00:00:42
en concreto porque lo que quiero hacer es crear
00:00:45
prefabs, no quiero
00:00:47
afectar a un GameObject en concreto por eso
00:00:48
y aquí es donde nos viene bien y lo usaremos muy a menudo
00:00:50
como ya he comentado alguna vez, los EntityObjects
00:00:52
los CreateEntity, te voy a llamar
00:00:54
prefab generator, bueno, lo podéis llamar
00:00:56
como queráis, pero esto se me sirve a mí para indicar
00:00:59
que esto no es más que un objeto vacío que sirve
00:01:00
para generar prefabs. Luego le asocio
00:01:03
un script, le he llamado igual que al GameObject
00:01:05
pero vamos, no tiene por qué llamarse igual
00:01:10
y voy a asociar ese script
00:01:11
como un componente de ese objeto vacío
00:01:13
vale, voy a
00:01:16
eliminar la función de update porque no voy
00:01:18
a generar prefabs en cada fotograma
00:01:20
eso sería una locura, para eso veremos las corrutinas en otro vídeo
00:01:21
pero sí que lo voy a hacer al principio, es decir
00:01:24
que cargue cuando empiece el script
00:01:25
entonces, ¿cómo se crea un prefab? pues bien
00:01:27
un proceso bastante sencillo, primero le tenemos que decir
00:01:29
cuál es nuestro prefab, es decir, cuál es el GameObject que contiene
00:01:31
el prefab, y para eso pues
00:01:33
crearemos una variable, en este caso
00:01:35
de tipo serializada, porque quiero acceder a ella desde Unity
00:01:37
de tipo GameObject, por supuesto, y le damos
00:01:39
un nombre, me da igual como MyPrefab
00:01:41
indicando que este es el prefab que vamos a
00:01:43
instanciar, lógicamente al ser serializada
00:01:45
si fuese pública también
00:01:47
ocurriría lo mismo, pues
00:01:49
efectivamente veremos, voy a
00:01:51
acceder, ahí está
00:01:53
me está pidiendo que cabre aquí un GameObject
00:01:54
que ya hemos visto varias veces, que realmente podemos buscarlo
00:01:57
o arrastrarlo, y en este caso lo voy a arrastrar
00:01:59
desde la ventana de proyecto, indicando
00:02:01
que este es el GameObject
00:02:03
que necesito
00:02:05
instanciar, y una vez que ya está vinculado
00:02:06
a esta variable, pues ya podemos usar
00:02:09
el método que viene por defecto en Unity
00:02:11
que es
00:02:13
instanciar, bueno, no lo voy a pronunciar porque
00:02:13
no quiero hacer el ridículo, pero es instanciar
00:02:16
en inglés, ahí lo tenemos
00:02:19
y bien, nos pide
00:02:20
el objeto que queremos instanciar
00:02:21
pues ahí lo tenemos, el que acabamos de crear
00:02:24
si le doy a play
00:02:26
si todo va bien
00:02:28
de repente aparecerá mi prefab aquí en el centro
00:02:29
ahí lo tenéis y para ahí de aquí se va
00:02:32
de hecho lo voy a repetir
00:02:34
fijémonos en la ventana de jerarquía como de repente
00:02:36
aparece el solo una instancia
00:02:38
ahí
00:02:40
eso ya está bien, pero lógicamente lo ideal es
00:02:41
decirle dónde quiero que lo instancie
00:02:44
para eso el método de hacerlo
00:02:46
es un poco dando una vuelta
00:02:48
pero el prefab necesita un objeto de referencia
00:02:50
es decir, decirle dónde tiene que instanciarse
00:02:52
y para eso necesita algún objeto
00:02:55
en la escena. Yo ya lo tengo.
00:02:56
Tengo este empty object, que realmente
00:02:58
no hace nada. Pues le puedo decir que una instancia aquí.
00:03:00
Para eso necesito su posición.
00:03:02
Y la posición en
00:03:04
Unity lo marca el componente
00:03:06
transformPosition.
00:03:08
Pues vamos a ello.
00:03:10
Voy a crear en el empty object, en el script
00:03:12
que genera el prefab.
00:03:14
De nuevo, también una variable
00:03:16
serializada para poder acceder a ella.
00:03:18
Y esta vez no es de tipo gameObject, sino de tipo transform.
00:03:20
Es decir, no necesito
00:03:22
un objeto completo, sino solo sus parámetros.
00:03:24
transform. Y le voy a llamar, por ejemplo, initPos, de posición inicial. Y ahora, aquí,
00:03:26
donde le he dicho que instancia el prefab, le digo coma y automáticamente me pide una
00:03:37
variable de tipo transform, que la tengo aquí, aunque todavía no la he asociado a ningún
00:03:42
objeto. Lo voy a hacer ahora, es decir, veis que aquí, donde ya había asociado el cubo,
00:03:47
ahora aparece una nueva variable que es posición inicial, una variable de tipo transform, y
00:03:53
le voy a decir qué parámetros de transform, pues el que tiene este objeto, y lo arrastro.
00:03:56
Es decir, que ahora mismo esa variable tiene las coordenadas bien y eso significa que ahora mismo si lanzo el juego veremos que la instancia aparecerá justo donde está ese objeto.
00:04:00
Ahí está. Y ya sale disparado.
00:04:10
Comprobación. Voy a mover mi objeto de referencia. Lo voy a poner aquí.
00:04:13
Pues ahora mismo si lo lanzo veremos que efectivamente se instancia ahí.
00:04:17
Pero vamos a hacer un pequeño truco de magia.
00:04:23
Yo he instanciado un objeto, pero ¿y si quiero instanciar, por ejemplo, 10 objetos cada uno en su posición?
00:04:26
Bien, ahora mismo le hemos dado dos parámetros al método de instanciar, que es qué objeto, qué prefab quiero instanciar y el segundo parámetro que era de tipo transform, indicándole todos los parámetros que tiene transform, es decir, el objeto de referencia, su posición y su rotación principalmente.
00:04:30
principalmente. Pero el método de instanciar permite otra modalidad, que es con tres parámetros.
00:04:48
El primero, el prefab que quiero instanciar. El segundo, ya no es un objeto de tipo transform,
00:04:56
sino un vector 3, es decir, una posición concreta en el espacio. Y tercero, una rotación
00:05:03
concreta en el espacio, en esta casa medido con cuaterniones, que los veremos más adelante,
00:05:11
pero que ahora nos tenemos que enfrentar a ellos.
00:05:15
Vamos a ver cómo podemos, por ejemplo, crear un objeto en la posición donde está el objeto de referencia,
00:05:18
un poquito más a la derecha, otro poquito más a la derecha, otro poquito más a la derecha,
00:05:25
así 10 prefabs seguidos que lógicamente se moverán a la par.
00:05:28
Vamos a hacerlo. En este caso, me voy un momentito al código,
00:05:31
y algo que tenemos que entender es que esto que le he pasado aquí como segundo parámetro
00:05:34
es una variable de tipo transform, es decir, que tiene tanto la posición como en rotación, escala,
00:05:37
es decir, que tiene todos esos parámetros.
00:05:42
Pero si yo le digo un atributo que es el de posición, esto ahora mismo es un vector 3.
00:05:45
Así que me está pidiendo ahora otro parámetro, porque le he dicho dónde está la posición,
00:05:50
pero le tengo que decir también cómo está la rotación.
00:05:53
Eso, insisto, es un cuaternión.
00:05:55
De momento, quedémonos en que la clase cuaternión admite un método muy práctico,
00:05:57
que es el de identity, que significa sin rotación.
00:06:04
Es decir, como si le pasásemos un objeto de tipo cuaternión, pero vacío, sin ningún tipo de rotación.
00:06:08
Si yo ahora mismo lanzo, veremos que la instancia aparecerá efectivamente en el objeto referencial.
00:06:14
Pues vale, y ahora quiero que prestemos atención que esto es un vector3.
00:06:19
Entonces, vamos a jugar con ello.
00:06:24
Voy a crear una variable, en este caso no me importa que sea privada, de tipo vector3.
00:06:26
Le voy a llamar newPosition, es decir, donde se va a desplazar en cada vuelta.
00:06:30
Y ya está.
00:06:35
Y ahora, vamos a aplicar algo de lo aprendido anteriormente en programación,
00:06:37
que es, por ejemplo, un bucle, mientras n sea 0, n sea menor que 10, súmale 1 a n,
00:06:41
si yo ahora mismo pegase esta línea tal cual está a ese bucle,
00:06:54
crearía 10 instancias, pero en el mismo sitio.
00:07:00
Vamos a comprobarlo y además lo vamos a mirar aquí fijándonos en la jerarquía,
00:07:03
porque de repente aparecerán 10, ahí están, mis 10 instancias, todas allí corriendo.
00:07:07
Lógicamente eso no es lo que yo quiero.
00:07:10
Lo que yo quiero es que en cada vuelta de mi bucle se cree una nueva posición.
00:07:11
El newPosition, por ejemplo, es igual a la posición inicial.
00:07:17
Por ejemplo, mi objeto en cada vuelta necesito sumarle una cantidad que vaya subiendo.
00:07:25
Pero es que ya la tengo aquí.
00:07:30
Porque aquí n vale 0, en la siguiente vuelta valdrá 1, en la siguiente vuelta valdrá...
00:07:31
Entonces, lo único que tengo que hacer es crear un vector3, una nueva instancia.
00:07:35
le voy a llamar cambio de posición
00:07:40
y esto es un nuevo vector 3
00:07:42
cuyo valor es
00:07:45
n, 0 y 0
00:07:48
que acabo de crear
00:07:50
un vector 3 en el que en la primera vuelta
00:07:51
valdrá 1, 0, 0
00:07:54
en la segunda vuelta valdrá 1, 0, 0
00:07:55
en la tercera 2, 0, 0
00:07:57
que significa que si yo a la posición inicial
00:07:58
le sumo ese vector 3
00:08:01
que acabo de crear en cada vuelta
00:08:04
pues en cada ciclo
00:08:05
se moverá 1 en x
00:08:08
la zona donde se instancia
00:08:09
mi prefab, y lógicamente cuando le hemos dicho
00:08:11
donde se tiene que instanciar
00:08:14
pues ya no es la posición del
00:08:15
objeto de referencia, sino
00:08:17
la nueva posición
00:08:19
vamos allá
00:08:21
si todo va bien, se instanciarán
00:08:24
10 prefabs
00:08:26
cada uno desplazado, uno en x
00:08:27
vamos a comprobarlo, ahí están
00:08:29
mira, parece un tren
00:08:31
en este caso he usado el valor
00:08:32
de n porque lo tenía aquí, pero de nuevo
00:08:36
Pero hemos aprendido cómo son los bucles, es decir, que si n no me gusta, pues yo puedo crear mi propia variable.
00:08:37
Es decir, que decirle que la variable y es igual a 0 y en cada vuelta de ciclo le digo que y es y más 2.
00:08:43
Os recuerdo que esto es un atajo de decirle que sume 2 a y.
00:08:53
Así que aquí en vez de decirle n, pues le puedo decir y y ahora mismo se instanciarán con 2 de diferencia en el eje x.
00:08:57
Vamos a ver. Ahí están.
00:09:04
y todos dos desplazándose a la misma velocidad.
00:09:07
Espero que entendamos toda la potencialidad que tiene esto,
00:09:11
porque imaginemos que, por ejemplo, tenemos un juego de plataformas
00:09:14
en las que lo que tengo que hacer es que cada cierto tiempo aparezca una plataforma nueva,
00:09:18
o un juego en el que tenemos que evitar obstáculos,
00:09:22
en los que les puedo decir que cada cierto tiempo aparezca un nuevo obstáculo,
00:09:25
pero necesito ponerlo en una situación, a lo mejor, aleatoria.
00:09:28
Me interesa que quede muy claro cómo es un prefab, sus potencialidades y cómo se instancia.
00:09:33
Y ya veremos qué de cosas podemos hacer con ello.
00:09:38
- Idioma/s:
- Autor/es:
- Álvaro Holguera
- Subido por:
- Alvaro H.
- Licencia:
- Reconocimiento - No comercial - Sin obra derivada
- Visualizaciones:
- 110
- Fecha:
- 25 de septiembre de 2024 - 0:30
- Visibilidad:
- Público
- Centro:
- CFP JOSÉ LUIS GARCI
- Duración:
- 09′ 42″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 246.45 MBytes