using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Framework; using Gameplay; using LC.Newtonsoft.Json; using PhxhSDK; using PhxhSDK.AOT; 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 { private TerrainGridSystem _tgs; [SerializeField] [HideInInspector] private TextAsset _mapDataJson; private MapData _mapData; private Map _map; private CameraController _cameraController; 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) { Refresh(); } else { _tgs.TerritoryDestroyAll(); } } } } public MapData MapData { get { if (_mapData == null) { var data = JsonToMapData(MapDataJson); if (data != null) { _mapData = data; TGS.columnCount = _mapData.Width; TGS.rowCount = _mapData.Height; } } return _mapData; } } public Map Map { get { if (_map == null && MapData != null) { _map = MapUtils.LoadMap(TGS, MapData); if (_map != null && CameraController) MapUtils.BindCameraController(CameraController.GetComponent(), _map); } return _map; } } public CameraController CameraController { get { if (_cameraController == null) { var cameras = FindObjectsOfType(); foreach (var cam in cameras) { if (cam.gameObject.scene == gameObject.scene) { var cameraController = cam.GetComponent(); if (cameraController) { _cameraController = cameraController; break; } } } } return _cameraController; } } 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(); } 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 && _mapData != null) { SaveDate(); 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 SaveDate() { Map.MapData.capturePoints = new List(); Map.MapData.flagStartPoints = new List(); var mapBlocksData = Map.MapData.BlocksData; for (var i = 0; i < mapBlocksData.Count; i++) { var blockData = mapBlocksData[i]; if (!blockData.IsDefaultTerrainType()) { var propType = blockData.GetTerrainTypeProperty(); if (propType.capture && !Map.MapData.capturePoints.Contains(i)) { Map.MapData.capturePoints.Add(i); } if (propType.flag && !Map.MapData.flagStartPoints.Contains(i)) { Map.MapData.flagStartPoints.Add(i); } } } } private void OnEnable() { if (!CommonUtils.IsInGame()) Refresh(); } private void OnDestroy() { if (YooAssetBuildStatus.isInBuild) return; if (!Application.isPlaying) SaveMapData(); } }