Untitled

 avatar
unknown
csharp
2 months ago
2.8 kB
6
Indexable
using System;
using System.Collections.Generic;
using UnityEngine;

public class BuildingManager : MonoBehaviour
{
    public static BuildingManager Instance;
    
    [SerializeField] private List<BuildingObject> buildingDatabase = new List<BuildingObject>();
    private Dictionary<string, BuildingObject> _buildingCache;

    public List<BuildingObject> GetBuildings()
    {
        return buildingDatabase;
    }
    
    public void Awake()
    {
        Instance = this;
        InitializeBuildingCache();
    }
    
    private void InitializeBuildingCache()
    {
        _buildingCache = new Dictionary<string, BuildingObject>();
        foreach (var building in buildingDatabase)
        {
            if (_buildingCache.ContainsKey(building.BuildingID))
            {
                Debug.LogError($"Duplicate building ID: {building.BuildingID}");
                continue;
            }
            _buildingCache.Add(building.BuildingID, building);
        }
    }

    public BuildingObject GetBuildingByID(string buildingID)
    {
        if (string.IsNullOrEmpty(buildingID))
        {
            Debug.LogError("Attempted to search with null/empty ID");
            return null;
        }

        if (_buildingCache.TryGetValue(buildingID, out var building))
        {
            return building;
        }

        Debug.LogWarning($"Building with ID '{buildingID}' not found!");
        return null;
    }

    public readonly List<IBuilding> CurrentBuildings = new List<IBuilding>();

    //Постройка объекта в клетке
    public void BuildBuilding(BuildingObject buildingObject, GridCell gridCell)
    {
        var building = Instantiate(buildingObject.Prefab, gridCell.transform.position, Quaternion.identity);
        building.transform.SetParent(gridCell.transform);
        gridCell.currentObject = building;
        RegisterBuilding(building.GetComponent<IBuilding>());
    }

    //Уничтожение клетки
    public void DestroyBuilding(GridCell gridCell)
    {
        if (gridCell.currentObject == null)
        {
            Debug.LogWarning("Клетка пустая.");
            return;
        };
        var building = gridCell.currentObject;
        gridCell.currentObject = null;
        UnregisterBuilding(building.GetComponent<IBuilding>());
        Destroy(building.gameObject);
    }

    private void RegisterBuilding(IBuilding building)
    {
        if (!CurrentBuildings.Contains(building))
        {
            CurrentBuildings.Add(building);
        }
    }
    
    private void UnregisterBuilding(IBuilding building)
    {
        if (CurrentBuildings.Contains(building))
        {
            CurrentBuildings.Remove(building);
        }
    }
}
Editor is loading...
Leave a Comment