Unity TileMap儲存讀取(Json)
阿新 • • 發佈:2022-03-20
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; } }