Мобільна гра на Unity часто гальмує при додаванні мультиплеєра. Мережева синхронізація на телефоні — окремий виклик: випадковий перехід у фон обриває з'єднання, а затримки в 200 мс вбивають геймплей. Ми вирішуємо це завдання за допомогою відкритого мережевого коду Mirror Networking — фреймворку, який дає повний контроль над Unity мережею та інфраструктурою. На відміну від Photon, Mirror не прив'язаний до хмари: підключайте kcp2k, Telepathy або WebSockets, піднімайте сервер на власних потужностях. Для мобільних проєктів це означає latency 10–50 мс замість 100+, економію на хостингу до 70% та оптимізацію трафіку, що скорочує витрати на передачу даних до 50%. Mirror обходиться в 2-3 рази дешевше Photon при 1000+ одночасних гравців. Наш досвід — 10+ років розробки мобільних мультиплеєрних ігор на Unity, понад 40 успішних релізів. Гарантуємо стабільну синхронізацію навіть при 50+ одночасних гравцях.
Як Mirror вирішує проблему втрати з'єднання на мобільних пристроях?
Мобільні мережі нестабільні. При переході у фон iOS закриває сокет через 10 секунд, Android — по-різному. Mirror сам не відновлює з'єднання, тому ми реалізуємо кастомний reconnect:
public class MobileNetworkManager : NetworkManager { private bool wasPaused; void OnApplicationPause(bool pauseStatus) { if (pauseStatus) { wasPaused = true; } else if (wasPaused) { wasPaused = false; if (!NetworkClient.isConnected) { StartCoroutine(TryReconnect()); } } } IEnumerator TryReconnect() { int attempts = 0; while (attempts < 5 && !NetworkClient.isConnected) { NetworkClient.Reconnect(); yield return new WaitForSeconds(2f * attempts); attempts++; } } } Згідно з документацією Mirror Networking, метод NetworkClient.Reconnect() використовується для відновлення з'єднання.
Код вище — база. Додатково налаштовуємо push-сповіщення (APNs/FCM) для повернення гравця в активну сесію та використовуємо NetworkManager.singleton для глобального доступу. Важно: не створюйте кілька NetworkManager у сцені — Mirror видасть попередження, але поведінка стане непередбачуваною.
Синхронізація стану: SyncVar, SyncList та виклики
[SyncVar] автоматично передає зміни з сервера на всіх клієнтів. Використовуйте hook для оновлення UI:
public class PlayerHealth : NetworkBehaviour { [SyncVar(hook = nameof(OnHealthChanged))] public int health = 100; void OnHealthChanged(int oldVal, int newVal) { healthBar.fillAmount = newVal / 100f; } [Command] public void CmdTakeDamage(int amount) { // Виконується тільки на сервері health = Mathf.Max(0, health - amount); } } Для колекцій (інвентар, черга бафів) використовуйте SyncList<T> з callback OnChange. Трійка [Command] (клієнт→сервер), [ClientRpc] (сервер→всі клієнти), [TargetRpc] (сервер→один клієнт) — основа будь-якого мультиплеєра. Опануйте їх до початку інтеграції.
Чому вибір транспорту критичний для мобільного мультиплеєра?
| Транспорт | Протокол | Мобільний |
|---|---|---|
| kcp2k | UDP-based | Рекомендується, низька latency (10-50 мс) |
| Telepathy | TCP | Надійний, вища затримка (100+ мс) |
| WebSockets (Mirror) | TCP/WS | Для WebGL, не оптимальний для native |
| Ignorance | UDP (ENet) | Хороша альтернатива kcp2k |
Для мобільного нативного додатку обирайте kcp2k або Ignorance. kcp2k вбудований у Mirror з версії 50+, налаштування: NoDelay = true, Interval = 10ms, FastResend = 2. TCP (Telepathy) використовуйте для покрокових ігор, де надійність важливіша за затримку. На мобільних пристроях kcp2k забезпечує в 5-10 разів меншу затримку порівняно з TCP.
Порівняння моделей авторитетності:
| Характеристика | Авторитетна (Authoritative) | P2P (Peer-to-Peer) |
|---|---|---|
| Контроль стану | Сервер — єдине джерело правди | Кожен клієнт має локальний стан |
| Anti-cheat | Високий — всі рішення перевіряються сервером | Низький — клієнти можуть маніпулювати даними |
| Витрати на сервер | Потрібен постійний сервер (headless) | Сервер не потрібен, але потрібен NAT traversal |
| Затримка | Вища через round-trip | Нижча, але залежить від пірів |
Headless-сервер та інфраструктура
Mirror-сервер — це той самий Unity білд з прапорцем -batchmode -nographics. Для action-ігор — один headless-сервер на кімнату, для стратегій з малою кількістю гравців — кілька кімнат на інстанс. Оркестрацію довірте Unity Game Server Hosting (Multiplay) або Kubernetes з автоскейлінгом. Невеликі проєкти стартують на VPS (DigitalOcean/Hetzner) з systemd-скриптами. Для UDP-транспорту (kcp2k) переконайтеся, що load balancer підтримує UDP passthrough.
Процес роботи над інтеграцією
- Аналітика — аудит геймдизайну, вибір моделі (authoritative / P2P), прототип latency.
- Проєктування — архітектура мережі, схема синхронізації, сценарії reconnect та anti-cheat.
- Реалізація — налаштування NetworkManager, транспорт, SyncVar, команди, спавн об'єктів.
- Тестування — навантажувальні тести (50+ клієнтів), емуляція втрати пакетів, перехід у фон.
- Деплой — налаштування headless-сервера, CI/CD для оновлень, моніторинг.
Що входить у роботу
- Архітектура мережі (вибір моделі, транспорту, балансування).
- Налаштування Mirror: NetworkManager, префаби, спавн, команди.
- Реалізація reconnect та обробки фону.
- Збірка та деплой headless-сервера з systemd/Docker.
- Load-тестування під 50+ одночасних з'єднань.
- Документація API та інструкція з розгортання.
- Підтримка після релізу (1 місяць).
Типові помилки при інтеграції Mirror у мобільну гру
NetworkIdentity не знайдено. Префаб не зареєстрований у NetworkManager.spawnPrefabs. Спавн через NetworkServer.Spawn впаде в runtime.
Authority confusion. isServer, isClient, isLocalPlayer, hasAuthority — чотири різні булеві. Код в Update() без перевірки isLocalPlayer виконується на всіх клієнтах.
Disconnect на мобільному. При переході у фон iOS закриває сокет через ~10 секунд. Mirror не відновлює з'єднання автоматично — потрібна кастомна логіка.
Строки
Базова Mirror-інтеграція з синхронізацією позицій, health та командами: 1–2 тижні. Повноцінна система з headless-сервером, матчмейкінгом, reconnect та мобільною оптимізацією: 1–2 місяці. Вартість розраховується індивідуально. Зв'яжіться з нами для аналізу вашого проєкту — оцінимо безкоштовно. Отримайте консультацію з архітектури мережі та строків. Замовте інтеграцію Mirror для вашої гри — ми проведемо аудит і запропонуємо рішення за 1 день.







