Інтеграція Netcode for GameObjects для мультиплеєра (Unity)
Мобільний мультиплеєр — завжди компроміс між швидкістю розробки, затримками та ціною сервера. Netcode for GameObjects (NGO) — офіційне рішення Unity, яке ми використовуємо в комерційних проектах з моменту виходу стабільної версії. На відміну від Mirror, NGO глибоко інтегрований в Unity Gaming Services: Relay, Lobby, Matchmaker працюють з коробки. Для вашого мобільного додатку це означає швидкий старт без налаштування серверної інфраструктури — але й lock-in в екосистему Unity. NGO дає 30% економії часу на деплой та тестування порівняно з самописним рішенням для проектів на 2–8 гравців.
Як налаштувати NetworkManager і Relay для мобільних ігор?
NGO вимагає NetworkManager з налаштованим транспортом. Для мобільних рекомендований UnityTransport з RelayServerData — Unity Relay проксіює UDP-трафік через свої сервери, обходячи NAT без виділеного сервера:
async Task StartHost() { var allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers: 4); var joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId); var relayServerData = new RelayServerData(allocation, "udp"); NetworkManager.Singleton.GetComponent<UnityTransport>() .SetRelayServerData(relayServerData); NetworkManager.Singleton.StartHost(); // joinCode передаємо в Lobby для інших гравців } joinCode — рядок з 6 символів, який клієнти використовують для підключення через JoinAllocationAsync. Це замінює необхідність у відкритому IP для P2P або виділеного сервера для невеликих лобі. Без Relay ви втрачаєте 40% користувачів — вони не зможуть підключитися через NAT.
Чому NetworkVariable — основа синхронізації?
NetworkVariable<T> — типізована змінна з автоматичною синхронізацією. Сервер пише, клієнти читають. Ми використовуємо цей патерн у всіх проектах: здоров'я, очок, станів перемикання:
public class PlayerState : NetworkBehaviour { private NetworkVariable<int> _health = new NetworkVariable<int>( 100, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server ); public override void OnNetworkSpawn() { _health.OnValueChanged += OnHealthChanged; } private void OnHealthChanged(int previous, int current) { healthUI.SetValue(current); } [ServerRpc] public void TakeDamageServerRpc(int damage, ServerRpcParams rpcParams = default) { _health.Value = Mathf.Max(0, _health.Value - damage); } } NetworkVariableWritePermission.Server — лише сервер пише. NetworkVariableWritePermission.Owner — лише власник об'єкта. Клієнт-сайд передбачення: Owner пише локально, але сервер авторитарний і може відкотити. В одному з наших проектів це скоротило мережеве споживання на 50% за рахунок зменшення частоти RPC.
NetworkBehaviour і ownership
NGO строго розрізняє: IsServer, IsClient, IsHost, IsOwner. IsOwner = true для об'єкта, яким керує даний клієнт. Типова помилка — не перевіряти IsOwner в Update, тоді всі клієнти обробляють введення для всіх гравців. Передача ownership: networkObject.ChangeOwnership(clientId) — корисно для підбираних об'єктів (підняв — став власником).
Що входить в роботу?
Ми надаємо:
- Вихідний код інтеграції NGO з Relay, Lobby, NetworkVariable.
- Налаштування iOS/Android для фонових сесій.
- Оптимізацію трафіку (batching, тіки, стиснення).
- Документацію по API та процесу дооновлення.
- Навчання команди (2 години онлайн).
- Підтримку деплою в App Store та Google Play.
Порівняння NGO та Mirror для мобільних проектів
| Критерій | Netcode for GameObjects | Mirror |
|---|---|---|
| Інтеграція з Relay | Вбудована з коробки | Потребує ручного налаштування |
| Підтримка мобільного фону | Так, через OnApplicationPause | Ні, необхідні доопрацювання |
| Середній ping (4 гравці) | 50–80 мс через Relay | 60–100 мс через виділений сервер |
| Час розробки MVP | 1–2 тижні | 3–4 тижні |
Boss Room як референс
Unity опублікував Boss Room — sample-проект на NGO з повноцінним кооперативом для мобільного. Там реалізовані: action-animation синхронізація, anticipation (клієнт грає анімацію до підтвердження сервера), client-authoritative рух з серверною корекцією. Це найкраще джерело патернів для NGO — скачайте з GitHub до написання свого коду.
Типові проблеми мобільного мультиплеєра та рішення з NGO
| Проблема | Рішення з NGO |
|---|---|
| Затримка на мобільних | Знизити частоту тіків до 15 Гц |
| Втрата з'єднання при фоні | Обробити OnApplicationPause + reconnect |
| Ownership декількох гравців | Використовувати ChangeOwnership з колайдерами |
Lobby і Matchmaking
var options = new CreateLobbyOptions { IsPrivate = false, Data = new Dictionary<string, DataObject> { { "GameMode", new DataObject(DataObject.VisibilityOptions.Public, "deathmatch") }, { "Map", new DataObject(DataObject.VisibilityOptions.Public, "forest") } } }; var lobby = await LobbyService.Instance.CreateLobbyAsync("My Lobby", 4, options); Lobby SDK зберігає метадані, фільтрація через QueryFilter. Heartbeat через LobbyService.Instance.SendHeartbeatPingAsync — без нього лобі видаляється через 30 секунд.
Мобільні нюанси
Background. NetworkManager.Singleton.Shutdown() при OnApplicationPause(true) на iOS — інакше Relay-з'єднання зависає і не відновлюється при поверненні. При OnApplicationPause(false) — StartClient() заново зі збереженим joinCode.
Batching. NGO за замовчуванням батчить повідомлення. NetworkConfig.NetworkTickSystem визначає частоту тіків (30-60 Hz). Для покрокових ігор тік можна знизити до 10 Hz — менше батчів, менше трафіку. В одному із замовлень ми зменшили тік до 15 Гц, заощадивши 35% трафіку на сесію.
Версіонування. NetworkConfig.NetworkTickSystem + NetworkConfig.ProtocolVersion — при оновленні додатку старі клієнти не підключаються до нових серверів. На мобільному потрібна перевірка версії клієнта до початку сесії.
Чому ми обираємо NGO замість Mirror?
NGO дає 30% економії часу на деплой, вбудований Relay та Lobby, і офіційну підтримку Unity. В комерційних проектах це знижує ризики та прискорює вихід.
Досвід та строки
Ми — команда мобільних розробників з багаторічним стажем. За цей час реалізували 30+ мультиплеєрних проектів на Unity: від гіперказуальних дуелей до змагальних стратегій. Інтеграція NGO — наша щоденна практика.
Базова інтеграція NGO з Relay, Lobby та NetworkVariable для 2–4 гравців: 1–2 тижні. Повноцінна система з client prediction, matchmaking та мобільною оптимізацією: 1,5–2,5 місяці. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки вашого проекту. Отримайте консультацію по вашому проекту.
Замовте мультиплеєр з Netcode for GameObjects — отримайте надійне рішення під ключ з гарантією сумісності з App Store та Google Play.







