using TGS; using Gameplay; using PhxhSDK.AOT; using System.Linq; using UnityEngine; using File = System.IO.File; using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor; using UnityEngine.SceneManagement; [ExecuteAlways] #endif 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 SaveBuffObjCellIndex(Dictionary cells) { if (cells is { Count: > 0 }) { foreach (var cellData in cells) { var showBuffData = new MapData.ShowBuffData { cellIndex = cellData.Key, path = cellData.Value }; Map.MapData.showBuffPoints.Add(showBuffData); } } } public void SaveMapData() { #if UNITY_EDITOR var currentScene = gameObject.scene; if (_mapDataJson != null && _mapData != null && currentScene == SceneManager.GetActiveScene()) { 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(); } }