#4 Crear y Destruir GameObjects en tiempo de ejecución. [Serie Fundamental de Unity]

Por GameDevTraum

Introducción

En este artículo vamos a estudiar cómo crear y destruir GameObjects en tiempo de ejecución. Lograr esto es muy importante para crear juegos, porque nos permite colocar objetos cuando y donde queramos y poder posteriormente destruirlos.

Página principal del proyecto

Antes de empezar te invito a ver el video que hice para este artículo.

Procedimiento

En este desafío vamos a usar la estación Creation/Destruction que se ve en la figura 1, para hacer que una pequeña Lucy aparezca y desaparezca de manera cíclica mientras el juego se desarrolle.

proyecto unity 3d, modelo 3d hecho en blender de una capsula con una persona pequeña en el interior. en la pared un cartel que dice: creation/destruction station". metodos instantiate y destroy en unity
Fig. 1: Estación Creation Destruction del GameDevLab.

proyecto unity 3d, modelo 3d hecho en blender de una capsula con una persona pequeña en el interior. metodos instantiate y destroy en unity
Fig. 2: Estación Creation Destruction del GameDevLab. Lucy aparece por unos segundos.

proyecto unity 3d, modelo 3d hecho en blender de una capsula, la persona del interior ha desaparecido. metodos instantiate y destroy en unity
Fig. 3: Estación Creation Destruction del GameDevLab. Lucy desaparece.

En las figuras 2 y 3 se ilustra el ciclo de aparición y desaparición de Lucy.

Fig. 4: Campos del Script CreationDestruction correspondiente al desafío del video 4 de la Serie Fundamental.

Las figuras 1 y 2 muestras los campos y componente en el inspector del Script “CreationDestruction”.

Fig. 5: El GameObject “#4 Creation Destruction” tiene asignado el Script Creation Destruction. Esto se ve en el inspector.

El desafío consiste en completar los métodos createObject() y destroyObject() del Script.

Resolución

Creación del objeto

Para la creación del objeto vamos a utilizar el método Instantiate, este método está definido en la clase MonoBehaviour que por defecto es la super clase o clase padre de todo nuevo Script que hacemos en Unity.

En este momento no tengo suficientes artículos ni videos sobre programación orientada a objetos para aclarar lo de las super clases, sé que eventualmente los haré, pero por ahora si quieres saber más investiga el tema Herencia en programación orientada a objetos.

El método Instantiate tiene más de diez variantes, pero en todas básicamente necesitamos dos cosas: el objeto que vamos a crear y en qué punto del espacio lo vamos a poner.

Haz clic aquí para leer un artículo sobre métodos en programación.

En este caso el objeto que vamos a crear lo indicamos utilizando el prefab SmallLucy que se encuentra en la carpeta Internal Use, este prefab lo colocamos en el espacio Object To Create en el inspector, como se observa en la figura 5.

Para indicar el punto del espacio donde vamos a colocar el objeto nuevo vamos a usar un GameObject llamado Position que está en la jerarquía. También lo asignamos en el inspector (figura 5).

Vamos a utilizar una variante del método Instantiate que creará el objeto y lo colocará en la jerarquía como hijo del GameObject que le indiquemos. Esto quiere decir que nuestro objeto aparecerá en la posición del GameObject padre (Position) más el desplazamiento propio que SmallLucy tenga (en este caso SmallLucy se encuentra en el origen así que su desplazamiento es cero).

Sé que el párrafo de arriba está algo confuso, más adelante me gustaría hacer un video y artículo sobre coordenadas globales y locales para poder explicar esto con más claridad. Por ahora sigamos adelante. Escribimos la siguiente línea en el método createObject:

createdObject = Instantiate (objectToCreate,position.transform);

Vamos por parte, en primer lugar createdObject es un objeto de tipo GameObject auxiliar (ver figura 4) que definimos para guardar la referencia del objeto nuevo que vamos a crear. Esto es muy importante porque sino más adelante no sabremos cuál objeto tenemos que destruir.

Haz clic aquí para leer el artículo sobre encontrar las referencias de los GameObjects en la jerarquía, también hay un video.

El método Instantiate va a devolver un objeto tipo GameObject (el objeto nuevo) y con el signo igual lo asignamos a createdObject.

Entre paréntesis indicamos los dos parámetros separamos por una coma. El primer parámetro es el objeto a crear y el segundo es la componente Transform del GameObject Position

Fig. 6: Métodos definidos en el Script CreationDestruction correspondiente al desafío del video 4 de la Serie Fundamental.

Destrucción del objeto

Para destruir al objeto usamos el método Destroy (que está definido en la clase MonoBehaviour) y le damos como parámetro la referencia del objeto que hemos guardado en el campo createdObject. Esto lo escribimos en el método destroyObject.

Comportamiento cíclico

Queremos que Lucy aparezca y desaparezca continuamente en la estación Creation Destruction, así que tenemos que hacer que ejecutar el método createObject. Luego esperar unos segundos y llamar al método destroyObject, luego esperar y volver a llamar al método crear.

Esto lo logramos primero llamando al método createObject desde Start, de esa forma al iniciar el juego, Lucy aparece. Luego al final del método crear usamos Invoke para llamar al método destroyObject luego de dos segundos. Hacemos lo mismo al final del método destroyObject, usamos Invoke para llamar al método crear. Esto lo podemos ver en la figura 6.

Conclusión

Hemos conseguido hacer aparecer nuevos objetos en el escenario en tiempo de ejecución, es decir mientras el juego está corriendo, esto no es poca cosa, entendiendo esto podemos lograr muchas cosas.

Para crear un nuevo objeto en el mundo básicamente necesitamos una copia del objeto a crear, esto lo logramos con un prefab. Y tenemos que saber exactamente dónde colocarlo, esto se puede lograr de muchas formas, por eso el método Instantiate tiene tantas variantes.

Si queremos destruir un GameObject de la jerarquía necesitamos saber cuál es, por eso es muy importante la referencia del objeto, si creamos el objeto sin asignarlo a ningún campo, el objeto estará en la jerarquía pero no podremos hacer nada con él a menos que lo encontremos nuevamente.