Skip to content

Техническая спецификация

Commit: [hash]

1. Архитектура

graph TD
    IdleMiner["IdleMiner (singleton)"]
    IdleMiner --> Arena["IdleMinerArena"]
    IdleMiner --> Game["IdleMinerGame"]
    IdleMiner --> Camera["IdleMinerCamera"]

    Game --> Workers["IdleMinerWorker[]"]
    Game --> WorkerAnimator["IdleMinerWorkerAnimator"]
    Game --> Processes["MiningProcess[]"]

    Arena --> Reachability["IdleMinerReachability"]
    Arena --> DropSystem["IdleMinerDropSystem"]
    Arena --> CellGrid["CellInfo[,]"]
    Arena --> Objects["IdleMinerObject[]"]

    Component["IdleMinerComponent"] --> Model["Model (save data)"]
    Component --> Config["IdleMinerConfig"]

    IdleMiner -.-> Component
    Game -.-> Component

IdleMiner — точка входа и singleton, создаёт три подсистемы: Arena (сетка, объекты), Game (процессы, рабочие), Camera. IdleMinerComponent хранит данные профиля (Model), IdleMinerConfig — все настройки. Arena владеет сеткой клеток и делегирует доступность в Reachability, дроп — в DropSystem. Game управляет IdleMinerWorker[] и анимациями через WorkerAnimator.


2. Флоу работы фичи

Инициализация

  1. IdleMinerLauncher.Awake() — загружает префаб арены из Resources/IdleMiner/Arenas/, вызывает IdleMiner.Create(arena, launcher)
  2. IdleMiner.Initialize() — инициализирует WorkerStates (создаёт если нет, первый рабочий разблокирован), ArenaData (создаёт первую арену если пусто), вызывает Arena.Load(), создаёт IdleMinerGame, вызывает RecalculateAccessibility, создаёт WorkerViews (инстанцирует из префаба если нет), инициализирует камеру
  3. Arena.Load() — строит CellGrid из объектов сцены, восстанавливает расчищенные клетки из ClearedObjectIds, запускает flood fill от StartPoint, восстанавливает дропы из PendingDrops

Основной цикл

IdleMinerGame.Update() → проверяет завершение активных процессов (elapsed >= TotalDuration) → вызывает CompleteMining() → спавнит дропы → пересчитывает доступность → обновляет глубину

Офлайн

IdleMinerComponent.ReturnAfterLongPause()IdleMinerGame.ProcessOfflineTime(currentTime, lastActiveTime) → завершает все процессы где elapsed >= TotalDuration (без анимаций, fireEvents: false) → показывает IdleMinerOfflinePopup со списком завершённых процессов и длительностью офлайна


3. Сцены и ассеты

Ассет Путь
Сцена Assets/Data/Scenes/IdleMiner.unity
Арена (тест) Assets/Data/Resources/IdleMiner/Arenas/IdleMinerArena_default.prefab

4. Конфиги

IdleMinerConfig

Конфиг: Assets/Data/Configs/IdleMiner/IdleMinerConfig.asset Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Meta/IdleMinerConfig.cs

Общие настройки

Параметр Поле Описание
Стартовые монеты StartCoins
Компенсация гемов за монету GemsPerCoinCompensation При завершении события
Порог уведомления о монетах NotificationCoinsCount
Ширина сетки GridWidth По умолчанию 10
Размер клетки CellSize В world units, по умолчанию 1
Минимальное время расчистки MinimumMiningTime В секундах
Округление времени TimeRoundingStep До 10 сек
Стоимость ускорения за минуту SpeedUpCostPerMinute
Иконка монет CoinsIcon Sprite, используется в UI главного экрана
Фон монет CoinsBack Sprite
Эффект полёта монет CoinsFlyEffect ResourceFlyEffectConfig

Настройки рабочих

Параметр Поле Описание
Префаб рабочего WorkerPrefab IdleMinerWorkerView
Стоимость покупки 2-го рабочего Worker2UnlockCost
Стоимость покупки 3-го рабочего Worker3UnlockCost
Стоимость апгрейда по уровням WorkerUpgradeCosts[] После конца — линейный рост с последним шагом
% бонуса скорости за уровень рабочего SpeedBonusPerWorkerLevel 0.1 = 10%
Максимум рабочих IdleMiner.MaxWorkers Константа = 3 (в IdleMiner.cs)

Пресеты типов руды

Путь конфигов: Assets/Data/Configs/IdleMiner/OrePresets/ Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Config/IdleMinerOrePresetConfig.cs Подключение: через IdleMinerObjectConfig.Preset на каждом объекте руды

