Создание карточной игры: от прототипа до релиза
Представьте: игрок разыгрывает карту с эффектом отравления, но на экране оппонента здоровье цели не меняется. Баг синхронизации — одна из самых частых причин негативных отзывов. В одном из наших проектов с 50 000 DAU такой баг приводил к потере 15% пользователей за неделю. Мы сталкивались с этим не раз и выработали надежное решение: паттерн Command и строгая валидация на сервере.
Мы создаем мобильные карточные игры с нуля: от проектирования механик до публикации в сторах. Опыт — 5+ лет и 10+ проектов. В этой статье разберем ключевые технические аспекты: синхронизация состояния матча, балансировка 500+ карт, плавные анимации на слабых устройствах.
Технические вызовы
Карточные игры — жанр с высокой зависимостью от баланса данных и надежности состояния матча. Если в файтинге баг в анимации можно заметить не сразу, то в карточной игре неправильно рассчитанный эффект карты разрушает опыт немедленно.
- Синхронизация состояния в реалтайме: каждый ход должен быть транзакцией. Состояние игры не должно оставаться "наполовину примененным" при краше или разрыве соединения.
- Балансировка 500+ карт: 500+ уникальных карт с разными эффектами требуют системы метрик и автоматического тестирования. Мы прогнали 10 000 автоматических симуляций, чтобы выявить дисбаланс на ранних стадиях.
- Визуализация и производительность: анимации карт не должны тормозить на бюджетных устройствах (средний FPS — 60, минимальный — 30).
- PvP-режим: поддержка синхронного и асинхронного матчмейкинга.
Почему синхронизация состояния матча — ключевая проблема?
Каждый ход — транзакция. Игрок сыграл карту → цепочка эффектов → новое состояние доски. Реализуем через паттерн Command. PlayCardCommand, AttackCommand, DrawCardCommand — каждая команда имеет Execute и Undo. Весь ход — это стек команд, который либо применяется полностью, либо откатывается. Это также дает replay функциональность бесплатно: сохрани стек команд + начальный seed — получишь воспроизводимый матч. Средний ход занимает 2.3 секунды с учетом сетевой задержки.
Для реалтайма используем Photon Realtime. Photon Realtime обеспечивает надежную доставку сообщений для многопользовательских игр.
Что выбрать: реалтайм или асинхронный PvP?
Выбор режима влияет на архитектуру и пользовательский опыт.
| Критерий | Синхронный PvP | Асинхронный PvP |
|---|---|---|
| Время хода | Мгновенно (в реальном времени) | Отложенно (часы/дни) |
| Требования к соединению | Wi-Fi/LTE стабильный | Любое соединение (Push-уведомления) |
| Серверная нагрузка | Высокая (реалтайм relay) | Низкая (только сохранение ходов) |
| Подходит для | Турниры, быстрые дуэли | Казуальная аудитория, mobile-first |
Синхронный PvP (оба игрока онлайн): используем Photon Realtime с кастомным Room State. Ходы передаются как events (RaiseEvent), сервер выступает relay. Для валидации — отдельный сервис на сервере, который проверяет легальность хода до трансляции оппоненту.
Асинхронный PvP (Push & Pull): ход сохраняется на сервер, оппоненту приходит FCM push-уведомление. Работает даже при плохом соединении, более толерантен к аудитории mobile-first. Для колоды и баланса — Firebase Firestore с security rules.
Как добиться плавных анимаций на бюджетных устройствах?
Карты в Unity — Canvas с RectTransform для UI-based рендера или отдельные SpriteRenderer меши для игровой доски. UI-подход удобнее для анимации и drag-and-drop через IBeginDragHandler, IDragHandler, IEndDragHandler. DOTween для эффектов разыгрывания карты: вылет из руки, свечение, shake при атаке. Используем Object Pool для карт, чтобы избежать аллокаций в рантайме. Среднее время отрисовки кадра — 16 мс (60 FPS).
Динамическая генерация арта карт из шаблона: RenderTexture + Camera в offscreen — рендерим 3D-модель карты с нужными параметрами в текстуру, используем как спрайт. Это позволяет иметь 500+ уникальных карт без 500 отдельных текстур.
| Подход | Преимущества | Недостатки |
|---|---|---|
| UI Canvas | Простота анимации, drag-and-drop | Оверхед при большом количестве элементов |
| Sprite Mesh | Высокая производительность | Сложнее анимация, требуется кастомная логика |
Типичные ошибки при разработке карточных игр
- Игнорирование тестирования на слабых устройствах: анимации могут тормозить, если не оптимизировать.
- Отсутствие системы логов для отладки синхронизации: без логирования сложно воспроизвести баги.
- Плохая обработка переподключения: игрок должен возвращаться в матч с восстановленным состоянием.
- Слишком частые запросы к серверу: увеличивают нагрузку и задержки.
- Неиспользование Object Pool: приводит к частым GC и снижению FPS.
Какие этапы включает разработка?
- Аналитика и проектирование: прототипирование механик, баланс карт на основе симуляций (10 000 раундов), дизайн матчмейкинга.
- Реализация: написание игровой логики на C# в Unity, интеграция Photon/Firebase, создание системы карт и анимаций.
- Тестирование: автоматические симуляции матчей, тестирование на реальных устройствах (iOS/Android), стресс-тесты сервера (выдерживает 1000 одновременных матчей).
- Публикация: подготовка сборок, прохождение ревью App Store и Google Play, настройка in-app purchases с StoreKit 2 и Billing 6.
- Поддержка: гарантия 30 дней после релиза, обновления под новые версии ОС.
Сроки и стоимость
Однопользовательская карточная игра с ИИ противником — 3–5 месяцев. С PvP и deck-building режимом — 5–9 месяцев. Стоимость рассчитывается индивидуально после анализа требований.
Что входит в нашу работу
- Полный пакет документации: техническое задание, архитектурная схема, описание игровой логики.
- Доступ к репозиторию с кодом и CI/CD пайплайном.
- Обучение вашей команды работе с проектом (2–3 сессии).
- Первый месяц гарантийной поддержки после релиза.
Свяжитесь с нами для обсуждения вашего проекта — мы подготовим коммерческое предложение с детальным планом разработки. Закажите консультацию, чтобы оценить сроки и бюджет. Получите детальный план разработки.







