Інтеграція Netcode for GameObjects для мультиплеєра (Unity)
Netcode for GameObjects (NGO)—офіційне рішення Unity для мультиплеєра, спадкоємець UNET. На відміну від Mirror, NGO глибоко інтегрований у Unity Gaming Services: працює з Relay, Lobby, Matchmaker з коробки. Для мобільних проектів це означає швидкий старт без налаштування серверної інфраструктури—але lock-in у екосистему Unity.
NetworkManager та Bootstrap
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 або виділеному сервері для малих лоббі.
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—тільки власник. Client-side prediction: Owner пише локально, але сервер авторитарен та може відкатити.
NetworkBehaviour та власність
NGO строго розрізняє: IsServer, IsClient, IsHost, IsOwner. IsOwner = true для об'єкта, яким управляє цей клієнт. Типова помилка—не перевіряти IsOwner в Update, тоді всі клієнти обробляють вхід для всіх гравців.
Передача власності: networkObject.ChangeOwnership(clientId)—корисно для підбірних об'єктів (підняли—стали власником).
Boss Room як референс
Unity опублікував Boss Room—sample-проект на NGO з повнофункціональним кооперативом для мобільного. Реалізовані: action-animation синхронізація, anticipation (клієнт програє анімацію до підтвердження сервера), client-authoritative рух з серверною коррекцією. Це найкращий джерело паттернів для NGO—читайте перед написанням кода.
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 секунд.
Мобільні нюанси
Фон. NetworkManager.Singleton.Shutdown() при OnApplicationPause(true) на iOS—іншомк Relay-з'єднання зависне та не відновиться при повернені. При OnApplicationPause(false)—StartClient() заново з збереженим joinCode.
Батчинг. NGO за замовчуванням батчить повідомлення. NetworkConfig.NetworkTickSystem встановлює частоту тиків (30-60 Hz). Для пошагового, знизьте до 10 Hz—менше батчей, менше трафіку.
Версіонування. NetworkConfig.NetworkTickSystem + NetworkConfig.ProtocolVersion—при оновленні застосунку старі клієнти не підключаються до нових серверів. На мобільному перевіримо версію клієнта перед стартом сесії.
Графік
Базова NGO інтеграція з Relay, Lobby та NetworkVariable для 2-4 гравців: 1-2 тижні. Повнофункціональна система з client prediction, матчмейкингом та мобільною оптимізацією: 1,5-2,5 місяці. Вартість розраховується індивідуально.







