¿Para que podemos necesitar asociarle datos a un tile? Por múltiples razones. Por ejemplo, supongamos que estemos usando un Tilemap para conformar el mapa de un juego en perspectiva cenital. En ese caso, es probable que queramos añadirle un valor de "resistencia al avance" a los diferentes tiles, de manera que nuestro personaje se mueva más lento en los tiles que representen una ciénaga, más rápido en los tiles que representen un camino, y que no pueda travesar los tiles que muestren piedras infranqueables.
En un artículo anterior, expliqué como asociar este valor a los Tiles que utilices en Unity, pero me he dado cuenta de que no lo expliqué para Godot. Vamos a resolverlo en este artículo.
Imagina tener un escenario creado a base varios TileMapLayer. En el ejemplo de la captura he usado tres TileMapLayer: uno para definir los límites del escenario (WallsTileMapLayer), otro para definir los obstáculos interiores (InteriorObstaclesMapLayer) y otro para las zonas transitables (GroundTileMapLayer). En el de las zonas transitables he colocado todas las baldosas por las que pueden deambular mis agentes, si bien algunas baldosas deben suponer un coste de transito diferente a otras.
| Mi escenario de ejemplo |
Para reflejar los distintos costes de las baldosas, podemos asociar datos a las capas de datos personalizados (Custom Data Layers) del TileSet utilizado en los TileMaps.
Para empezar, tienes que dar de alta los distintos tipos de datos dentro del TileSet. Dentro del inspector de cualquiera de los TileMaps tienes que extender el recurso del TileSet. Al hacerlo verás que tiene una sección denominada "Custom Data Layers". Si la extiendes podrás ver los tipos de datos asociados a cada baldosa, y añadir otros nuevos con el botón "Add element". En la captura tienes los datos que he asociado a mis baldosas.
| Asociación de datos personalizados a un TileSet |
Puedes ver que he asociado dos tipos de datos: un booleano definiendo si la baldosa constituye un obstáculo (aunque en mi ejemplo no lo he llegado a usar) y un float definiendo el coste de transitar sobre la baldosa.
Definidos los tipos de datos personalizados que se asocian con las baldosas, tendremos que definir el valor que tienen en cada baldosa.
Cuando selecciones un TileMapLayer en la jerarquía, verás que en el borde inferior del editor te aparecerá una pestaña de TileSet. Al seleccionarla verás que te aparecerán tres secciones para configurar el TileSet: "Setup", "Select" y "Paint". Podemos usar las dos últimas para asignarle valores a los datos personalizados.
En la sección "Select" puedes seleccionar baldosas concretas. Al hacerlo, te aparecerán varias secciones para configurar. Una de ellas es "Custom Data". Al ampliarla puedes ver los distintos datos personalizados y asignarle valores. Recuerda que en los campos numéricos y de texto tienes que pulsar la tecla enter para que el cambio se aplique de manera efectiva.
| Configuración de datos personalizados en la sección "Select" de la pestaña "Tileset" |
Puedes hacer la misma operación de una manera más cómoda desde la pestaña "Paint". Al seleccionarla, te aparecerá un combo en el que elegir el dato al que quieres darle valor, Una vez elegido el tipo de dato, debes meter el valor que quieres asignar en el campo de texto, a partir de ese momento cualquier baldosa que selecciones en el TileSet adoptará dicho valor. Esta opción es ideal para aplicar el mismo valor rápidamente a múltiples baldosas.
| Configuración de datos personalizados en la sección "Paint" de la pestaña "Tileset" |
A continuación, y a modo de ejemplo, tienes el método que he utilizado para recuperar el coste de la baldosa asociada a una determinada posición.
| Método para recuperar el valor del coste asociado a la baldosa |
Todo TileMapLayer tiene un método LocalToMap() que te permite pasar una posición a las coordenadas de la baldosa que abarca dicha posición. He usado dicho método en la línea 188. Sin embargo, fíjate en que la posición no puede ser global, sino relativa al TileMapLayer. Por ese motivo he recurrido a la llamada a ToLocal() de la línea 189, con la que he pasado una posición global a otra relativa al TileMapLayer.
Con las coordenadas devueltas por LocalToMap() podemos llamar a GetCellTileData() (línea 190) para recuperar los datos asociados a la baldosa de esa posición. El tipo devuelto (TileData) es un paquete que aglutina todos los datos personalizados. Por eso, para recuperar el dato concreto que nos interese hay que llamar a su método GetCustomData() y hacer casting al tipo que sabemos que tiene ese dato. Ten cuidado porque a ese método hay que pasarle el nombre del dato que queremos y es fácil equivocarse al teclearlo.
Y eso es todo. Con eso ya tienes todo lo que necesitas para asociar datos a tus baldosas y recuperarlos luego dependiendo de la baldosa que ocupe cada posición. Lo que hagas luego con esos datos ya es cosa tuya.