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

175 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace HexGrid
{
public interface IBuildMediator
{
void Build();
void CheckForBuilding(List<HexSubZone> zoneDataSubZones);
}
public class HexBuildingData
{
public string buildingPrefabName;
public Vector3 position;
}
public class BuildingData
{
//
public string BuildingName;
// 地块状态
public Dictionary<string, int> TileStateMap;
public Vector3 position;
}
public class BuildingManager : MonoBehaviour,IHexGridMediatable
{
//
private IHexGridMediator _mediator;
// public List<string> conditions = new List<string>();
// private List<HexBuilding> _buildings;
//[zoneId,[[build1,[tile1,tile2,tile3,....],],[build1,[tile1,tile2,tile3,....],]]
private readonly Dictionary<int ,List<BuildingData>> _unFinishBuildMap= new ();
//<zoneId, [build1,build2,...]>
private readonly Dictionary<int ,List<BuildingData>> _finishBuildMaps = new ();
private void Awake()
{
// conditions.Clear();
}
public async void Build(Transform root,BuildingData buildingData)
{
// var build = Instantiate(buildingData.buildModel,root);
//var build = await Addressables.InstantiateAsync("BuildModel", root, true).Task;
//build.transform.localPosition = buildingData.position;
//build.name = "highbuilding";
Log($"Build-> {root} {buildingData}");
var buildTrans = root.Find(buildingData.BuildingName);
if (buildTrans)
{
buildTrans.gameObject.SetActive(true);
}
// await RunBuildAnimation(buildingData);
}
public async Task RunBuildAnimation(BuildingData buildingData)
{
}
public void LoadBuildings(List<HexBuilding> buildings)
{
// _buildings = buildings;
_finishBuildMaps.Clear();
_unFinishBuildMap.Clear();
foreach (var hexBuilding in buildings)
{
var tileStateMap = hexBuilding.hasTiles.ToDictionary(tile => tile, tile => 0);
_unFinishBuildMap.TryGetValue(hexBuilding.zoneId, out var buildingDatas);
if (buildingDatas == null)
{
buildingDatas = new List<BuildingData>();
_unFinishBuildMap.Add(hexBuilding.zoneId, buildingDatas);
}
buildingDatas.Add(new BuildingData()
{
BuildingName = hexBuilding.buildingName,
TileStateMap = tileStateMap,
});
}
Log($"LoadBuildings -> {_unFinishBuildMap}");
}
public void CheckForBuilding(List<HexSubZone> zoneDataSubZones)
{
}
public void CheckBuildingAfterBuildImme(HexTile tiler)
{
if (_unFinishBuildMap.TryGetValue(tiler.zoneId, out var buildingDatas))
{
foreach (var buildingData in buildingDatas.Where(buildingData => buildingData.TileStateMap.ContainsKey(tiler.tileId)))
{
buildingData.TileStateMap[tiler.tileId] = 1;
var full = buildingData.TileStateMap.Values.All(value => value == 1);
if (full)
{
buildingDatas.Remove(buildingData);
AddFinishBuilding(tiler.zoneId,buildingData);
_mediator.Build(tiler.zoneId, buildingData,true);
}
break;
}
}
}
public async Task CheckBuildingAfterBuild(HexTile tiler)
{
Log($"CheckBuildingAfterBuild ->{tiler}");
//tiler.zoneId;
if (_unFinishBuildMap.TryGetValue(tiler.zoneId, out var buildingDatas))
{
foreach (var buildingData in buildingDatas.Where(buildingData => buildingData.TileStateMap.ContainsKey(tiler.tileId)))
{
buildingData.TileStateMap[tiler.tileId] = 1;
var full = buildingData.TileStateMap.Values.All(value => value == 1);
if (full)
{
buildingDatas.Remove(buildingData);
AddFinishBuilding(tiler.zoneId,buildingData);
await Awaiters.Seconds(0.5f);
_mediator.Build(tiler.zoneId, buildingData,false);
await Awaiters.Seconds(0.5f);
}
break;
}
}
// _unFinishBuildMap.
// conditions.Add(tiler.tileId);
// if (conditions.Contains("cube012") && conditions.Contains("cube011"))
// {
// _mediator.Build(tiler.zoneId);
// conditions.Clear();
// }
}
private void AddFinishBuilding(int zoneId, BuildingData buildingData)
{
_finishBuildMaps.TryGetValue(zoneId, out var buildingDatas);
if (buildingDatas == null)
{
buildingDatas = new List<BuildingData>();
_finishBuildMaps.Add(zoneId, buildingDatas);
}
buildingDatas.Add(buildingData);
}
private static void Log(object t)
{
Debug.Log($"<color=orange>BuildingManager -> {t} </color>");
}
public void SetMediator(IHexGridMediator mediator)
{
_mediator = mediator;
}
// public HexBuildingData GetCurBuildModelData()
// {
// return BuildingData;
// }
}
}