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;
}
}