using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using asap.core; using Cinemachine; using Newtonsoft.Json; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Serialization; // 格子管理 // 作为 调停者 使用 namespace HexGrid{ public class HexGridMapUserData { // private int zoneNum = 2; // public int zoneCurrentIndex = 0; // [0,1]; // public int subZoneCurrentIndex = 0; // [] // 已经完成的地块 public List completeTiles = new(); // 属性 public Dictionary Properties1 = new(); // public Dictionary Properties2 = new(); // 当前tile块的数值 // // private Dictionary tiles = new Dictionary(); // private Dictionary buildings = new Dictionary(); } public class HexMapDataManager { public const string SaveKey = "HexMapData"; public HexGridMapUserData UserMapData { get; private set; } public void Init() { UserMapData ??= new HexGridMapUserData { zoneCurrentIndex = 0, subZoneCurrentIndex = 0 }; SaveUserData(); } public void ClearMapData() { UserMapData = null; SaveUserData(); } // public void SaveUserData() { PlayFabMgr.Instance.UpdateUserDataValue(SaveKey, JsonConvert.SerializeObject(UserMapData)); } public void LoadUserData(string dataValue) { UserMapData = JsonConvert.DeserializeObject(dataValue); } } public class HexMapManager : MonoBehaviour { // public HexZoneManager zoneManager; public TerrainManager terrainManager; public BuildingManager buildingManager; public HexGridMediator hexGridMediator; public Transform hexMapRoot; public Camera mainCamera; public string mapName = "hex_build_01"; // 设置的 private CinemachineVirtualCamera _vCam; // 数据 private HexGridMap _mapInfo; private HexMapDataManager _dataManager; // private void Awake() { mainCamera = Camera.main; _dataManager = GContext.container.Resolve(); } private void Start() { zoneManager.SetRoot(hexMapRoot); zoneManager.SetMediator(hexGridMediator); zoneManager.SetHexMapManager(this); // buildingManager.SetMediator(hexGridMediator); // hexGridMediator.RegisterZoneManager(zoneManager); hexGridMediator.RegisterBuildingManager(buildingManager); _ = InitMapInfo(); } private void Update() { if (Input.touchCount > 0 ) { if (Input.GetTouch(0).phase == TouchPhase.Began) { CheckHit(Input.GetTouch(0).position); } } else { // 鼠标点击(PC) if (Input.GetMouseButtonDown(0)) { CheckHit(Input.mousePosition); } } } private void OnDisable() { if (_vCam) { _vCam.m_Lens.Orthographic = false; if (!Camera.main) return; var brain = Camera.main.GetComponent(); brain?.ManualUpdate(); } } /// /// 检测点击或触摸位置击中了哪个物体 /// private void CheckHit(Vector3 screenPosition) { if (mainCamera == null) mainCamera = Camera.main; var ray = mainCamera.ScreenPointToRay(screenPosition); if (Physics.Raycast(ray, out RaycastHit hit)) { Debug.Log("点击到了: " + hit.collider.name); var hexGridTiler = hit.collider.GetComponent (); if (hexGridTiler) { hexGridTiler.OnHexCellClicked(); } } } public void UnlockZone(int zoneId) { var zone = zoneManager.GetZoneById(zoneId); if (zone != null && !zone.isUnlocked) { // if (GameManager.Instance.SpendMoney(zone.unlockCost)) { zone.isUnlocked = true; zone.zoneObject.SetActive(true); terrainManager.UpdateTerrainForZone(zoneId); // 假设用 zoneId 推导 Chunk 坐标 Vector2Int chunkCoord = new Vector2Int(zoneId % 3, zoneId / 3); // ChunkManager.Instance.UnlockChunk(chunkCoord); // cameraController.FocusOn(zone.zoneObject.transform.position); // FXManager.Instance.PlayUnlockEffect(zone.zoneObject.transform.position); //SaveMapState(); SaveUserData(); } } } private async Task InitMapInfo() { var mapInfo = mapName + "_info"; _mapInfo = (HexGridMap)await Addressables.LoadAssetAsync(mapInfo).Task; LoadMapInfo(_mapInfo); } public void LoadMapInfo(HexGridMap mapInfo) { zoneManager.LoadZonesFromSave(mapInfo,_dataManager.UserMapData); } // public void SaveUserData() { _dataManager.SaveUserData(); } // public void LoadUserData(string dataValue) { _dataManager.LoadUserData(dataValue); } } }