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

Introducción

En este artícu­lo vamos a estu­di­ar cómo crear y destru­ir GameOb­jects en tiem­po de eje­cu­ción. Lograr esto es muy impor­tante para crear jue­gos, porque nos per­mite colo­car obje­tos cuan­do y donde quer­amos y poder pos­te­ri­or­mente destruirlos.


Procedimiento

En este desafío vamos a usar la estación Creation/Destruction que se ve en la figu­ra 1, para hac­er que una pequeño humanoide aparez­ca y desa­parez­ca de man­era cícli­ca mien­tras el juego se desarrolle. 

Página principal del proyecto

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 Cre­ation Destruc­tion 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 Cre­ation Destruc­tion del GameDe­vLab. 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 Cre­ation Destruc­tion del GameDe­vLab. Lucy desaparece. 

En las fig­uras 2 y 3 se ilus­tra el ciclo de apari­ción y desapari­ción del personaje.

Fig. 4: Cam­pos del Script Cre­ation­De­struc­tion cor­re­spon­di­ente al desafío del video 4 de la Serie Fundamental.

Las fig­uras 1 y 2 mues­tras los cam­pos y com­po­nente en el inspec­tor del Script "Cre­ation­De­struc­tion".

Fig. 5: El GameOb­ject "#4 Cre­ation Destruc­tion" tiene asig­na­do el Script Cre­ation Destruc­tion. Esto se ve en el inspector.

El desafío con­siste en com­ple­tar los méto­dos cre­ateOb­ject() y destroy­Ob­ject() del Script.

Resolución

Creación del objeto

Para la creación del obje­to vamos a uti­lizar el méto­do Instan­ti­ate, este méto­do está definido en la clase MonoBe­hav­iour que por defec­to es la super clase o clase padre de todo nue­vo Script que hace­mos en Unity. 

En este momen­to no ten­go sufi­cientes artícu­los ni videos sobre pro­gra­mación ori­en­ta­da a obje­tos para aclarar lo de las super clases, sé que even­tual­mente los haré, pero por aho­ra si quieres saber más inves­ti­ga el tema Heren­cia en pro­gra­mación ori­en­ta­da a objetos.

El méto­do Instan­ti­ate tiene más de diez vari­antes, pero en todas bási­ca­mente nece­si­ta­mos dos cosas: el obje­to que vamos a crear y en qué pun­to del espa­cio lo vamos a poner.

Haz clic aquí para leer un artícu­lo sobre méto­dos en programación.

En este caso el obje­to que vamos a crear lo indicamos uti­lizan­do el pre­fab Smal­l­Lucy que se encuen­tra en la car­pe­ta Inter­nal Use, este pre­fab lo colo­camos en el espa­cio Object To Cre­ate en el inspec­tor, como se obser­va en la figu­ra 5.

Para indicar el pun­to del espa­cio donde vamos a colo­car el obje­to nue­vo vamos a usar un GameOb­ject lla­ma­do Posi­tion que está en la jer­ar­quía. Tam­bién lo asig­namos en el inspec­tor (figu­ra 5).

Vamos a uti­lizar una vari­ante del méto­do Instan­ti­ate que creará el obje­to y lo colo­cará en la jer­ar­quía como hijo del GameOb­ject que le indique­mos. Esto quiere decir que nue­stro obje­to apare­cerá en la posi­ción del GameOb­ject padre (Posi­tion) más el desplaza­mien­to pro­pio que Smal­l­Lucy ten­ga (en este caso Smal­l­Lucy se encuen­tra en el ori­gen así que su desplaza­mien­to es cero).

Sé que el pár­rafo de arri­ba está algo con­fu­so, más ade­lante me gus­taría hac­er un video y artícu­lo sobre coor­de­nadas glob­ales y locales para poder explicar esto con más clar­i­dad. Por aho­ra sig­amos ade­lante. Escribi­mos la sigu­iente línea en el méto­do createObject:

cre­ate­dOb­ject = Instan­ti­ate (objectToCreate,position.transform);

Vamos por parte, en primer lugar cre­ate­dOb­ject es un obje­to de tipo GameOb­ject aux­il­iar (ver figu­ra 4) que defin­i­mos para guardar la ref­er­en­cia del obje­to nue­vo que vamos a crear. Esto es muy impor­tante porque sino más ade­lante no sabre­mos cuál obje­to ten­emos que destruir.

Haz clic aquí para leer el artícu­lo sobre encon­trar las ref­er­en­cias de los GameOb­jects en la jer­ar­quía, tam­bién hay un video.

El méto­do Instan­ti­ate va a devolver un obje­to tipo GameOb­ject (el obje­to nue­vo) y con el sig­no igual lo asig­namos a createdObject.

Entre parén­te­sis indicamos los dos parámet­ros sep­a­ramos por una coma. El primer parámetro es el obje­to a crear y el segun­do es la com­po­nente Trans­form del GameOb­ject Position

Fig. 6: Méto­dos definidos en el Script Cre­ation­De­struc­tion cor­re­spon­di­ente al desafío del video 4 de la Serie Fundamental. 

Destrucción del objeto

Para destru­ir al obje­to usamos el méto­do Destroy (que está definido en la clase MonoBe­hav­iour) y le damos como parámetro la ref­er­en­cia del obje­to que hemos guarda­do en el cam­po cre­ate­dOb­ject. Esto lo escribi­mos en el méto­do destroyObject.

Comportamiento cíclico

Quer­e­mos que Lucy aparez­ca y desa­parez­ca con­tin­u­a­mente en la estación Cre­ation Destruc­tion, así que ten­emos que hac­er que eje­cu­tar el méto­do cre­ateOb­ject. Luego esper­ar unos segun­dos y lla­mar al méto­do destroy­Ob­ject, luego esper­ar y volver a lla­mar al méto­do crear.

Esto lo logramos primero lla­man­do al méto­do cre­ateOb­ject des­de Start, de esa for­ma al ini­ciar el juego, Lucy aparece. Luego al final del méto­do crear usamos Invoke para lla­mar al méto­do destroy­Ob­ject luego de dos segun­dos. Hace­mos lo mis­mo al final del méto­do destroy­Ob­ject, usamos Invoke para lla­mar al méto­do crear. Esto lo podemos ver en la figu­ra 6.

Conclusión

Hemos con­segui­do hac­er apare­cer nuevos obje­tos en el esce­nario en tiem­po de eje­cu­ción, es decir mien­tras el juego está cor­rien­do, esto no es poca cosa, enten­di­en­do esto podemos lograr muchas cosas.

Para crear un nue­vo obje­to en el mun­do bási­ca­mente nece­si­ta­mos una copia del obje­to a crear, esto lo logramos con un pre­fab. Y ten­emos que saber exac­ta­mente dónde colo­car­lo, esto se puede lograr de muchas for­mas, por eso el méto­do Instan­ti­ate tiene tan­tas variantes.

Si quer­e­mos destru­ir un GameOb­ject de la jer­ar­quía nece­si­ta­mos saber cuál es, por eso es muy impor­tante la ref­er­en­cia del obje­to, si creamos el obje­to sin asig­narlo a ningún cam­po, el obje­to estará en la jer­ar­quía pero no podremos hac­er nada con él a menos que lo encon­tremos nuevamente.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Scroll al inicio
Secured By miniOrange