Разработка внутриигровой прогрессии
Прогрессия — это ощущение роста. Игрок должен чувствовать, что стал сильнее, умнее, ближе к цели. Если это ощущение пропадает — сессия заканчивается. Технически прогрессия — это набор взаимосвязанных систем: опыт, уровни, навыки, разблокировки, достижения, метапрогрессия. Каждая из них требует собственной архитектуры.
Как сломать прогрессию технически
Кривая опыта без математического обоснования
Формула requiredXP = baseXP * level^exponent на первый взгляд работает. Но без моделирования реальных сессий получаем либо «стену» — уровень, где игрок застревает на несколько часов — либо «провал» — отрезок, который пролетается за 10 минут и теряет ценность.
Правильный подход: сначала определяем target session count per level (сколько игровых сессий нормально тратить на переход между уровнями), затем подбираем формулу под этот target. Моделируем в таблице, не угадываем в коде.
Состояние прогрессии в неправильном месте
Хранить прогресс в PlayerPrefs — это не архитектура, это временное решение, которое становится постоянным. PlayerPrefs не поддерживает версионирование схемы: при изменении структуры данных старые сохранения ломаются. Когда у игры 50 000 пользователей, это катастрофа.
Правильная схема: ProgressionData как C# класс с явной версией схемы, сериализация в JSON, хранение через PlayFab Player Data или собственный API. При загрузке — проверка версии и миграция данных через MigrationManager с цепочкой миграций v1→v2→v3.
Race conditions в мультиплеере
При одновременных запросах на начисление опыта (завершение матча + daily bonus + achievement unlock в один момент) без атомарности получаем неконсистентный стейт. PlayFab CloudScript выполняет операции последовательно для одного игрока — это встроенная защита. На собственном бэкенде — транзакции в PostgreSQL с SELECT ... FOR UPDATE.
Архитектура системы прогрессии
Разделение данных и логики
ProgressionConfig ScriptableObject содержит неизменяемые данные: формулы расчёта XP, таблицы наград за уровни, дерево навыков. Это настраивается геймдизайнером без изменения кода.
ProgressionState — текущий стейт игрока: текущий уровень, накопленный XP, разблокированные навыки, выполненные достижения. Только сериализуемые данные, никаких ссылок на Unity-объекты.
ProgressionManager — сервис-посредник: принимает события из геймплея (убил врага, выполнил квест, нашёл предмет), вычисляет изменения стейта, генерирует события для UI (level up!, навык разблокирован).
Такое разделение позволяет тестировать логику прогрессии unit-тестами без запуска Unity.
Skill tree и дерево навыков
Дерево навыков — это граф с направленными рёбрами. Узел — навык (SkillNode), ребро — зависимость (prerequisites). Реализуем как Dictionary<string, SkillNode> с явными списками зависимостей.
Passive навыки (бонусы к урону, скорости) удобно реализовать через систему Stat Modifiers: каждый навык добавляет StatModifier с типом (flat, percent additive, percent multiplicative) к нужному стату. Финальное значение вычисляется при запросе через CalculateFinalValue(), а не хранится. Это автоматически обрабатывает добавление и снятие модификаторов.
Active навыки (способности) — через Command Pattern: каждый навык — это объект с методами Execute(), CanExecute(), GetCooldownProgress(). Cooldown управляется централизованно через AbilitySystem, который обновляется в Update().
Метапрогрессия (roguelike-паттерн)
Постоянный прогресс между ранами — отдельный слой данных. Разблокировки между ранами (стартовые бонусы, новые персонажи, игровые режимы) хранятся отдельно от прогресса внутри раны, который сбрасывается при смерти.
Реализация: две структуры данных — MetaProgressionState (постоянный, CloudSave) и RunState (временный, LocalSave/InMemory). RunState инициализируется из MetaProgressionState при старте раны + применяются ран-специфичные модификаторы от выбранных перков.
Аналитика прогрессии
Без данных нельзя балансировать прогрессию. Обязательные метрики:
- Level Distribution — сколько игроков на каждом уровне в момент времени. Если 60% застряли на уровне 15 — там стена.
- Time per level — среднее время между level-up. Должно расти плавно, без скачков.
- Skill usage rate — какие навыки выбирают игроки. Если один навык берут 80% игроков — дерево несбалансировано.
- Churn by level — отток игроков в разрезе уровней. Резкий рост оттока на конкретном уровне = проблема именно там.
Собираем через Firebase Analytics с custom events: level_up, skill_unlocked, achievement_completed. Параметры события — минимальный набор данных для сегментации: player_level, session_count, monetization_segment.
Процесс работы
Проектирование экономики прогрессии (3-7 дней). Таблица целевых сессий, формулы XP, структура наград. Обязательно согласуется с монетизационной моделью.
Архитектура и бэкенд (1-2 недели). Схема данных, API endpoints или PlayFab настройка, миграционная стратегия.
Реализация клиента (1-3 недели). ProgressionManager, UI (XP-бар, level-up анимация, skill tree экран), интеграция с геймплейными системами.
Балансировка (ongoing). Первая итерация после плейтестов — почти гарантированно потребует корректировки формул. Закладываем в план.
| Тип системы | Примерные сроки |
|---|---|
| Простые уровни + XP | 3-7 дней |
| XP + дерево навыков | 2-4 недели |
| Полная мета-прогрессия (roguelike) | 3-6 недель |
| LiveOps прогрессия + сезоны | 1-2 месяца |
Стоимость рассчитывается индивидуально после анализа игровой механики и целевых платформ.





