NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Map/MapManager.cs

192 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<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)
{
_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>();
// //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<MapData>(jsonStr);
return JsonUtility.FromJson<MapData>(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();
}
}