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

126 lines
3.6 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
namespace HexGrid
{
// 调停者
// 进度管理器
public class HexGridMediator : MonoBehaviour,IHexGridMediator
{
private HexZoneManager _zoneManager;
//
private BuildingManager _buildingManager;
public void RegisterZoneManager(HexZoneManager zoneManager)
{
_zoneManager = zoneManager;
}
public void RegisterBuildingManager(BuildingManager buildMamanger)
{
_buildingManager = buildMamanger;
}
public async void OnHexCellClicked(HexTile tiler)
{
if (_zoneManager.OnHexTileData(tiler))
{
await Awaiters.Seconds(0.2f);
await CheckBuildingAfterBuild(tiler);
await OnActiveNextTile(tiler);
}
}
public async Task OnActiveNextTile(HexTile tiler)
{
await _zoneManager.OnActiveNextTile(tiler);
}
public async Task CheckBuildingAfterBuild(HexTile tiler)
{
await _buildingManager.CheckBuildingAfterBuild(tiler);
}
public void CheckBuildingAfterBuildImme(HexTile tile)
{
_buildingManager.CheckBuildingAfterBuildImme(tile);
}
public void LoadZones(List<HexZone> zones)
{
}
//-
public void LoadBuildings(List<HexBuilding> buildings)
{
_buildingManager.LoadBuildings(buildings);
}
public async void Build(int zoneId,BuildingData buildingData,bool isImme)
{
Log($"Build-> {zoneId} {buildingData.BuildingName}");
var root = _zoneManager.GetBuildingRoot(zoneId);
if (!root) return;
//_buildingManager.Build(root.transform, buildingData);
var buildTrans = root.transform.Find(buildingData.BuildingName);
var endPos = buildTrans.position;
var tileNames = buildingData.TileStateMap.Keys;
var duration = 0.5f;
foreach (var tileName in tileNames)
{
var tile = _zoneManager.GetTileByName(zoneId, tileName);
if (tile.visual)
{
var top = tile.visual.transform.Find("on/top");
if (top)
{
if (isImme)
{
top.gameObject.SetActive(false);
}
else
{
top.DOMove(endPos, duration).SetEase(Ease.InSine).OnComplete(() =>
{
top.gameObject.SetActive(false);
});
}
}
}
}
if (!isImme)
{
await Awaiters.Seconds(duration);
}
if (buildTrans)
{
buildTrans.gameObject.SetActive(true);
}
if (isImme)
{
buildTrans.localScale = Vector3.one;
}
else
{
var ani = buildTrans.GetComponent<Animation>();
if (ani)
{
ani.Play("grow");
}
}
}
private static void Log(string t)
{
Debug.Log($"<color=orange>HexGridMediator -> {t} </color>");
}
}
}