Интеграция 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 — только владелец объекта. Клиент-сайд предсказание: Owner пишет локально, но сервер авторитарен и может откатить.
NetworkBehaviour и ownership
NGO строго различает: IsServer, IsClient, IsHost, IsOwner. IsOwner = true для объекта, которым управляет данный клиент. Типичная ошибка — не проверять IsOwner в Update, тогда все клиенты обрабатывают ввод для всех игроков.
Передача ownership: 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 секунд.
Мобильные нюансы
Background. NetworkManager.Singleton.Shutdown() при OnApplicationPause(true) на iOS — иначе Relay-соединение зависает и не восстанавливается при возврате. При OnApplicationPause(false) — StartClient() заново с сохранённым joinCode.
Batching. NGO по умолчанию батчит сообщения. NetworkConfig.NetworkTickSystem определяет частоту тиков (30-60 Hz). Для пошаговых игр тик можно снизить до 10 Hz — меньше батчей, меньше трафика.
Версионирование. NetworkConfig.NetworkTickSystem + NetworkConfig.ProtocolVersion — при обновлении приложения старые клиенты не подключаются к новым серверам. На мобильном нужна проверка версии клиента до начала сессии.
Сроки
Базовая интеграция NGO с Relay, Lobby и NetworkVariable для 2-4 игроков: 1-2 недели. Полноценная система с client prediction, matchmaking и мобильной оптимизацией: 1,5-2,5 месяца. Стоимость рассчитывается индивидуально.