Параметр Поле Описание
Иконка Icon Sprite
Размер Size Vector2Int (1x1, 2x2, 3x3)
Мин. уровень рабочего MinWorkerLevel
Время расчистки на 1 уровне BaseTime В секундах
% роста времени за уровень объекта TimeGrowthPerObjectLevel 0.2 = 20%
% снижения времени за доп. уровень рабочего TimeReductionPerWorkerLevel 0.1 = 10%
Пресет дропа DropPreset RewardByWeight — список наград с весами

Дроп-система (RewardByWeight)

Каждая запись в DropPreset.Rewards[]:

Поле Тип Описание
Weight float Вес (вероятность) этого дропа
Reward IReward Тип и количество награды

При расчистке выбирается ровно одна награда по весам через ProbabilityByRange<IReward>.

Настройки экземпляра объекта (на префабе)

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Config/IdleMinerObjectConfig.cs

Параметр Поле Описание
Пресет типа руды Preset Ссылка на IdleMinerOrePresetConfig
Уровень руды Level Уровень конкретного экземпляра

Все остальные поля (Size, MinWorkerLevel, BaseTime, TimeGrowthPerObjectLevel, TimeReductionPerWorkerLevel, DropPreset) делегируются в Preset.

Настройки арены

Путь конфигов: Assets/Data/Configs/IdleMiner/ Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Config/IdleMinerArenaConfig.cs Подключение: IdleMinerConfig.Arenas[]

Параметр Поле Описание
Направление копки Direction DigDirection enum (Up / Down), по умолчанию Down

Маппинг наград на дроп-префабы

Конфиг: Assets/Data/Configs/IdleMiner/IdleMinerRewardDropConfig.asset Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Config/IdleMinerRewardDropConfig.cs

  • Prefabs[] — список дроп-префабов
  • GetPrefab(IReward) — матчит по типу награды (для ResourceReward также по Config)
  • Кнопка "Refresh Prefabs List" подтягивает все из папки дропов

5. Модели данных

IdleMinerComponent.Model

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Meta/IdleMinerComponent.cs Наследует: EventActiveByTimeModel

Корневая модель сохранения всего прогресса фичи.

Поле Тип Описание
Coins int Текущие монеты события
InAppCoins int Монеты, полученные через IAP
Depth int Общая глубина
Arenas List<ArenaData> Данные всех арен
CurrentArenaIndex int Индекс текущей арены
Workers WorkerState[] Состояния рабочих (размер = MaxWorkers)
ActiveProcesses List<MiningProcess> Активные процессы добычи
CompletedProcesses List<MiningProcess> Завершённые процессы
LastActiveTimestamp long Время последней активности (для офлайн-расчёта)

WorkerState

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Data/WorkerState.cs

Поле Тип Описание
Level int Уровень рабочего (начинается с 1)
IsUnlocked bool Разблокирован ли рабочий
CurrentProcessId string ID текущего процесса добычи
Position Vector2Int Позиция на сетке

MiningProcess

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Data/MiningProcess.cs

Поле Тип Описание
Id string Уникальный ID (GUID)
ObjectId string ID объекта на арене
WorkerIndex int Индекс рабочего
StartTimestamp long Время начала добычи
TotalDuration float Полная длительность добычи
IsCompleted bool Завершён ли процесс

Ключевые методы:

  • GetProgress(long currentTimestamp)Clamp01(elapsed / TotalDuration)
  • CheckCompletion(long currentTimestamp)elapsed >= TotalDuration
  • GetRemainingTime(long currentTimestamp)Max(0, TotalDuration - elapsed)

RewardDropState

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Data/ArenaData.cs

Поле Тип Описание
CellPosition Vector2Int Позиция дропа на сетке
Reward IReward Награда ([SerializeReference])

ArenaData

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Data/ArenaData.cs Реализует: ISerializationCallbackReceiver (сериализация HashSet через List)

Поле Тип Описание
ConfigIndex int Индекс конфига арены в IdleMinerConfig.Arenas[]
CurrentDepth int Текущая глубина
CameraInitialized bool Инициализирована ли камера для этой арены
CameraViewY float Позиция камеры по Y
PendingDrops List<RewardDropState> Несобранные дропы на поле
ClearedObjectIds HashSet<string> ID расчищенных объектов

CellInfo

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Data/CellInfo.cs

Поле Тип Описание
IsReachable bool Доступна ли клетка (flood fill)
Object IdleMinerObject Объект в клетке
Drops List<IdleMinerRewardDrop> Дропы в клетке
WorkerIndex int Индекс рабочего (-1 = нет)

