228 lines
5.9 KiB
C#
228 lines
5.9 KiB
C#
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;
|
||
#endif
|
||
|
||
[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<TerrainGridSystem>();
|
||
_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<Camera>(), _map);
|
||
}
|
||
|
||
return _map;
|
||
}
|
||
}
|
||
|
||
public CameraController CameraController
|
||
{
|
||
get
|
||
{
|
||
if (_cameraController == null)
|
||
{
|
||
var cameras = FindObjectsOfType<Camera>();
|
||
foreach (var cam in cameras)
|
||
{
|
||
if (cam.gameObject.scene == gameObject.scene)
|
||
{
|
||
var cameraController = cam.GetComponent<CameraController>();
|
||
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<MapData>(jsonStr);
|
||
return JsonUtility.FromJson<MapData>(jsonStr);
|
||
}
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
// 保存需要指示的地格索引
|
||
public void SaveBuffObjCellIndex(Dictionary<int, string> 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<int>();
|
||
Map.MapData.flagStartPoints = new List<int>();
|
||
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();
|
||
}
|
||
} |