В этом разделе описаны все C# скрипты проекта, их назначение и взаимосвязи.
Файл Назначение
AreaExtensions.csРасширения для работы с областью (Area): проверка пересечения, случайная точка внутри.
AssetProviderExtensions.csУпрощённые методы загрузки ресурсов через IAssetProvider (LoadPrefab, LoadConfig).
CoroutineExtensions.csРасширения для MonoBehaviour для запуска корутин с автоматической отменой при уничтожении объекта.
DelegateExtensions.csУтилиты для безопасного вызова делегатов (InvokeSafe).
EnumerableExtensions.csМетоды для IEnumerable<T> (например, RandomElement).
FactoryExtensions.csРасширения для фабрик, создающие объекты с параметрами по умолчанию.
RectangleExtensions.csОперации с прямоугольниками (Rectangle): пересечение, объединение, случайная точка.
TransformExtensions.csПолезные методы для Transform: поиск детей по имени, сброс трансформации.
Файл Назначение
GizmosAreaDrawer.csВизуализация областей (Area) в редакторе Unity через Gizmos.
PriorityQueue.csОбобщённая очередь с приоритетом на основе двоичной кучи. Используется для планирования задач.
ThrowIf.csУтилита для проверки предусловий с выбрасыванием исключений (ThrowIf.Null, ThrowIf.OutOfRange).
Utils.csРазнообразные статические helper‑методы (математика, преобразования, логика).
WeakReferenceComparer.csКомпаратор для WeakReference, позволяющий использовать weak‑ссылки в коллекциях.
Файл Назначение
Area.csПредставляет прямоугольную область на плоскости XZ с методами для проверки принадлежности точки.
AreaRaycaster.csЛучший в области для поиска объектов определённого типа (например, ресурсов).
Rectangle.csСтруктура прямоугольника с координатами левого нижнего и правого верхнего углов.
ResourceSpendRequest.csЗапрос на трату ресурсов, содержит тип ресурса и количество.
Structure.csБазовый класс для всех строений (баз, флагов). Содержит общие свойства и методы.
Файл Назначение
BaseStructure.csОсновной компонент базы: управление рабочими, сканирование ресурсов, постройка новых рабочих.
BuilderManagement/Логика строительства (стоимость, время, отмена).
ResourceSpawner.csСистема спавна ресурсов в заданной области с весами и интервалами.
TaskManagement/Управление задачами рабочих (сбор, доставка, ожидание).
TransportationManagement/Логика транспортировки ресурсов от точки сбора до базы.
WorkerMovement/Движение рабочего по NavMesh с использованием WorkerMover.
World.csКонтейнер для глобальных игровых объектов, обеспечивает доступ к земле, ресурсам, базам.
GrabPoint.csТочка захвата ресурса на рабочем (привязка ресурса к определённой кости).
Flag.csКомпонент флага, который игрок может размещать для указания зоны сбора.
Worker.csГлавный компонент рабочего: состояние, анимации, обработка задач, перемещение.
Файл Назначение
BaseStructureConfig.csScriptableObject с настройками базы: радиус сканирования, интервалы, начальное количество рабочих.
BuilderConfig.csКонфигурация строительства: стоимость и время постройки базы и рабочего.
ResourceSpawnerConfig.csНастройки спавна ресурсов: веса типов, область спавна, интервал.
ResourceWeight.csСтруктура веса ресурса (тип и вес) для взвешенного случайного выбора.
DataLoader.csЗагрузчик данных для конкретного типа ScriptableObject.
DataLoaderGeneric.csОбобщённый загрузчик данных.
IStaticDataProvider.csИнтерфейс провайдера статических данных.
StaticDataProvider.csРеализация провайдера, загружающая конфиги из папки Resources/Configs/.
Файл Назначение
Bootstrap.csТочка входа: создаёт и регистрирует все сервисы (EventAggregator, AssetProvider, InputReader).
ICoroutineRunner.csИнтерфейс для запуска корутин, абстрагирующий зависимость от MonoBehaviour.
IInstantiator.csИнтерфейс для инстанцирования объектов (обычно через Object.Instantiate).
ObjectInstantiator.csРеализация IInstantiator с использованием Unity‑метода.
SubscriptionInstaller.csВспомогательный класс для массовой подписки на события.
Файл Назначение
IntelligentEventAggregator.csОсновная реализация системы событий с поддержкой фильтров и условий подписки.
MultipleSubscribeProvider.csПровайдер для подписки на несколько событий одновременно.
ObservableList.csРеактивный список, уведомляющий об изменениях через события.
SubscribeProvider.csБазовый провайдер подписки на одно событие.
FakeSource.csТестовый источник событий для отладки.
Conditions/ Условия подписки (AlwaysTrue, Named, Sequence, SourceProperty, SourceType).
Contracts/ Интерфейсы событийной системы (IEvent, IEventAggregator, IEventFilter и т.д.).
Data/ Вспомогательные классы (EventTypeRegistry, SourceInfo, SubscriptionInfo).
Файл Назначение
ObjectPool.csПул объектов для повторного использования префабов.
Factory.csБазовая фабрика без параметров.
SingleParameterFactory.csФабрика с одним параметром.
TwoParametersFactory.csФабрика с двумя параметрами.
ThreeParametersFactory.csФабрика с тремя параметрами.
Contracts/ Интерфейсы фабрик (IFactory, ISingleParameterFactory и т.д.).
Data/ События пула (ObjectPoolEvent, PoolObjectCreatedEvent).
Файл Назначение
IAssetProvider.csИнтерфейс для загрузки ресурсов (префабов, конфигов).
AssetProvider.csРеализация, использующая Resources.Load с кэшированием.
Файл Назначение
IInputReader.csИнтерфейс чтения ввода (клики, перемещение камеры).
InputReader.csРеализация на основе Unity Input System.
Файл Назначение
Contracts/ IPresenter — базовый интерфейс презентера.
Storage/ ResourceStoragePresenter, StorageView — презентер и вид для отображения ресурсов.
Structures/ BaseStructurePresenter, SelectedStructurePanelPresenter — управление UI базы.
TaskManagement/ ResourceTaskManagementPresenter — презентер для задач сбора ресурсов.
Bootstrap — инициализация.
World — управление игровым миром.
ResourceSpawner — спавн ресурсов.
TaskManagement — диспетчеризация задач.
BuilderManagement — управление строительством.
Area, Rectangle — геометрические примитивы.
ResourceSpendRequest — DTO для траты ресурсов.
ResourceWeight — вес ресурса.
Structure — абстракция строения.
Все презентеры в Infrastructure/UI/.
StorageView, ResourceManagementView — Unity UI компоненты.
Все классы в Common/Utilities и Common/Extensions.
ThrowIf, PriorityQueue, Utils.
IntelligentEventAggregator — система событий.
AssetProvider — загрузка ресурсов.
StaticDataProvider — доступ к конфигурациям.
InputReader — обработка ввода.
sequenceDiagram
participant B as Bootstrap
participant E as EventAggregator
participant W as World
participant BS as BaseStructure
participant R as ResourceSpawner
participant Wo as Worker
participant T as TaskManagement
B->>E: Создание и регистрация
B->>W: Создание мира
B->>R: Запуск спавна ресурсов
B->>BS: Инициализация базы
BS->>Wo: Создание начальных рабочих
loop Каждый кадр
R->>R: Проверка интервала спавна
R->>W: Создание ресурса
BS->>BS: Сканирование области
BS->>T: Назначение задач
T->>Wo: Выдача задачи рабочему
Wo->>Wo: Движение к ресурсу
Wo->>Wo: Сбор ресурса
Wo->>BS: Доставка ресурса
BS->>E: Публикация ResourceCollectedEvent
end
Ввод обрабатывается через Unity Input System . Класс InputReader реализует интерфейс IInputReader и предоставляет события:
OnClick — при клике левой кнопкой мыши.
OnRightClick — при клике правой кнопкой.
OnDrag — при перемещении мыши с зажатой кнопкой.
OnZoom — при прокрутке колёсика.
Пример использования:
public class SomeController : MonoBehaviour
{
[SerializeField] private IInputReader _inputReader;
private void OnEnable()
{
_inputReader.OnClick += HandleClick;
}
private void OnDisable()
{
_inputReader.OnClick -= HandleClick;
}
private void HandleClick(Vector2 screenPosition)
{
// Конвертируем screenPosition в мировые координаты
// и выполняем действие
}
}
События реализованы через IntelligentEventAggregator, который поддерживает:
Типизированные события (наследники IEvent).
Фильтры (IEventFilter) для выборочной доставки.
Условия подписки (ISubscribeCondition) для динамического управления подписками.
Weak‑ссылки на подписчиков, чтобы избежать утечек памяти.
Пример события:
public class ResourceCollectedEvent : IEvent
{
public ResourceType Type { get; }
public int Amount { get; }
public ResourceCollectedEvent(ResourceType type, int amount)
{
Type = type;
Amount = amount;
}
}
Подписка и публикация:
// Подписка
_eventAggregator.Subscribe<ResourceCollectedEvent>(OnResourceCollected);
// Публикация
_eventAggregator.Publish(new ResourceCollectedEvent(ResourceType.Stone, 1));
// Обработчик
private void OnResourceCollected(ResourceCollectedEvent evt)
{
Debug.Log($"Собран ресурс {evt.Type} в количестве {evt.Amount}");
}
Для работы с корутинами используется интерфейс ICoroutineRunner, который позволяет запускать корутины вне MonoBehaviour.
Пример:
public class SomeService
{
private readonly ICoroutineRunner _coroutineRunner;
public SomeService(ICoroutineRunner coroutineRunner)
{
_coroutineRunner = coroutineRunner;
}
public void StartCounting()
{
_coroutineRunner.StartCoroutine(CountCoroutine());
}
private IEnumerator CountCoroutine()
{
for (int i = 0; i < 10; i++)
{
Debug.Log(i);
yield return new WaitForSeconds(1);
}
}
}
Расширение CoroutineExtensions добавляет метод StartCoroutineSafe, который автоматически останавливает корутину при уничтожении объекта.
Соблюдайте слоистую архитектуру : инфраструктурный код — в Infrastructure/, игровая логика — в Gameplay/, общие утилиты — в Common/.
Используйте события для связи между системами, а не прямые вызовы.
Проверяйте предусловия с помощью ThrowIf.
Документируйте публичные методы XML‑комментариями.
Следите за длиной файлов — не более 200 строк (правило проекта).