Статус: Draft
Актуальная карта сборок проекта. Обновлять при добавлении новых модулей или изменении зависимостей.
Граф пересмотрен в рамках Фазы 1 (см. 10. Архитектура реализации — Фаза 1 §2). Старый набор (Core/Units/Combat/Guild/UI) был временным; здесь — финальная структура «как надо».
Граф зависимостей
Core
├─ Data → Core
├─ Combat → Core, Data
├─ Guild → Core, Data
├─ MiniGames → Core, Data
├─ Net → Core, Combat
├─ Presentation → Core, Data, Combat
├─ UI → Core, Data, Guild
├─ DevTools → Core, Data, Combat, Game
└─ Game → Core, Data, Combat, Guild, MiniGames, Net, Presentation, UI
Стрелка означает «зависит от». Всё зависит только вниз. Game — единственный, кто знает всех (composition root). Core ни от чего не зависит.
Текущие сборки
| Сборка | Путь | Зависит от | Внешние пакеты | Назначение |
|---|---|---|---|---|
Guildmaster.Core | Scripts/Core/ | — | — (по возможности noEngineReferences) | IRngService, математика сим, тик-контракты, базовые интерфейсы команд/событий |
Guildmaster.Data | Scripts/Data/ | Core | Odin, UnityEngine | ScriptableObject-определения (StatsConfig, RelicData, VesselData, EffectData), StatType, ScalableValue, полиморфные интерфейсы поведения (IEffectComponent) |
Guildmaster.Combat | Scripts/Combat/ | Core, Data | — (чистая логика, без VContainer/UniTask/физики) | Детерминированная симуляция: RuntimeUnit, Stats, тик-степпер, системы, пайплайн урона, ICombatContext, spatial hash |
Guildmaster.Guild | Scripts/Guild/ | Core, Data | — | Ростер, RunState, ресурсы (стаб до Фазы 5) |
Guildmaster.MiniGames | Scripts/MiniGames/ | Core, Data | — | Изолированные мини-игры за IMiniGame (стаб) |
Guildmaster.Net | Scripts/Net/ | Core, Combat | NGO, Facepunch.Steamworks | Host-authoritative реле команд, инициализация транспорта (спайк в Фазе 1) |
Guildmaster.Presentation | Scripts/Presentation/ | Core, Data, Combat | Shapes, Feel, LitMotion, MessagePipe, UniTask | World-space вид боя: спрайты, HP-бары, damage numbers, debug-draw, фидбэк. Только читает сим |
Guildmaster.UI | Scripts/UI/ | Core, Data, Guild | UI Toolkit, MessagePipe | Экраны меню/HUD/карты, MVVM (стаб до Фазы 7) |
Guildmaster.DevTools | Scripts/DevTools/ | Core, Data, Combat, Game | Quantum Console | Debug-команды gm_* |
Guildmaster.Game | Scripts/Game/ | все выше | VContainer, MessagePipe, UniTask, NGO | Composition root (RootLifetimeScope/CombatLifetimeScope), GameFlow, загрузка сцен, пуск тик-цикла |
Guildmaster.Tests.EditMode | Tests/EditMode/ | Core, Data, Combat | NUnit | Детерминизм, урон, статы, spatial hash, снаряды |
Guildmaster.Tests.PlayMode | Tests/PlayMode/ | Core, Data, Combat, Game | NUnit | Интеграция: battle start → loop → end |
Все пути — относительно
Assets/_Project/Scripts/(рантайм) иAssets/Tests/(тесты).
Правила
Куда класть новый скрипт
- Базовые контракты и математика сим (
IRngService, тик-константы, интерфейсы команд/событий) →Core - Данные-определения (SO: статы, реликвии, сосуды, эффекты; полиморфные интерфейсы поведения) →
Data - Логика боя (симуляция, урон, движение, таргетинг, снаряды) →
Combat - Гильдия (ростер,
RunState, ресурсы) →Guild - Сеть (host-auth реле, транспорт) →
Net - World-space презентация боя (спрайты, HP-бары, числа, debug-draw, Feel) →
Presentation - Экранный UI (UI Toolkit, меню, HUD, MVVM) →
UI - Debug-команды (
gm_*, Quantum Console) →DevTools - Composition root, GameFlow, загрузка сцен, тик-пульс →
Game
Запрещённые зависимости
Coreне зависит ни от чего в проектеDataзависит только отCore(никакой боевой/сетевой логики)Combat— чистая C#-логика: без VContainer, UniTask, Unity-физики; зависимости приходят через конструкторы, не[Inject]Presentation/UIтолько читают сим — не мутируют состояние боя- Зависеть от
Gameможет толькоDevTools; самGame— вершина, его никто (кроме DevTools) не импортирует - Циклические зависимости запрещены
Если зависимость тянет вверх (
Combatхочет знать оGuild) — вынеси общий интерфейс вCore. Если SO-определение тянет поведение (RelicData→EffectData/IEffectComponent) — оба живут вData, нижеCombat.
Добавление нового модуля
- Создать папку в
Assets/_Project/Scripts/<ModuleName>/ - Создать
.asmdef:Create → Assembly Definitionв Unity - Имя сборки:
Guildmaster.<ModuleName> - Namespace:
Guildmaster.<ModuleName> - Добавить зависимости только те, что реально нужны
- Обновить таблицу в этом файле
- Обновить
.asmdefтестовых сборок, если тесты покрывают новый модуль
Именование
- Файл
.asmdef:Guildmaster.<ModuleName>.asmdef - Имя сборки (
name):Guildmaster.<ModuleName> - Корневой namespace (
rootNamespace):Guildmaster.<ModuleName> - Папка:
PascalCase, совпадает с именем модуля
История изменений
| Дата | Изменение |
|---|---|
| 2026-05-28 | Начальная структура: Core, Units, Combat, Guild, UI |
| 2026-05-30 | Рефактор графа под Фазу 1 (док 10 §2): Units→Data; добавлены MiniGames, Net, Presentation, DevTools, Game. Тесты переведены на Data |