Інтеграція Photon для мультиплеєра мобільної гри
Уявіть: ваша мобільна гра на Unity, ви інтегрували Photon, але при зміні Wi-Fi на 4G з'єднання рветься, і гравці вилітають з кімнати. Знайома проблема? Ми вирішуємо її на рівні коду: налаштовуємо playerTtl, реконект та ручну синхронізацію, щоб трафік не летів дарма. Багато розробників припускаються однієї й тієї ж помилки: покладаються на стандартні компоненти PhotonTransformView, що призводить до надлишкового трафіку та проблем з реконектом. Ми ж пропонуємо перевірений підхід, який скорочує трафік у 3–5 разів і забезпечує стабільне з'єднання на мобільних пристроях. За понад 10 років роботи з Photon ми виконали 40+ проєктів для мобільних ігор — від простих лобі до складних квестів з матчмейкінгом. Якщо ви хочете уникнути типових проблем і заощадити на трафіку, звертайтеся до нас для інтеграції Photon у вашу гру.
Як правильно синхронізувати об'єкти в Photon?
PhotonView — основний компонент синхронізації. Кожен мережевий об'єкт отримує ViewID. Синхронізацію позиції та ротації через PhotonTransformView використовують за замовчуванням — це працює, але розсилає оновлення на кожен FixedUpdate, навіть якщо об'єкт не рухався.
Правильний підхід: реалізувати IPunObservable.OnPhotonSerializeView з ручним контролем відправки даних:
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.IsWriting) { // Відправляємо тільки якщо змінилося значуще if (Vector3.Distance(_lastSentPosition, transform.position) > 0.01f) { stream.SendNext(transform.position); stream.SendNext(transform.rotation); _lastSentPosition = transform.position; } } else { _networkPosition = (Vector3)stream.ReceiveNext(); _networkRotation = (Quaternion)stream.ReceiveNext(); } } На клієнті прийняте _networkPosition не застосовується напряму — інтерполюємо через Vector3.MoveTowards або Lerp за часом пакета з PhotonMessageInfo.SentServerTime. Як стверджує документація Photon, такий підхід мінімізує мережевий трафік без втрати плавності.
Порівняння методів синхронізації:
| Метод | Трафік (пакетів/с) | Затримка | Простота |
|---|---|---|---|
| PhotonTransformView | 20 пакетів (за замовчуванням) | Низька | Висока |
| IPunObservable (ручний) | Від 1–2 пакетів (тільки при зміні) | Середня | Середня |
Ручна синхронізація зменшує трафік у 3–5 разів. Для мобільних ігор це критично, оскільки Photon тарифікується за CCU. На практиці, у проєкті мобільної гонки з 6 гравцями, налаштування IPunObservable та зниження SerializationRate дозволило зменшити використання трафіку на 70%.
Як працює RPC і коли його використовувати?
photonView.RPC — для подій, які мають гарантовано дійти: урон, смерть, підбір предмета. RpcTarget.All розсилає всім у кімнаті, включаючи відправника. RpcTarget.Others — всім крім.
Типова помилка: використовувати RPC для позиційних оновлень. RPC надійний (TCP-like поведінка), але додає overhead на підтвердження. Для позицій — PhotonNetwork.SendRate + OnPhotonSerializeView, для важливих подій — RPC.
PhotonNetwork.SendRate за замовчуванням 20, SerializationRate — 10. Для мобільного баланс трафіку vs плавність: 15/10.
Підключення та кімнати
PhotonNetwork.ConnectUsingSettings(); // використовує PhotonServerSettings asset void OnConnectedToMaster() { PhotonNetwork.JoinRandomOrCreateRoom( expectedCustomRoomProperties: null, expectedMaxPlayers: 4, matchingType: MatchmakingMode.FillRoom, typedLobby: null, sqlLobbyFilter: null, createIfNotFound: true ); } RoomOptions.CustomRoomPropertiesForLobby — масив ключів, видимих у лобі для фільтрації. Передавати все в lobby-властивості не потрібно: тільки те, за чим фільтрують (регіон, режим гри, карта).
Чому гравці відключаються при зміні мережі?
Зміна мережі. Photon SDK підтримує PhotonNetwork.ReconnectAndRejoin() — але тільки якщо кімната з playerTtl > 0. За замовчуванням playerTtl = 0, гравець вважається таким, що вийшов миттєво. Для мобільного: playerTtl = 10000 (10 секунд на reconnect).
iOS Background. При переході у фон iOS агресивно глушить мережеві з'єднання. Photon розірветься через 5-10 секунд. Для ігор, де це критично — UIBackgroundModes: voip (з обережністю, Apple може відхилити) або graceful disconnect.
Трафік. Photon Realtime тарифікується за CCU (одночасні користувачі). 20 CCU безкоштовно. При інтеграції варто додати Photon Dashboard у моніторинг — видно кількість повідомлень, байти, піки. Ми включаємо в роботу налаштування Photon Dashboard та оптимізацію коду для зниження трафіку на 30–50%.
Типові помилки при інтеграції Photon на мобільних пристроях
- Відсутність playerTtl — гравці миттєво покидають кімнату при тимчасовому розриві.
- Використання PhotonTransformView для всіх об'єктів — невиправдано високий трафік.
- Часті RPC-виклики для позицій — збільшують затримку та навантаження.
- Ігнорування налаштувань SendRate та SerializationRate — можна знизити без втрати якості.
Ці помилки легко виправити на етапі розробки. Замовте аудит вашого проекту, щоб виявити їх до релізу.
Що входить в нашу роботу з інтеграції Photon?
- Аудит поточної реалізації (якщо є)
- Налаштування Photon SDK та конфігурації (регіони, кімнати, TTL)
- Реалізація синхронізації через IPunObservable (ручне управління трафіком)
- Інтеграція матчмейкінгу з кастомними властивостями
- Налаштування RPC та надійних подій
- Оптимізація для мобільних пристроїв (реконект, трафік, background)
- Тестування на 10+ реальних пристроях у різних мережах
- Надання документації та підтримка після впровадження
Строки та вартість
Базова інтеграція Photon Realtime з кімнатами, синхронізацією позицій та RPC: від 3 до 7 днів. Повноцінна система з матчмейкінгом, custom properties та мобільною оптимізацією: від 2 до 3 тижнів. Вартість розраховується індивідуально — оцінимо ваш проект за 1 день.
Готові обговорити деталі? Зв'яжіться з нами, щоб отримати консультацію та точну оцінку. Звертайтеся до нас для надійної інтеграції Photon у вашу мобільну гру.







