Техническая спецификация
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. Флоу работы фичи
Инициализация
IdleMinerLauncher.Awake()— загружает префаб арены изResources/IdleMiner/Arenas/, вызываетIdleMiner.Create(arena, launcher)IdleMiner.Initialize()— инициализируетWorkerStates(создаёт если нет, первый рабочий разблокирован),ArenaData(создаёт первую арену если пусто), вызываетArena.Load(), создаётIdleMinerGame, вызываетRecalculateAccessibility, создаётWorkerViews(инстанцирует из префаба если нет), инициализирует камеру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 >= TotalDurationGetRemainingTime(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 = нет) |
Свойства:
HasObject—Object != nullHasDrops—Drops != null && Drops.Count > 0HasWorker—WorkerIndex >= 0IsFree—IsReachable && !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 и т.д.) делегируются в пресет. Также определяет enumIdleMinerObjectType(Obstacle, Ore, Chest).
IdleMinerArenaConfig.cs (Config/)
ScriptableObject— настройки арены. Содержит enumDigDirection(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.