Files
HX_MapEditor/Assets/Scripts/Map/MapManager.Region.cs
2025-06-17 00:23:38 +08:00

261 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
// }
//}
}
}