Свойства:

  • HasObjectObject != null
  • HasDropsDrops != null && Drops.Count > 0
  • HasWorkerWorkerIndex >= 0
  • IsFreeIsReachable && !HasObject && !HasDrops

Методы: AddDrop(drop), RemoveDrop(drop)

IdleMinerWorker

Скрипт: Assets/Data/Scripts/Meta/IdleMiner/Workers/IdleMinerWorker.cs

Поле Тип Описание
State WorkerState Ссылка на состояние рабочего
Config IdleMinerConfig Ссылка на конфиг

Ключевые методы:

  • IsBusy!string.IsNullOrEmpty(State.CurrentProcessId)
  • GetSpeedMultiplier() — формула: Pow(1 + SpeedBonusPerWorkerLevel, Level - 1)
  • GetUpgradeCost() — lookup из WorkerUpgradeCosts[], или экстраполяция с последним шагом
  • Upgrade()State.Level++

Ключевые формулы

Формула Выражение Где живёт
Время добычи BaseTime * (1+TimeGrowthPerObjectLevel)^(ObjLevel-1) / (1+TimeReductionPerWorkerLevel)^(WorkerLevel-MinWorkerLevel) IdleMinerOre.GetMiningTime()
Множитель скорости Pow(1 + SpeedBonusPerWorkerLevel, Level - 1) IdleMinerWorker.GetSpeedMultiplier()
Стоимость апгрейда WorkerUpgradeCosts[level-1], после конца массива — линейный рост с последним шагом IdleMinerWorker.GetUpgradeCost()

6. Префабы

Объекты

Путь: Assets/Data/Prefabs/IdleMiner/Prefabs/

Префаб Описание
IdleMinerOre01–06.prefab Руда (6 видов)
IdleMinerOreBig.prefab Большая руда
IdleMinerOreChest2x2.prefab Сундук 2x2
IdleMinerOreChest3x3.prefab Сундук 3x3
IdleMinerBlock1x1_*.prefab Препятствия 1x1 (Cart, FlashLight, Stone1–3)
IdleMinerBlock2x2_*.prefab Препятствия 2x2 (Stone1–3)
IdleMinerBlock3x3_*.prefab Препятствия 3x3 (Mine, Stone1–2)
IdleMinerWorker.prefab Рабочий
IdleMinerHouse.prefab Домик рабочего (декор, без функционала)
IdleMinerElementUI.prefab UI-элемент объекта на поле

Дропы

Путь: Assets/Data/Prefabs/IdleMiner/Drops/

IdleMinerDrop*.prefab — 18 видов: Gold, Gems, Energy, Blueprint, GoldenBlueprint, Egg, PetBones, Shovel, Drill, TNT, ItemKey, Chest, Chest2, Pizza, EpicCopy, LegendaryCopy, SafeGem, SafeGold

UI

Путь: Assets/Data/Prefabs/UI/Meta/IdleMiner/

Префаб Описание
EventIdleMiner.prefab Основной UI события
EventIdleMinerPack.prefab Магазин паков
EventIdleMinerStartMining.prefab Панель начала добычи
EventIdleMinerImprove.prefab Панель улучшения
EventIdleMinerTutorial.prefab Туториал
ButtonWorker.prefab Кнопка рабочего
IdleMinerCompletedLevelElement.prefab Элемент завершённого уровня

7. Скрипты

Core

IdleMiner.cs (Core/)

  • Точка входа и singleton фичи. Создаёт Arena, Game, Camera. Содержит константу MaxWorkers = 3. Управляет жизненным циклом: Create() → инициализация подсистем, Dispose() → очистка.

IdleMinerGame.cs (Core/)

  • Основная игровая логика. Управляет процессами добычи, рабочими, позиционированием и вытеснением. Обрабатывает офлайн-прогресс, ускорение, покупку и апгрейд рабочих. В Update() проверяет завершение активных процессов.

IdleMinerArena.cs (Core/)

  • Арена — MonoBehaviour на префабе. Хранит сетку клеток CellGrid, словарь объектов по ID. Загружает объекты из сцены, управляет доступностью через Reachability, спавном дропа через DropSystem. Вычисляет глубину и обрабатывает завершение арены.

IdleMinerLauncher.cs (Core/)

  • Загрузчик сцены. В Awake() инстанцирует арену из Resources и вызывает IdleMiner.Create(). Предоставляет ссылку на камеру.

