Guardar y Cargar Tilemap {{ currentPage ? currentPage.title : "" }}

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

{{{ content }}}