Para facilitarnos el proceso de guardar un Tilemap, vamos a crear una estructura que nos permita almacenar la información que necesitamos.
Al final del artículo encontrarás los scripts completos.
Librerías necesarias:
using UnityEngine.Tilemaps;
Scripts y Explicación:
Empezamos creando una clase que almacene la Posición y el Tile correspondiente. En este caso llamaremos a nuestra clase TileData, pero puedes ponerle el nombre que desees.
using UnityEngine.Tilemaps;
[System.Serializable]
public class TileData
{
public Vector3Int position;
public TileBase tile;
}
Ahora crearemos una Lista, la cual almacene todos los TileData que contiene nuestro Tilemap. Para esto crearemos un nuevo Script al cual llamaremos TilemapData.
Creamos un variable para referenciar el Tilemap que queremos guardar.
Creamos una lista de la clase que acabamos de crear, en nuestro caso TileData.
using System.Collections;
using UnityEngine;
using UnityEngine.Tilemaps;
public class TilemapData : MonoBehaviour
{
//Referencia a nuestro Tilemap
public Tilemap tilemap;
//Lista de TileData para almacenar Tiles
private List<TileData> tilesData;
}
Ahora crearemos un método en el cual obtendremos la información del Tilemap.
El sprite del Tile se guarda en una variable tipo TileBase.
La posición del Tile se guarda en una variable tipo Vector3Int.
private void GuardarTilemap()
{
foreach (Vector3Int pos in tilemap.cellBounds.allPositionsWithin)
{
Vector3Int localPlace = new Vector3Int(pos.x, pos.y, pos.z);
if (tilemap.HasTile(localPlace))
{
//Creamos un TileData
TileData _tile = new TileData();
//Guardamos la posicion y el Tile en el TileData
_tile.position = localPlace;
_tile.tile = tilemap.GetTile(localPlace);
//Añadimos la informacion del Tile a la lista
tilesData.Add(_tile);
}
}
}
Ahora ya tenemos la información de nuestro Tilemap en una variable y podemos cargarla de la siguiente forma:
private void CargarTilemap()
{
for (int i = 0; i < tilesData.Count; i++)
{
tilemap.SetTile(tilesData[i].position,tilesData[i].tile);
}
}
Hasta aquí ya tenemos un sistema de guardar y cargar un Tilemap. Dependerá de nosotros cómo queremos almacenar esa información, puede ser en un Json, ScriptableObject, o incluso en una variable simple.
Scripts terminado:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class TilemapData : MonoBehaviour
{
//===================================== VARIABLES ======//
public Tilemap tilemap;
private List<TileData> tilesData;
//===================================== METODOS ======//
//===== GUARDAR TILES =====//
private void GuardarTilemap()
{
foreach (Vector3Int pos in tilemap.cellBounds.allPositionsWithin)
{
Vector3Int localPlace = new Vector3Int(pos.x, pos.y, pos.z);
if (tilemap.HasTile(localPlace))
{
TileData _tile = new TileData();
_tile.position = localPlace;
_tile.tile = tilemap.GetTile(localPlace);
tilesData.Add(_tile);
}
}
}
//===== CARGAR TILES =====//
private void CargarTilemap()
{
for (int i = 0; i < tilesData.Count; i++)
{
tilemap.SetTile(tilesData[i].position,tilesData[i].tile);
}
}
}
//===================================== CLASES ======//
[System.Serializable]
public class TileData
{
public Vector3Int position;
public TileBase tile;
}
Por el momento dejaremos el Script, de la siguiente manera. Pero puedes encontrar algunas maneras de guardar esta información a partir de este código aquí.
Guardar Tilemap en Json (En proceso)
Guardar Tilemap en ScriptableObject (En proceso)
Si tiene alguna duda pueden contactarme via gmail: diego.detomas96@gmail.com
Gracias por leer.
By Sr.Cienpies.
Referencias
Este código fue resuelto gracias al aporte de allencoded en respuesta a How to get all tiles from a Tilemap?
Recomiendo lectura de la documentación oficial Unity Tilemaps.