- Ядро (Bogatyri.Core): контракты модулей, EventBus, GameServices, SaveRegistry - Модули: Экономика, Поселение, Армия, Глобальный мир, Боевая система, Сохранения (каждый — отдельный asmdef, видит только ядро) - App/GameModules: регистрация модулей и связь с GameProgress/Казармами - Сохранения v2 по секциям модулей, перенос старого save.json и походов из progress.json - Сброс сохранений: ISaveSystem.ResetAll, ResetState у модулей, меню Tools - EditMode-тесты модулей, документы по каждому модулю с журналом изменений Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
3.1 KiB
C#
82 lines
3.1 KiB
C#
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<SpriteRenderer>();
|
|
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();
|
|
}
|
|
}
|
|
} |