Задание: Unity-разработчики. Миниигра 3 в ряд для платформ Android/IOS (Дистанционная работа)
0. Срок сдачи работы: 14 календарных дней с момента утверждения Исполнителя.
1. Общие требования
Мини-игра «3 в ряд» (далее — Match-3) реализуется исключительно C#-скриптами и ресурсами Unity, без сторонних ассетов из Asset Store.
Вся логика находится на одном экране (Canvas в отдельной сцене Assets/Scenes/Match3.unity).
Реализуется классическая механика:
поле 8 × 8 (константы вынести)
свайп/клик ↔ обмен соседними фишками
проверка совпадений 3+
каскад (обвал сверху)
начисление очков
ограничение ходов или таймер (экспортировать обе логики через ScriptableObject).
Без сетевого кода; всё офлайн.
Мини-игра должна быть плагином:
помещается в подпапку Assets/MiniGames/Match3;
не затрагивает существующие сцены/скрипты;
помещена в namespace MiniGames.Match3;
экспортируется prefab-ом Match3Controller.prefab (достаточно перетащить на сцену хоста).
Код читаемый, XML-комментарии, правило + #pragma warning disable 0649 запрещено.
Zero-GC в Update: никакого new в горячем цикле. Использовать пул объектов.
Все публичные константы → [SerializeField] private.
Анимация — через DOTween (добавь UPM ссылкой, но не лезь в чужие manifest.json).
Unit-тесты (NUnit 3) на генерацию поля, поиск матчей, каскад.
2. Структура проекта
Путь Файл/папка Сущность
Assets/ корень проекта
└─MiniGames/Match3/ всё, что ты создаёшь
├─Scripts/ C#-код
│ ├─BoardManager.cs управление полем
│ ├─Gem.cs MonoBehaviour фишки
│ ├─InputController.cs ввод
│ ├─MatchFinder.cs алгоритм поиска
│ ├─BoardSpawner.cs генерация/респаун
│ ├─ScoreManager.cs очки/UI
│ └─Match3Installer.cs DI-контейнер (Zenject)
├─Prefabs/
│ └─Gem.prefab модель фишки
├─Materials/ материалы фишек
├─Scenes/
│ └─Match3.unity отдельная сцена
├─Tests/ unit-тесты
└─README.md краткое руководство
Важно: никаких ресурсов/файлов вне указанного дерева.
3. Требования к коду и арту
Фишка: вектор или PNG 512², шесть цветов. Sprite-анимация «подсветка».
UI: минимальный — счёт, «Rest Moves»/«Timer», кнопка Exit вызывает OnExit() (выходит к хост-сцене).
Сборка: Android + iOS (IL2CPP), WebGL (отдельный билд-таргет).
Документация: сгенерировать Docs/ через DocFX либо Rider-doc-тул.
Unit-тесты: запускаются командой TestRunner.RunAll() без GUI.
4. Acceptance criteria
Билд сцены Match3.unity на пустом проекте ≤ 60 МБ Android-apk.
FPS ≥ 60 на Android MediaTek G90 / iPhone 8.
Нет GC-alloc в Profiler (крестики в PlayerLoop < 0.5 KB).
Излишние зависимости отсутствуют; package-lock чист.
Полное покрытие unit-тестами логики ≥ 80 %.
Интеграция в основной проект Заказчика выполняется за ≤ 30 минут (просто копипапка и префаб).
5. Игра должна быть размещена на GitHub в приватном репозитории с доступом по классическому токену. Если потребуется доработка, нужно будет делать соответствующие коммиты.