using UnityEngine; // Вешается на КАЖДЫЙ пустой участок земли, который ты вручную расставляешь // на карте вокруг Ратуши (или где угодно). На объекте обязательно должен // быть Collider2D (Box или Circle) для определения клика/наведения. // // НАСТРОЙКА В UNITY: // 1. GameObject -> Create Empty, назови "BuildSlot" (можно продублировать Ctrl+D под нужное число) // 2. Add Component -> Box Collider 2D, подгони размер под будущее здание // 3. Add Component -> Sprite Renderer -- поставь спрайт-заглушку "пустой участок" // (забор/колышки с верёвкой -- когда появится арт от дизайнеров) // 4. Add Component -> Build Slot (этот скрипт) // 5. Слой (Layer) объекта поставь "BuildSlot" -- используется BuildManager для поиска слотов public class BuildSlot : MonoBehaviour { [Tooltip("Занят ли этот участок постройкой прямо сейчас")] public bool isOccupied = false; [Tooltip("Ссылка на здание, которое сейчас стоит на этом участке (если занят)")] public GameObject occupyingBuilding; private SpriteRenderer sr; private Color emptyColor; void Awake() { sr = GetComponent(); if (sr != null) emptyColor = sr.color; } public void Occupy(GameObject building) { isOccupied = true; occupyingBuilding = building; // Прячем визуал пустого участка, раз на нём теперь стоит здание if (sr != null) sr.enabled = false; } public void Free() { isOccupied = false; occupyingBuilding = null; if (sr != null) { sr.enabled = true; sr.color = emptyColor; } } // Подсветка при наведении -- вызывается из BuildManager во время режима строительства public void SetHighlight(Color color) { if (sr != null && !isOccupied) sr.color = color; } public void ClearHighlight() { if (sr != null && !isOccupied) sr.color = emptyColor; } } // Вешается АВТОМАТИЧЕСКИ на построенное здание (кодом, не руками). // Когда здание уничтожается любым способом (Destroy в коде, удаление // в редакторе Inspector/Hierarchy, снос при апгрейде и т.д.) -- // OnDestroy сработает и освободит слот обратно. public class BuildingSlotLink : MonoBehaviour { public BuildSlot linkedSlot; void OnDestroy() { if (linkedSlot != null) { linkedSlot.Free(); } } }