using Cysharp.Threading.Tasks; using System; using Gameplay; using PhxhSDK; using TGS; using UnityEngine; using Constants = Framework.Constants; using System.Collections.Generic; using Object = UnityEngine.Object; public static class MapUtils { public static Map LoadMap(TerrainGridSystem tgs, MapData mapData, bool isLegionMap = false) { var map = Map.Create(tgs, mapData, isLegionMap); map.TerrainGridSystem.highlightEffect = HighlightEffect.None; Dictionary terrainTypeConfig = TerrainTypeConfig.DicTerrainTypePropertie; if (null == terrainTypeConfig) return map; for (int i = 0; i < map.MapData.BlocksData.Count; i++) { map.TerrainGridSystem.CellSetBorderVisible(i, true); } return map; } public static async UniTask LoadMap(MapData mapData, bool isLegionMap = false) { TerrainGridSystem tgs = UnityEngine.Object.FindObjectOfType(); Map map = Map.Create(tgs, mapData, isLegionMap); map.TerrainGridSystem.highlightEffect = HighlightEffect.None; for (int i = 0; i < map.MapData.BlocksData.Count; i++) { map.TerrainGridSystem.CellSetBorderVisible(i, true); } SetGroundBoxCollider(map); return map; } public static async UniTask LoadMapData(string mapFileName) { if (string.IsNullOrEmpty(mapFileName)) return null; string mapPath = string.Format(Constants.MAP_CONFIG_FORMAT_PATH, mapFileName); TextAsset textAsset = await AssetManager.Instance.LoadAssetAsync(mapPath); MapData mapData = null; try { // 这里可能会抛异常,捕获一下避免程序崩溃 if (textAsset is not null) { mapData = JsonUtility.FromJson(textAsset.text); } } catch (Exception e) { DebugUtil.LogError("LoadMap.LoadMap failed, exception:{0}", e.ToString()); } if (null == mapData) DebugUtil.LogError("LoadMap.LoadMap failed, can not find map config: {0}", mapPath); AssetManager.Instance.Unload(mapPath); return mapData; } public static void UnLoadMap(Map map) { map?.Destroy(); } public static void BindCameraController(Camera camera, Map map, float rightMargin, float leftMargin, float topMargin, float bottomMargin) { var cameraController = camera.gameObject.GetComponent(); if (!cameraController) { cameraController = camera.gameObject.AddComponent(); } if (cameraController) { cameraController.CameraBounds = map.TerrainGridSystem.bounds; cameraController.enabled = true; } cameraController.InitializeCameraPosition( map.BlockPosition2WorldPosition(map.MapData.initialCameraPosition), map.MapData.cameraMarginInfo,rightMargin, leftMargin, topMargin, bottomMargin); } public static int Distance(Map map, int cellIndex1, int cellIndex2) { return map.TerrainGridSystem.CellGetHexagonDistance(cellIndex1, cellIndex2); } public static Color GetRGBAColor(string strColor) { var color = Convert.ToUInt32(strColor, 16); return new Color((color >> 24 & 0xFF) / 255f, (color >> 16 & 0xFF) / 255f, (color >> 8 & 0xFF) / 255f, (color & 0xFF) / 255f); } private static void SetGroundBoxCollider(Map map) { if (map?.TerrainGridSystem == null) return; // 查找和 TerrainGridSystem 在同一场景下的 Ground 物体 var scene = map.TerrainGridSystem.gameObject.scene; GameObject ground = null; foreach (var rootGameObject in scene.GetRootGameObjects()) { var foundGround = FindGroundInHierarchy(rootGameObject.transform, "Ground"); if (foundGround != null) { ground = foundGround; break; } } if (ground != null) { RemoveCollider(ground); } var parentTransform = ground?.transform.parent; if (parentTransform == null) return; GameObject searchColliderObj = null; foreach (var rootGameObject in scene.GetRootGameObjects()) { var foundCollider = FindGroundInHierarchy(rootGameObject.transform, "BoxCollider"); if (foundCollider != null) { searchColliderObj = foundCollider; break; } } if (searchColliderObj != null) { DebugUtil.Log($"已有BoxCollider节点, 删除重建"); Object.DestroyImmediate(searchColliderObj); } var boxColliderObj = new GameObject("BoxCollider"); boxColliderObj.layer = LayerMask.NameToLayer(Constants.Layer.GROUND_NAME); // 添加 BoxCollider 组件 var boxCollider = boxColliderObj.AddComponent(); boxCollider.size = new Vector3(1, 1, 1); boxCollider.center = new Vector3(0, 0, 0.5f); boxColliderObj.transform.localScale = new Vector3(300, 300, 1f); boxColliderObj.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); boxColliderObj.transform.SetParent(parentTransform, false); DebugUtil.Log($"在{parentTransform.gameObject.name}下添加BoxCollider"); } private static GameObject FindGroundInHierarchy(Transform root, string name) { if (root.name.Equals(name)) return root.gameObject; for (int i = 0; i < root.childCount; i++) { var result = FindGroundInHierarchy(root.GetChild(i), name); if (result != null) return result; } return null; } private static void RemoveCollider(GameObject obj) { if (obj == null) return; var colliders = obj.GetComponents(); foreach (var collider in colliders) { UnityEngine.Object.Destroy(collider); } } }