- Интегрирована система кастомных визуальных эффектов (VFX):
- Добавлена новая утилита MvpVFXUtility и настройки MvpVFXSpawnSettings для спавна эффектов.
- Реализован пул эффектов VFXPool с поддержкой отслеживания версий спавна, сброса оверрайдов и анимации масштаба по времени.
- Добавлены эффекты прыжка и приземления в PlayerAnimationEvents.
- Интегрирован эффект DeathVignetteController для плавного затемнения экрана при смерти игрока.
- Добавлены частицы stompImpactVFX при уничтожении врагов прыжком сверху (EnemyController).
- Реализован эффект конфетти finishVFX при успешном завершении уровня (LevelFinish).
- Интегрированы эффекты искр при сборе монеток, кристаллов и других собираемых предметов (Collectible, EnvironmentalCollectibleBase).
- Улучшен и визуально доработан пользовательский интерфейс (UI):
- Добавлен скрипт QRCodeTierHighlight для цветовой подсветки QR-кодов в зависимости от тира приза.
- Реализована пульсация блока приза в баннере победы (WinBannerController).
- Обновлено обозначение валюты в BalanceDisplay с "₽" на "руб.".
- Добавлены новые префабы, сцены, ассеты тайлсетов и шейдеров для настройки визуального стиля.
- Обновлён протокол и инициализация подсветки COM-платы:
- Изменен префикс команд подсветки с 85/86 на 8550, а диапазон эффектов обновлен с 40...52 на 10...22 (LightController, LightMode, LightCycleDurations).
- Исправлена хардкод-команда сброса подсветки при инициализации в ComDeviceClient с устаревшей 8600 на новую 8550 для предотвращения рассинхронизации буфера обмена платы.
- доработан flow призовой витрины и связанного UI:
добавлены `PrizeStandButtonView` и `RulesPrizeListPage`, обновлены
`PrizeStandController`, `PrizeStandPrize`, `PrizeStandModal`,
`PrizeStandSettingsModal`, `LevelPrizeSettingsModal`, `QRCodeSettingsModal`,
`BalanceDisplay`, `ButtonTextFocusColor` и связанные prefab'ы,
чтобы улучшить настройку, навигацию, отображение кнопок и prize flow
- расширена система настроек и сохранения значений:
`OptionPicker` получил отдельный формат `ValueSelector`,
обновлены `SettingsDatabase`, `SettingEntryDrawer`, `SettingUIItem`,
`SettingsUIGenerator`, `ValueSelectorRow` и `MainSettingsDatabase.asset`,
а сохранение option picker-значений, включая `gameplay.gameDifficulty`,
исправлено и синхронизировано с остальными настройками
- добавлены универсальные спавнеры сущностей:
реализованы `EntitySpawner` и `EntitySpawnerManager` с поддержкой
весов префабов, точек спавна, заполнения по проценту, ограничений
на количество и автоспавна при инициализации
- доработана логика игрового спавна и сложности:
процент инициализационного спавна может зависеть от настройки
`gameplay.gameDifficulty` с градациями 25/50/75/100,
в одном цикле массового спавна повторно не используется та же точка,
а gizmo спавнера теперь показывает только сами точки без линий
- упрощена работа в редакторе Unity и добавлены editor-инструменты:
в `GameManager` лицензия пропускается при запуске в `UNITY_EDITOR`,
а `HierarchySelectionCounter`, `HierarchySelectionCountOverlay`
и `HierarchyBulkRenamerWindow` добавляют подсчет выделения,
realtime overlay в `SceneView` и массовое переименование объектов
по правилам нумерации из Unity Project Settings
- синхронизированы сцены, ресурсы и UI-ассеты под новый flow:
обновлены `MainMenu`, `Level UI`, уровни `1-1` и `1-2`,
строки настроек, кнопки, TMP/font assets, изображения UI,
`prizes.json` и recovery-данные после правок интерфейса и логики
- очищены и переразложены часть внешних и служебных ресурсов:
удалён пакет `Lava_Flowing_Shader`, переименованы/заменены
отдельные UI-prefab'ы и добавлены сопутствующие проектные артефакты,
которые сейчас используются обновлённой конфигурацией проекта
Система выдачи призов хоппером:
- PrizeSystemManager теперь читает enableHopper из настройки prizes.giveSmallPrize
вместо захардкоженного SerializeField (реагирует на изменения в реальном времени)
- LevelFinish: исправлен ключ настройки на prizes.giveSmallPrize
- Добавлен HopperCheckController для тестирования выдачи приза кнопкой в настройках
- Проверка датчика хоппера перенесена в ComDeviceClient (2-й бит INPUT)
- PrizeGivenBuffer заменён с PlayerPrefs на потокобезопасный Interlocked-буфер
(исправлен краш при вызове PlayerPrefs из фонового потока платы)
- Добавлен PrizeSystem.OnPrizeResult (Action<bool>) — событие результата выдачи
Отображение ошибки выдачи приза:
- Добавлен PrizeErrorDisplay — UI-компонент, подписанный на OnPrizeResult
- Зависит от настройки prizes.showPrizeError (реагирует на изменения в реальном времени)
QR-коды:
- PrizeSystemManager подписан на изменение prizes.phoneNumber — QR-коды
перегенерируются автоматически при смене номера
- WinBannerController показывает QR-коды только при включённой prizes.giveBigPrize
Прочее:
- Добавлен Levitator — компонент плавной левитации объекта (высота, скорость, плавность)
- Настройки: группы поддержки/тестов реорганизованы, добавлена кнопка btn.hopper_test
- Убран пулинг из `EnvironmentalCollectibleBase` и `EnvironmentalCollectibleSpawner`:
при подборе и деспауне частицы теперь уничтожаются через `Destroy()`,
что устраняет проблему переиспользования объектов старого типа при смене частиц.
- Удалены поля `usePooling`, `_ownerPool`, `_originPrefab` из `EnvironmentalCollectibleBase`;
упрощены методы `Collect()` и `Despawn()`.
- Добавлено время жизни частиц: поле `defaultLifetime` в `EnvironmentalCollectibleBase`,
таймер `_age` с автоматическим деспауном по истечении; виртуальный `OnDespawned()` для наследников.
- В `SpawnEntry` добавлены `overrideLifetime` и `lifetimeOverride` для переопределения времени жизни.
- Добавлена структура `NamedSpawnEntry` — именованные записи с ключом (`string key`),
полным `SpawnEntry` и флагом `hardReplace`, настраиваемые в инспекторе.
- Спаунер получает игрока из `GameManager.Instance.PlayerObj` вместо `FindGameObjectWithTag`;
подписка на `GameManager.PlayerSpawned` для автообновления ссылки.
- Добавлен постепенный спаун: `MaintainFixedCount()` запускает корутину `SpawnRoutine()`
с рандомной задержкой `spawnDelay` между объектами.
- Добавлены диапазоны случайного масштаба (`scaleRange`) и угла поворота (`rotationRange`) при спауне.
- Добавлены публичные методы переключения типа частиц для `UnityEvent`:
`SetForcedPrefab`, `SetForcedPrefabHard`, `SetForcedPrefabByObject`, `SetForcedPrefabByObjectHard`,
`SetForcedPrefabByIndex`, `SetForcedPrefabHardByIndex`, `SetForcedEntry`, `SetForcedEntryByName`,
`SetEntryByName` (мягкая постепенная замена через `GradualReplaceRoutine`),
`ClearForcedPrefab`, `SetOverrideArea`.
- Исправлено сравнение prefab по ссылкам на сравнение по `name`, устраняя проблему
когда один и тот же ассет из разных массивов (`spawnEntries` / `namedEntries`) не совпадал.
- Удалён `EnvironmentalZoneTrigger.cs` (триггер-зона не нужна как отдельный скрипт).
- Удалены `EnvironmentalPool` из использования в спаунере и базовом классе.
- Префабы `Coin.prefab` и `Coin_Robotail.prefab` перемещены в `Prefabs/Props/Collectibles/`;
добавлены `LeafCollectible.prefab` и `BatCollectible.prefab`.
- Добавлен `ScoreSystem` — singleton-компонент, отслеживающий монеты, убитых врагов и экологические очки;
финальный счёт вычисляется по формуле `Score = E × (P + 45C + 90K + 10K²) − 0.5T`
с раздельными множителями для победы и проигрыша.
- Добавлен `EnvironmentalCollectibleBase` — абстрактный базовый класс для подбираемых экологических объектов:
срабатывает по триггеру, поддерживает пулинг, при подборе регистрирует очки в `ScoreSystem`.
- Добавлен `LeafCollectible` — листик с синусоидальным горизонтальным дрейфом, вращением и детекцией земли.
- Добавлен `BatCollectible` — летучая мышь с синусоидальным вертикальным движением, ограниченным горизонтальным
блужданием и случайными сменами направления; переворачивает спрайт по X при смене направления.
- Добавлен `EnvironmentalPool` — простой объектный пул по prefab-ключу с прогревом (`Warmup`) и возвратом объектов.
- Добавлен `EnvironmentalCollectibleSpawner` — взвешенный случайный спаунер, поддерживающий фиксированное количество
активных объектов; поддерживает лимиты по типу, принудительный выбор одного prefab и область спауна через
`BoxCollider2D` или ручной `Bounds`.
- В `CoinCollectible.TryPickup` добавлен вызов `ScoreSystem.Instance?.RegisterCoinCollected()`.
- В `EnemyController.Die` добавлен guard через флаг `_isDead` для предотвращения повторного срабатывания;
добавлен вызов `ScoreSystem.Instance?.RegisterEnemyKilled()`.
- В `GameManager` добавлен вызов `ScoreSystem.Instance?.ResetStats()` при старте новой игры и при потере жизни.
- Добавил новую систему настроек, возможности:
- Динамически создает список настроек
- Сохраняет настройки в JSON-файл
- Возможность группировать настройки
- Широкие возможности по кастомизации
- Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
- Теперь игрок при смерти будет падать вниз
- Изменил поведение игрока при смерти
- Изменил поведение врагов при смерти игрока
- Изменил поведение ловушек при смерти игрока
- улучшил структуру уровня 1-3
- пофиксил баг с застреванием персонажа на уровне 1-3
- пофиксил баг с прилипанием игрока к платформе сбоку
- изменил логику платформ
- добавил больше динамичности в уровень 1-3
- Increased SFX pool size from 8 to 16 in AudioManager
- Enabled preloadAudioData for multiple SFX files
- Removed unused VisualScripting import from Checkpoint script
- Reordered using statements in several scripts for consistency
- Added CoinCollectible component to Coin prefab with pickup effects
- Updated sorting layers and mesh LOD settings in Coin prefabs
- Fixed typo in Interfaces.cs: optionaAttachPoint to optionalAttachPoint
- Modified AddCoin method to accept count parameter and handle coin overflow
- Moved projectile scripts (BasicProjectile, EnemyBasicProjectile, PhysicsProjectile, PickableProjectile)
- Cleaned up unused namespaces and imports across various scripts