IdleMinerDropSystem.cs (Core/)

  • Система дропа. Спавнит награды на позициях расчищенных объектов, сохраняет в ArenaData.PendingDrops. Восстанавливает дропы при загрузке, удаляет невалидные.

IdleMinerReachability.cs (Core/)

  • Расчёт доступности клеток через flood fill от StartPoint. Определяет, доступен ли объект для добычи. Возвращает AdjacentCellStatus — что именно блокирует каждую соседнюю клетку.

IdleMinerAlignStartPoint.cs (Core/)

  • Editor-утилита. Кнопки Odin для выравнивания StartPoint над/под объектами арены и привязки к ближайшей клетке сетки.

Meta

IdleMinerComponent.cs (Meta/)

  • Компонент профиля игрока. Хранит Model (монеты, глубина, арены, рабочие, процессы). Управляет добавлением/тратой монет, компенсацией гемов через почту при завершении события. Обрабатывает офлайн через ReturnAfterLongPause(). Метод ReportMaxWorkerLevel() отправляет максимальный уровень рабочего в лидерборд (League.SetValue).

IdleMinerConfig.cs (Meta/)

  • Основной ScriptableObject-конфиг. Наследует EventActiveByTimeConfig. Содержит все настройки: сетка, рабочие, добыча, арены, дропы, ресурсы UI.

IdleMinerDelegates.cs (Meta/)

  • Набор делегатов для интеграции с мета-системами. Содержит: IdleMinerNotification, IdleMinerButtonDelegate, IdleMinerMainScreenResourcesReceiverDelegate, IdleMinerPackDelegate, IdleMinerCompensationProvider, IdleMinerEventAvailableDelegate, IdleMinerAdsNotification, IdleMinerPackNotification, IdleMinerPackAdsNotification, IdleMinerLeaderboardSeasonTimeGetter.

Config

IdleMinerOrePresetConfig.cs (Config/)

  • ScriptableObject — пресет типа руды. Задаёт иконку, размер, мин. уровень рабочего, базовое время, коэффициенты роста/снижения, дроп-таблицу RewardByWeight.

IdleMinerObjectConfig.cs (Config/)

  • Настройки конкретного экземпляра объекта на арене. Содержит ссылку на Preset и Level. Все остальные поля (Size, BaseTime и т.д.) делегируются в пресет. Также определяет enum IdleMinerObjectType (Obstacle, Ore, Chest).

IdleMinerArenaConfig.cs (Config/)

  • ScriptableObject — настройки арены. Содержит enum DigDirection (Up/Down) и поле Direction. Подключается через IdleMinerConfig.Arenas[].

IdleMinerRewardDropConfig.cs (Config/)

  • ScriptableObject — маппинг наград на дроп-префабы. Массив Prefabs[], метод GetPrefab(IReward) матчит по типу (для ResourceReward также по Config). Editor-кнопка "Refresh Prefabs List" подтягивает из папки.

Objects

IdleMinerObject.cs (Objects/)

  • Абстрактный базовый класс для всех объектов на арене. Определяет Id (по позиции), CellPosition, OccupiedCells, Size. Виртуальные методы жизненного цикла: OnMiningStarted, OnMiningProgress, OnMiningCompleted. Рисует гизмо размера в Editor.

IdleMinerOre.cs (Objects/)

  • Руда — основной расчищаемый объект. Содержит IdleMinerObjectConfig, прогресс-бар, таймер на поле. GetMiningTime(workerLevel) — формула времени с округлением. CalculateRewards() — взвешенный выбор одной награды через ProbabilityByRange.

IdleMinerChest.cs (Objects/)

  • Сундук. Наследует IdleMinerObject, тип Chest. Анимация открытия при завершении добычи. Может содержать несколько предметов.

IdleMinerObstacle.cs (Objects/)

  • Непроходимое препятствие/декорация. Тип Obstacle. Нельзя расчистить, блокирует клетки.

IdleMinerRewardDrop.cs (Objects/)

  • Дроп на поле после расчистки. Инициализируется позицией и наградой. IsAccessible проверяет наличие reachable соседей. При сборе уведомляет Arena.OnRewardDropCollected.

IdleMinerAnimUtils.cs (Objects/)

  • Статические утилиты анимации. Корутина FadeOutAndDestroy — плавное исчезновение с уменьшением масштаба и прозрачности.

IdleMinerAlignWithTile.cs (Objects/)

  • Компонент привязки объекта к клетке сетки. Используется на префабах для корректного позиционирования.

Workers

