DISTINTAS FORMAS DE CREAR ENTIDADES
Vamos a ver un poco otras formas de pasarnos al sistema de entidades. Ya vimos una manera de convertir prefabs pero la realidad es que hay algunas más, y si bien la que mostré es una de las más “sencillas” hay otras más que Unity nos provee. La razón por la que también quiero mostrarlas es porque Unity deja en claro en la documentación que probablemente esa manera deje de funcionar en el futuro. Así que es bueno siempre estar prevenido ante estas eventualidades, y además siempre lo mejor es usar los métodos recomendados por Unity para el uso de sus sistemas.
Atributo GenerateAuthoringComponent
De las diferentes formas que tenemos para la conversión al sistema de entidades este que voy a mostrar a continuación sería uno de los más “sencillos” por ser automático. Imaginemos que tenemos un prefab que representa a nuestro personaje. Tradicionalmente lo que hacíamos era crear un MonoBehaviour y arrastrarlo al prefab. Ahora que tenemos entidades, si intentamos arrastrarlo Unity nos va a tirar un error que dice que no hereda de MonoBehaviour. Peeeeeero Unity nos da una herramienta para que podamos arrastrar nuestros ComponentData y usarlos como si fueran MonoBehaviour. Para ello, vamos a agregar el atributo [GenerateAuthoringComponent]. De esta forma, lo que hace Unity es generarnos un MonoBehaviour equivalente a nuestro componente y al hacer la conversión nos quedan los valores equivalentes. Imaginen el código de un personaje, algo como lo siguiente:
Si arrastramos a nuestro prefab el componente, vamos a ver algo como lo siguiente:
Esta es la forma más automatizada. Básicamente podemos tener todas las variables equivalentes de manera automática. No obstante, tiene ciertas “desventajas”. Al ser automático no contempla muchas cosas. Por ejemplo, si querémos crear un array de GameObjects, el “equivalente” podría ser algo así como una lista de entidades. El problema es que… No podemos crear un array de entidades. Unity no nos permite guardar dicho array en lo que sería un struct (nuestro component es un struct). Pero si no vamos a hacer uso de esto, podemos recurrir a este camino.
Utilizando la interfaz IConvertGameObjectToEntity
Esto básicamente nos permite hacer la conversión a mano a nosotros. Lo que tendríamos que hacer es crear nosotros, a mano, nuestro componente equivalente. O sea que, dentro del mismo archivo (esto es más una preferencia), creamos el componente equivalente en MonoBehaviour. Podemos optar por ponerle el mismo nombre que le pondría Unity (agregando Authoring al final), o elegir un nombre ustedes. Con esto, ahora nuestro componente nos quedaría de esta manera:
Lo que hicimos es implementar, en nuestro MonoBehaviour la interfaz que les dije e implementar el método que nos pide. Este método nos pasa 3 parámetros:
- Entity entity. Al iniciar la conversión, Unity crea una entidad vacía y nos la pasa por este parámetro para que le agreguemos los componentes que corresponden.
- EntityManager dtsManager. En este parámetro tendremos una referencia al EntityManager. Esta variable la vamos a tener siempre disponible desde nuestro sistema (SystemBase).
- GameObjectConversionSystem conversionSystem. Contiene una referencia al sistema que podemos usar para convertir un prefab/GameObject a una entidad. Si tenemos que asignar entidades a nuestro componente, podemos convertir prefabs mediante esta variable.
Entonces, si querémos convertir nuestro MonoBehaviour a ComponentData a mano, lo haremos de la siguiente forma:
Noten que la variable movementDirection en lugar de crearla como un float3 la cree como Vector3. Recuerden siempre utilizar los equivalentes en cada sistema. En nuestro caso en particular, dicha variable la va a utilizar el sistema para mover a nuestro personaje, por lo que no haría falta que nadie la setee en el editor. Dicho esto, lo que podemos hacer es eliminarla y sólo mostrar las variables que necesitan explícitamente ser seteadas. Esta sería otra ventaja sobre el primer caso que mostré, respecto de hacerlo automáticamente.