[/fusion_text]

DESTRUYENDO ENTIDADES

Por supuesto que si nos dedicamos a crear entidades en algún momento íbamos a querer destruirlas (como la vida misma). Así que vamos a mostrar ahora cómo pasar por ese proceso.

Para empezar vamos a crear dos componentes: DestroyAfterTimeSystem y DestroyAfterTimeComponentData. Pero… Momento… No puedo usar una línea de código para borrar la entidad y listo? Por qué hay que crear otro sistema? La verdad que es una excelente pregunta y gracias por hacerla. Y la respuesta fácil sería: “sí, se puede llamando a EntityManager.DestroyEntity(myEntity)”. Pero tengo dos motivos principales por los cuales no hacerlo. El primero es porque va a derivar en muchas preguntas complicadas como por ejemplo: “Cómo obtengo el acceso a mi entidad desde el método OnUpdate()?”, que seguramente al responderla se preguntarían “Por qué cuando ejecuto esta línea el compilador empieza a tirar errores y todo se rompe?” que va a derivar en preguntas como “por qué decidí ser programador y empezar a usar DOTS si yo era feliz jugando jueguitos nada mas?”. Creanme, yo ya me hice todas esas preguntas.

El segundo motivo es que pensando en cuestiones de estructuras, no sería ideal que el sistema que se encarga de MOVER entidades también tenga una tarea adicional como para también ELIMINARLAS. Esto, a la larga, nos lleva a que nuestros sistemas, que empezaron siendo específicos, de golpe tienen más tareas de las que deberían manejar. Y si esa tarea de eliminar nuestra entidad se complica por algún motivo, o su lógica se ve comprometida, de golpe no tendría sentido que nuestro “sistema para mover entidades” tenga error al eliminarlas. De hecho, si piensan en su nombre (MovementSystem), el mismo nombre ya nos está diciendo que se encarga de moverlas, no de eliminarlas, ni rotarlas, ni de ninguna otra tarea. Siempre es ideal mantener las clases con una única responsabilidad.

Aclarado eso, vamos a crear nuestras dos clases.

DestroyAfterTimeComponentData.cs

Copy to Clipboard

 

La variable es para que podamos destruirla después de X tiempo. Noten que no ponemos nada de lógica dentro de esta clase. El encargado de procesar toda esa lógica es…

 

DestroyAfterTimeSystem.cs

Copy to Clipboard

Vamos a analizar un poco el código hasta acá. Van a ver que gran parte de la lógica es como la que ya venimos viendo en las clases anteriores. Los cambios nuevos serían:

  • Agregamos el parámetro “entity”: Al agregar este parámetro al ForEach automáticamente nos va a pasar la entidad mediante esa variable. Por lo cual vamos a poder eliminarla teniendo su referencia.
  • Seteamos el valor de la variable “remainingTime”: Como habíamos dicho anteriormente, es el sistema el que se va a encargar de actualizar el valor de esta variable. De momento, sólo hace una operación básica como restarle el valor de deltaTime, y luego chequear si dicho valor llegó a cero. En tal caso procedemos a eliminar la entidad.
  • EntityManager.DestroyEntity(): Este método nos va a servir para eliminar la entidad por completo. No tiene mucha ciencia, pero sí algunas limitaciones que les voy a comentar cuando veamos el JobSystem.
  • Se agregó “WithStructuralChanges”: Si no agregamos esta línea (pueden probarlo por sus medios), lo que va a pasar es que Unity nos tire el siguiente error:
Copy to Clipboard

El error que nos tira es bastante explicativo en términos generales. Pero básicamente es como que el sistema tiene todas las entidades en una estructura en memoria, y lo que nos dice es que no podemos hacer cambios en esa estructura si no agregamos ese método. Esto es básicamente por motivos similares a lo que pasaría si ustedes recorren una lista de datos y mientras la recorren quitan un elemento del medio. La problemática es mááááááááás o menos la misma.