using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Gameplay; using LC.Newtonsoft.Json; using PhxhSDK.Phxh; using TGS; #if UNITY_EDITOR using System.IO; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine.Windows; #endif using UnityEngine; using File = System.IO.File; [ExecuteAlways] public class MapManager : MonoBehaviour { //[SerializeField] //[HideInInspector] private TerrainGridSystem _tgs; [SerializeField] [HideInInspector] private TextAsset _mapDataJson; //[SerializeField] //[HideInInspector] private MapData _mapData; private Map _map; public Map Map { get { if (_map == null) { _map = MapUtils.LoadMap(TGS, MapData); } return _map; } } public TerrainGridSystem TGS { get { if (_tgs == null) { var allTgs = FindObjectsOfType(); _tgs = allTgs.FirstOrDefault(t => t.gameObject.scene == gameObject.scene); } return _tgs; } } public TextAsset MapDataJson { get => _mapDataJson; set { if (_mapDataJson != value) { var data = JsonToMapData(value); _mapDataJson = value; if (data != null) { _mapDataJson = value; Refresh(); } } } } public void Refresh() { _mapData = null; _map = null; if(_mapDataJson == null) return; var mapData = MapData; var map = Map; TGS.showCells = true; TGS.colorizeTerritories = true; //TGS.TerritoryDestroyAll(); } public MapData MapData { get { if (_mapData == null) { var data = JsonToMapData(MapDataJson); if (data != null) { _mapData = data; var width = _mapData.Width; var height = _mapData.Height; if (width != 0 && height != 0) { CommonUtils.CorrectTGSColumnAndRow(ref width, ref height); } else { width = 2; height = 2; } TGS.columnCount = width; TGS.rowCount = height; _mapData.Width = width; _mapData.Height = height; //_mapData.ResetBlocks(TGS); } } return _mapData; } // set // { // if (_mapData != value) // { // _mapData = value; // if (value == null) // { // Map = null; // } // else // { // Map = MapUtils.LoadMap(TGS, _mapData); // //MapUtils.BindCameraController(_camera, Map); // //var cameraController = _camera.gameObject.GetComponent(); // //cameraController.InitializeCameraPosition(initialCameraPosition); // } // } // } } private MapData JsonToMapData(TextAsset jsonText) { if (jsonText != null) { var jsonStr = jsonText.text; if (string.IsNullOrEmpty(jsonStr)) { var mapData = new MapData(); //mapData.ResetBlocks(); return mapData; } else { //newtowsoft的Json序列化JsonIgnore不起作用,先用Unity的 //return JsonConvert.DeserializeObject(jsonStr); return JsonUtility.FromJson(jsonStr); } } return null; } public void SaveMapData() { #if UNITY_EDITOR if (_mapDataJson != null && !Application.isPlaying) { var path = AssetDatabase.GetAssetPath(_mapDataJson); //newtowsoft的Json序列化JsonIgnore不起作用,先用Unity的 //JsonHelper.SaveJson(path, _mapData); var jsonStr = JsonUtility.ToJson(_mapData,true); File.WriteAllText(path, jsonStr); Debug.Log($"保存地图数据成功!"); AssetDatabase.Refresh(); } #endif } private void Awake() { Refresh(); } private void OnDestroy() { SaveMapData(); } }