Unity TileMap保存读取(Json)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.Tilemaps;
using System.IO;
using UnityEditor;
using System.Linq;

[Serializable]
public class LevelLoader : MonoBehaviour
{
    [SerializeField]
    private Tilemap ground, grass;

    private Dictionary<string, int[]> x_range = new Dictionary<string, int[]>(),
        y_range = new Dictionary<string, int[]>();

    [SerializeField]
    private string levelName = "level_1";

    public List<TileBase> tiles;


    private void Awake()
    {
        ground = ground != null ? ground : GameObject.Find("Grid/Ground").GetComponent<Tilemap>();
        grass = grass != null ? grass : GameObject.Find("Grid/Grass").GetComponent<Tilemap>();

        x_range.Add("Ground", new int[] { -15, 21 });
        x_range.Add("Grass", new int[] {-15, 21});

        y_range.Add("Ground", new int[] { -5, -5 });
        y_range.Add("Grass", new int[] { -4, -4 });
    }


    private void Start()
    {
    }



    [ContextMenu("SaveLevel")]
    private void SaveLevel()
    {
        Multiple multiple = new Multiple();
        multiple.singleTilemaps.Add(new SingleTilemap("Ground"));

        TileBase tileBase;

        for (int i = 0; i < Mathf.Abs(x_range["Ground"][0]) + x_range["Ground"][1] + 1; i++)
        {
            for (int j = 0; j < 1; j++)
            {
                tileBase = ground.GetTile(new Vector3Int(x_range["Ground"][0] + i, y_range["Ground"][0], 0));
                //Debug.Log(multiple.singleTilemaps[multiple.singleTilemaps.Count - 1]);
                //Debug.Log(multiple.singleTilemaps[multiple.singleTilemaps.Count - 1].singleTiles);
                if (tileBase != null)
                {
                    //Debug.Log(tileBase.name);
                    multiple.singleTilemaps[multiple.singleTilemaps.Count - 1].singleTiles.Add(
                        new SingleTile(
                            tileBase.name,
                            x_range["Ground"][0] + i,
                            y_range["Ground"][0]
                        )
                    );
                }
                    
            }
        }


        multiple.singleTilemaps.Add(new SingleTilemap("Grass"));

        for (int i = 0; i < Mathf.Abs(x_range["Grass"][0]) + x_range["Grass"][1] + 1; i++)
        {
            for (int j = 0; j < 1; j++)
            {
                tileBase = grass.GetTile(new Vector3Int(x_range["Grass"][0] + i, y_range["Grass"][0], 0));
                if(tileBase != null)
                {
                    Debug.Log(tileBase.name);
                    multiple.singleTilemaps[multiple.singleTilemaps.Count - 1].singleTiles.Add(
                        new SingleTile(
                            tileBase.name,
                            x_range["Grass"][0] + i,
                            y_range["Grass"][0]
                        )
                    );
                }
            }
        }

        FileStream fileStream = File.Create(Application.streamingAssetsPath + "/" + levelName + ".json");
        fileStream.Dispose();
        File.WriteAllText(Application.streamingAssetsPath + "/" + levelName + ".json", JsonUtility.ToJson(multiple, true));
        AssetDatabase.Refresh();
    }



    /// <summary>
    /// 加载json地图
    /// </summary>
    [ContextMenu("LoadLevel")]
    private void LoadLevel()
    {
        Multiple multiple;
        multiple = JsonUtility.FromJson<Multiple>(File.ReadAllText(Application.streamingAssetsPath + "/" + levelName + ".json"));

        for (int i = 0; i < multiple.singleTilemaps.Count; i++)
        {
            if(multiple.singleTilemaps[i].tilemapName == "Ground")
                LoadLevel_Extend(multiple.singleTilemaps[i].singleTiles, ground);
            else if(multiple.singleTilemaps[i].tilemapName == "Grass")
                LoadLevel_Extend(multiple.singleTilemaps[i].singleTiles, grass);
        }
    }

    private void LoadLevel_Extend(List<SingleTile> singleTiles, Tilemap tilemap)
    {
        for (int j = 0; j < singleTiles.Count; j++)
            tilemap.SetTile(new Vector3Int(singleTiles[j].x, singleTiles[j].y, 0), tiles.Where(i => i.name == singleTiles[j].tileName).FirstOrDefault());
    }


    /// <summary>
    /// 清除地图
    /// </summary>
    [ContextMenu("ClearMap")]
    private void ClearMap()
    {
        ground.ClearAllTiles();
        grass.ClearAllTiles();
    }
}


/// <summary>
/// 多个瓦块地图的布局
/// </summary>
[Serializable]
public class Multiple
{
    public List<SingleTilemap> singleTilemaps = new List<SingleTilemap>();
}


/// <summary>
/// 单个瓦块地图
/// </summary>
[Serializable]
public class SingleTilemap 
{
    public string tilemapName;
    public List<SingleTile> singleTiles = new List<SingleTile>();

    public SingleTilemap(string tilemapName) => this.tilemapName = tilemapName;
}



/// <summary>
/// 单个瓦块
/// </summary>
[Serializable]
public class SingleTile
{
    public string tileName;
    public int x, y;

    public SingleTile(string tileName, int x, int y)
    {
        this.tileName = tileName;
        this.x = x;
        this.y = y;
    }
}

posted @ 2022-03-20 16:18  yassine  阅读(432)  评论(0编辑  收藏  举报