Files
back_cantanBuilding/Assets/Scripts/HexGrid/HexMapManager.cs
2026-05-26 16:15:54 +08:00

197 lines
6.0 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 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<string> completeTiles = new();
// 属性
public Dictionary<string, int> Properties1 = new();
//
public Dictionary<string, int> Properties2 = new();
// 当前tile块的数值
// <Id,status>
// private Dictionary<int, int> tiles = new Dictionary<int, int>();
// private Dictionary<int, int> buildings = new Dictionary<int, int>();
}
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<HexGridMapUserData>(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<HexMapDataManager>();
}
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<CinemachineBrain>();
brain?.ManualUpdate();
}
}
/// <summary>
/// 检测点击或触摸位置击中了哪个物体
/// </summary>
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<HexGridTiler> ();
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<object>(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);
}
}
}