Я делаю игру по типу Frostpunk + Factorio, сейчас у меня готова карта и я сделал механику размещения, у карты тег building, а у плоскости которая находится чуть выше карты, но также в углублении, тег placement, у зданий тоже тег building, чтобы нельзя было друг в друга строить, мне надо сделать каким то образом разметку секторов по кругу так как углубление круглое как во Frostpunk и соответственно зданий туда ставить, вот как выглядят 2 основных скрипта сейчас:
BuildingsPanelController.cs работает с панелью и когда пользователь тыкнул на здание то оно вызывает скрипт BuildingPlacer.cs
using UnityEngine;

public class BuildingPlacer : MonoBehaviour
{
    [Header("Placement Settings")]
    public LayerMask placementLayer; // Слой поверхности, на которую можно ставить
    public LayerMask buildingLayer; // Слой зданий для проверки столкновений
    public Material validPlacementMaterial; // Материал при допустимом размещении
    public Material invalidPlacementMaterial; // Материал при недопустимом размещении

    private GameObject currentBuilding; // Текущий объект для размещения
    private MeshRenderer[] buildingRenderers; // Все рендеры здания
    private Material[] originalMaterials; // Исходные материалы здания
    private bool canPlace = true; // Флаг, можно ли размещать здание
    private int originalLayer; // Слой объекта до проверки

    public bool HasActivePlacement => currentBuilding != null;

    private void Update()
    {
        if (HasActivePlacement)
        {
            FollowMouse();

            if (Input.GetMouseButtonDown(0) && canPlace) // ЛКМ для размещения
            {
                PlaceBuilding();
            }
            else if (Input.GetKeyDown(KeyCode.Escape)) // ESC для отмены
            {
                CancelPlacement();
            }
        }
    }

    public void StartPlacingBuilding(GameObject buildingPrefab)
    {
        CancelPlacement();

        currentBuilding = Instantiate(buildingPrefab);
        buildingRenderers = currentBuilding.GetComponentsInChildren<MeshRenderer>();

        // Сохраняем исходный слой
        originalLayer = currentBuilding.layer;

        // Сохраняем оригинальные материалы
        originalMaterials = new Material[buildingRenderers.Length];
        for (int i = 0; i < buildingRenderers.Length; i++)
        {
            originalMaterials[i] = buildingRenderers[i].material;
        }

        // Устанавливаем временный материал
        UpdatePlacementMaterial(validPlacementMaterial);
    }

    private void FollowMouse()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, placementLayer))
        {
            currentBuilding.transform.position = hit.point;

            // Поднимаем здание так, чтобы оно стояло на поверхности
            Collider buildingCollider = currentBuilding.GetComponent<Collider>();
            if (buildingCollider != null)
            {
                float heightOffset = buildingCollider.bounds.extents.y;
                currentBuilding.transform.position += Vector3.up * (heightOffset + 0.001f);
            }

            CheckPlacementValidity();
        }
    }

    private void CheckPlacementValidity()
    {
        Collider buildingCollider = currentBuilding.GetComponent<Collider>();
        if (buildingCollider == null)
        {
            Debug.LogWarning("Building prefab is missing a collider.");
            canPlace = false;
            UpdatePlacementMaterial(invalidPlacementMaterial);
            return;
        }

        // Временно убираем объект из слоя зданий, чтобы он не проверял себя
        currentBuilding.layer = LayerMask.NameToLayer("Ignore Raycast");

        Collider[] overlaps = Physics.OverlapBox(
            buildingCollider.bounds.center,
            buildingCollider.bounds.extents,
            currentBuilding.transform.rotation,
            buildingLayer
        );

        // Возвращаем объект на слой зданий
        currentBuilding.layer = originalLayer;

        canPlace = overlaps.Length == 0;

        UpdatePlacementMaterial(canPlace ? validPlacementMaterial : invalidPlacementMaterial);
    }

    private void UpdatePlacementMaterial(Material material)
    {
        if (buildingRenderers != null && material != null)
        {
            foreach (var renderer in buildingRenderers)
            {
                renderer.material = material;
            }
        }
    }

    private void PlaceBuilding()
    {
        if (currentBuilding != null)
        {
            // Восстанавливаем оригинальные материалы
            for (int i = 0; i < buildingRenderers.Length; i++)
            {
                buildingRenderers[i].material = originalMaterials[i];
            }

            currentBuilding.layer = originalLayer; // Убедимся, что слой вернулся
            currentBuilding = null; // Завершаем размещение
        }
    }

    public void CancelPlacement()
    {
        if (currentBuilding != null)
        {
            Destroy(currentBuilding);
            currentBuilding = null;
        }
    }
}