IdleMinerWorker.cs (Workers/)

  • Логика рабочего (не MonoBehaviour). Содержит WorkerState и ссылку на конфиг. GetSpeedMultiplier() — формула скорости. GetUpgradeCost() — lookup из массива с экстраполяцией. IsBusy — есть ли активный процесс.

IdleMinerWorkerView.cs (Workers/)

  • MonoBehaviour — визуальное представление рабочего на сцене. Управляет анимациями (Idle/Up/Down/Left/Right), телепортацией, отображением уровня. Поддерживает SpriteRenderer flip и scale flip для AE-анимаций. Компенсация пивота при повороте влево.

IdleMinerWorkerAnimator.cs (Workers/)

  • Мост между игровой логикой и WorkerView. Находит WorkerView по индексу в контейнере арены. Определяет направление анимации по вектору к объекту. Телепортирует и устанавливает состояние idle/work.

Data

WorkerState.cs (Data/)

  • Сериализуемое состояние рабочего. Поля: Level, IsUnlocked, CurrentProcessId, Position. Сохраняется в IdleMinerComponent.Model.Workers[].

MiningProcess.cs (Data/)

  • Сериализуемый процесс добычи. Поля: Id (GUID), ObjectId, WorkerIndex, StartTimestamp, TotalDuration, IsCompleted. Методы расчёта прогресса, завершения, оставшегося времени.

ArenaData.cs (Data/)

  • Сериализуемые данные арены. Реализует ISerializationCallbackReceiver для HashSet<string>. Хранит глубину, расчищенные объекты, несобранные дропы, позицию камеры.

CellInfo.cs (Data/)

  • Runtime-данные одной клетки сетки. Не сериализуется — пересоздаётся при загрузке. Хранит reachable-флаг, ссылку на объект, список дропов, индекс рабочего. Свойства: HasObject, HasDrops, HasWorker, IsFree.

UI

IdleMinerUIManager.cs (UI/)

  • Менеджер UI. Обрабатывает тапы по клеткам, определяет тип действия (расчистка, ускорение, сбор дропа) и открывает соответствующий попап.

IdleMinerObjectPopup.cs (UI/)

  • Панель расчистки объекта. Три состояния: Mine (свободный рабочий), SpeedUp (рабочий занят), Upgrade (нет рабочего нужного уровня). Показывает время, уровень рабочего, кнопку действия.

IdleMinerMiningProgressPopup.cs (UI/)

  • Панель ускорения активного процесса. Показывает прогресс-бар, таймер обратного отсчёта, стоимость мгновенного завершения в монетах.

IdleMinerWorkerButton.cs (UI/)

  • Кнопка рабочего в основном интерфейсе. Для заблокированного — покупка, для разблокированного — апгрейд. Показывает стоимость и уровень.

IdleMinerWorkerUpgradePopup.cs (UI/)

  • Попап подтверждения апгрейда рабочего. Показывает текущий и следующий уровень, стоимость, бонус скорости.

IdleMinerOfflinePopup.cs (UI/)

  • Попап офлайн-прогресса. Показывает список завершённых за время отсутствия процессов и длительность офлайна.

IdleMinerArenaCompletedPopup.cs (UI/)

  • Попап завершения арены. Показывается при достижении максимальной глубины.

IdleMinerCoinsDisplay.cs (UI/)

  • Счётчик монет в интерфейсе события. Обновляется через IdleMinerComponent.OnCoinsChanged.

IdleMinerUIUtils.cs (UI/)

  • Утилиты форматирования. FormatTime — полный формат, FormatTimeSingleUnit — одна единица (часы или минуты или секунды).

IdleMinerCenterCameraButton.cs (UI/)

  • Кнопка центрирования камеры на лучшем свободном рабочем.

IdleMinerExitButton.cs (UI/)

  • Кнопка выхода из события. Возвращает на главный экран.

IdleMinerInfoButton.cs (UI/)

  • Кнопка информации. Открывает туториальный экран.

IdleMinerShopButton.cs (UI/)

  • Кнопка магазина. Открывает попап паков события.

Camera

IdleMinerCamera.cs (Camera/)

  • Управление камерой события. Ортографическая камера с ограничениями по BoundingBox арены. Методы SmoothFocusOn(transform) для плавного перемещения к рабочему при апгрейде/покупке. ScreenToWorldPoint для позиционирования.

IdleMinerCameraTarget.cs (Camera/)

  • Вспомогательный компонент для целевой позиции камеры.

IdleMinerInput.cs (Camera/)

  • Обработка пользовательского ввода. Скролл/пинч для зума, драг для перемещения, тап для взаимодействия с клетками. Передаёт тапы в IdleMinerUIManager.