261 lines
9.3 KiB
C#
261 lines
9.3 KiB
C#
using Cysharp.Threading.Tasks;
|
||
using HxGame;
|
||
using HxGame.Data;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Runtime.Remoting.Metadata.W3cXsd2001;
|
||
using System.Security.Policy;
|
||
using System.Threading;
|
||
using System.Xml;
|
||
using System.Xml.Linq;
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using UnityEngine.Networking;
|
||
using UnityEngine.Rendering;
|
||
using UnityEngine.UI;
|
||
using UnityEngine.UIElements;
|
||
using static MapManager;
|
||
using static UnityEngine.Rendering.DebugUI.Table;
|
||
|
||
public partial class MapManager : MonoBehaviour
|
||
{
|
||
[SerializeField]
|
||
private Transform mapRegion;
|
||
public Dictionary<string, (int maxRow, int maxCol)> allMaps = new Dictionary<string, (int maxRow, int maxCol)>();
|
||
|
||
/// <summary>
|
||
/// 当前地图区域
|
||
/// </summary>
|
||
public MapRegions _curMapRegions;
|
||
public bool LoadObsXml()
|
||
{
|
||
if (_curOpenMapId < 0)
|
||
{
|
||
UIWindow.Instance.ShowMessage("请先打开地图");
|
||
return false;
|
||
}
|
||
|
||
string path = string.Empty;
|
||
|
||
path = PathUtil.GetXmlPath(_curOpenMapId, "Obs");
|
||
|
||
if (!File.Exists(path))
|
||
{
|
||
UIWindow.Instance.ShowMessage("没有找到网格文件, 将重新计算格子");
|
||
return false;
|
||
}
|
||
|
||
XmlDocument xmlDocument = new XmlDocument();
|
||
xmlDocument.Load(path);
|
||
|
||
XmlNode xmlRoot = xmlDocument.SelectSingleNode("Item");
|
||
|
||
string ID = xmlRoot.Attributes.GetNamedItem("ID").Value;
|
||
mapWidth = Convert.ToInt32(xmlRoot.Attributes.GetNamedItem("MapWidth").Value);
|
||
mapHeight = Convert.ToInt32(xmlRoot.Attributes.GetNamedItem("MapHeight").Value);
|
||
|
||
int cellCount = 0;
|
||
|
||
_cellWidth = Convert.ToInt32(xmlRoot.Attributes.GetNamedItem("CellWidth").Value);
|
||
_cellHeight = Convert.ToInt32(xmlRoot.Attributes.GetNamedItem("CellHeight").Value);
|
||
_cellRows = mapHeight / _cellHeight;
|
||
_cellCols = mapWidth / _cellWidth;
|
||
cellCount = _cellRows * _cellCols;
|
||
|
||
|
||
string strData = xmlRoot.Attributes.GetNamedItem("Value").Value;
|
||
|
||
//0,0,1,0;0,1,1,1;0,2,1,2;
|
||
string[] values = strData.Split(';');
|
||
if (values.Length != cellCount)
|
||
{
|
||
UIWindow.Instance.ShowMessage("网格数据错误");
|
||
return false;
|
||
}
|
||
|
||
cellsNode = new CellNode[cellCount];
|
||
for (int i = 0; i < cellCount; i++)
|
||
{
|
||
string[] strCell = values[i].Split(',');
|
||
|
||
if (strCell.Length != 3)
|
||
continue;
|
||
|
||
int y = Convert.ToInt32(strCell[0]);
|
||
int x = Convert.ToInt32(strCell[1]);
|
||
int type = Convert.ToInt32(strCell[2]);
|
||
|
||
//有些格子之前有点问题
|
||
CellType celltype = (CellType)type;
|
||
if ((celltype & CellType.HadRole) > 0)
|
||
celltype ^= CellType.HadRole;
|
||
|
||
cellsNode[i] = new CellNode(x, y, i, celltype);
|
||
}
|
||
return true;
|
||
}
|
||
/// <summary>
|
||
/// 保存地图配置
|
||
/// </summary>
|
||
/// <param name="mapId"></param>
|
||
public void SaveRegionXML()
|
||
{
|
||
int mapId = _curOpenMapId;
|
||
if (!allMaps.TryGetValue(_curOpenMapId.ToString(), out var curMap))
|
||
{
|
||
UIWindow.Instance.ShowMessage($"没有扫描到当前地图 [{_curOpenMapId}]");
|
||
return;
|
||
}
|
||
_curMapRegions?.SaveXML(mapId);
|
||
//MapRegions mapRegions = new MapRegions();
|
||
//mapRegions.regionRowNum = curMap.maxRow;
|
||
//mapRegions.regionColNum = curMap.maxCol;
|
||
//mapRegions.regionWidth = PicMapPixel;
|
||
//mapRegions.regionHeight = PicMapPixel;
|
||
//mapRegions.cellWidthPixel = widthPixel;
|
||
//mapRegions.cellHeightPixel = heightPixel;
|
||
//mapRegions.regions = new Region[mapRegions.regionRowNum, mapRegions.regionColNum];
|
||
//for (int row = 0; row < mapRegions.regionRowNum; row++)
|
||
//{
|
||
// for (int col = 0; col < mapRegions.regionColNum; col++)
|
||
// {
|
||
// mapRegions.regions[row, col] = new Region();
|
||
// mapRegions.regions[row, col].indexX = row;
|
||
// mapRegions.regions[row, col].indexY = col;
|
||
// int ldx = mapRegions.regionRowNum - row;
|
||
// int ldy = col + 1;
|
||
// mapRegions.regions[row, col].regionName = $"v{mapId}_r{ldx}_c{ldy}"; // 构造文件名,v1000_r1_c1.jpg
|
||
// }
|
||
//}
|
||
//mapRegions.SaveXML(mapId);
|
||
}
|
||
|
||
public void LoadMapRegionSprites(int mapId)
|
||
{
|
||
if (!allMaps.TryGetValue(mapId.ToString(),out var mapInfo))
|
||
{
|
||
UIWindow.Instance.ShowMessage("地图不存在。。。");
|
||
return;
|
||
}
|
||
int mapRownum = mapInfo.maxRow;
|
||
int mapColumn = mapInfo.maxCol;
|
||
_curMapRegions = new MapRegions();
|
||
_curOpenMapId = mapId;
|
||
_curMapRegions.regionRowNum = mapRownum;
|
||
_curMapRegions.regionColNum = mapColumn;
|
||
_curMapRegions.regionWidth = PicMapPixel;
|
||
_curMapRegions.regionHeight = PicMapPixel;
|
||
_curMapRegions.cellWidthPixel = widthPixel;
|
||
_curMapRegions.cellHeightPixel = heightPixel;
|
||
_curMapRegions.regions = new Region[mapRownum, mapColumn];
|
||
float jpgscenew = PicMapPixel / 100;
|
||
for (int row = 0; row < mapRownum; row++)
|
||
{
|
||
for (int col = 0; col < mapColumn; col++)
|
||
{
|
||
string filename = $"v{mapId}_r{row + 1}_c{col + 1}"; // 构造文件名,v1000_r1_c1.jpg
|
||
string spPath = PathUtil.GetMapTexure(1000, filename, "jpg");
|
||
GameObject obj = new GameObject(filename);
|
||
obj.transform.SetParent(mapRegion);
|
||
SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();
|
||
float x = col * jpgscenew;
|
||
float y = (mapRownum - row - 1) * jpgscenew;
|
||
obj.transform.position = new Vector2(x, y);
|
||
_curMapRegions.regions[row, col] = new Region();
|
||
_curMapRegions.regions[row, col].indexX = row;
|
||
_curMapRegions.regions[row, col].indexY = col;
|
||
multithreadLoadTextrue(spPath, sr);
|
||
int ldx = mapRownum - row;
|
||
int ldy = col + 1;
|
||
_curMapRegions.regions[row, col].regionName = $"v{mapId}_r{ldx}_c{ldy}"; // 构造文件名,v1000_r1_c1.jpg
|
||
}
|
||
}
|
||
MapManager.Instance.ReseCamera(jpgscenew * mapColumn, jpgscenew * mapRownum);
|
||
MapManager.Instance.GenerateMap(jpgscenew * mapColumn, jpgscenew * mapRownum, widthPixel / 100.0f, heightPixel / 100.0f);
|
||
UICellInfo.Instance.ShowMapCellInfo();
|
||
|
||
}
|
||
public void ClearMapRegions()
|
||
{
|
||
ClearMapGrid();
|
||
foreach (Transform child in mapRegion)
|
||
{
|
||
Destroy(child.gameObject);
|
||
}
|
||
}
|
||
private async void multithreadLoadTextrue(string fullPath,SpriteRenderer sr)
|
||
{
|
||
var texture = await loadASyncTexture2D(fullPath, this.GetCancellationTokenOnDestroy());
|
||
if (texture != null)
|
||
{
|
||
sr.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100f);
|
||
}
|
||
}
|
||
|
||
private UniTask<Texture2D> loadASyncTexture2D(string fullPath,CancellationToken token)
|
||
{
|
||
return UniTask.RunOnThreadPool(async () =>
|
||
{
|
||
if (!File.Exists(fullPath))
|
||
{
|
||
Debug.LogError($"File not found: {fullPath}");
|
||
return null;
|
||
}
|
||
// 在线程池中异步读取文件
|
||
byte[] bytes = await File.ReadAllBytesAsync(fullPath, token);
|
||
// 切换到主线程处理纹理
|
||
await UniTask.Yield(PlayerLoopTiming.Update);
|
||
Texture2D texture = new Texture2D(2, 2); // 初始大小
|
||
if (texture.LoadImage(bytes))
|
||
{
|
||
return texture;
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError($"Failed to load image from {fullPath}");
|
||
return null;
|
||
}
|
||
});
|
||
}
|
||
IEnumerator LoadSpriteT(string spName, GameObject go, SpriteRenderer sprite)
|
||
{
|
||
if (File.Exists(spName))
|
||
{
|
||
byte[] bytes = File.ReadAllBytes(spName);
|
||
Texture2D texture = new Texture2D(2, 2); // 初始大小,稍后调整
|
||
if (texture.LoadImage(bytes)) // 解码 JPG 到 Texture2D
|
||
{
|
||
sprite.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100f);
|
||
Debug.Log($"Loaded {spName} successfully");
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError($"Failed to load image from {spName}");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError($"File not found: {spName}");
|
||
}
|
||
yield break;
|
||
//using (UnityWebRequest req = UnityWebRequestTexture.GetTexture(spName))
|
||
//{
|
||
// yield return req.SendWebRequest();
|
||
// if (req.result == UnityWebRequest.Result.Success)
|
||
// {
|
||
// Texture2D tt = DownloadHandlerTexture.GetContent(req);
|
||
// if (tt == null)
|
||
// yield break;
|
||
// sprite.sprite = Sprite.Create(tt, new Rect(0, 0, tt.width, tt.height), Vector2.zero, 100f);
|
||
// }
|
||
// else
|
||
// {
|
||
// UIWindow.Instance.ShowMessage(req.error);
|
||
// }
|
||
//}
|
||
}
|
||
|
||
}
|