Репликация — server authoritative, eventual consistency, RPC для команд
Когда говорят «репликация в Unreal», подразумевают встроенный multiplayer-стек с тремя жёсткими правилами: сервер — единственный источник истины, состояние раздаётся через реплицируемые свойства (eventual consistency), а дискретные команды — через RPC (точечные вызовы). Это не симметричная P2P-схема, не «каждый клиент шлёт своё состояние всем». Это однонаправленный поток: клиент → сервер (через Server RPC) → клиенты (через property replication и Multicast).
Самая частая ошибка — писать gameplay-логику на клиенте: «нажал кнопку — поменял HP — отправил серверу». В server-authoritative модели всё наоборот: клиент просит сервер через Server_DealDamage, сервер проверяет (validation, anti-cheat), сервер меняет реплицированную переменную, а клиент узнаёт об изменении через OnRep_Health или просто видит новое значение в следующем тике после прихода пакета.
Вторая характерная путаница — между репликацией свойства и RPC. Это разные механизмы с разной семантикой. Реплицируемое свойство — это состояние с eventual consistency: новый игрок при подключении получит текущее значение; пропавший пакет приведёт к тому, что следующий update заменит старое значение, и всё «само починится». RPC — это дискретное событие: «выстрел произошёл», «эффект проиграть»; пропущенный unreliable RPC потерян навсегда. Полная карта — в слоях ниже.
Карта темы
- Replication Basics — server-client модель,
NetMode,RolevsRemoteRole,HasAuthority(). - Server Authority — почему сервер единственный источник истины, валидация, защита от читов.
- Replicated Properties —
UPROPERTY(Replicated),ReplicatedUsing,OnRep_*,COND_*условия. - Property Registration —
GetLifetimeReplicatedProps,DOREPLIFETIME,DOREPLIFETIME_CONDITION. - bReplicates Flag —
AActor::bReplicates,bAlwaysRelevant,NetUpdateFrequency,NetCullDistance, relevancy. - RPCs —
Server/Client/NetMulticast, validation, маршрутизация, ownership. - RPC Types — Reliable vs Unreliable, гарантии порядка, лимиты payload.
- Property vs RPC — когда что использовать, состояние vs команда, late-join.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Менять переменную на клиенте и ждать репликации | Репликация идёт только сервер → клиент; изменение на клиенте локально и будет перезаписано |
Забыть bReplicates = true на actor | UPROPERTY(Replicated) тихо не работает, RPC не маршрутизируются |
Забыть GetLifetimeReplicatedProps + DOREPLIFETIME | Свойство объявлено Replicated, но не зарегистрировано — не реплицируется |
Вызвать Multicast RPC с клиента | Не доходит до других клиентов; multicast вызывается только с сервера |
Вызвать Server RPC на actor без ownership | RPC игнорируется; нужен owning connection |
Использовать Reliable Multicast для частых событий | Забивает сетевую очередь; превышение лимита = дисконнект |
Класть в RPC большой TArray или строку | Превышение MaxRPCSize (~64 KB) → дисконнект |
| Использовать RPC для синхронизации HP | HP — это состояние, делай Replicated свойство; RPC для дискретных событий |
Проверять HasAuthority() в коде, который должен идти на всех | Лишний guard блокирует визуальную логику клиента |
Менять Role/RemoteRole вручную | Это управляется движком; ручная правка ломает репликацию |
| Тестировать только в PIE с одним клиентом | Many bugs (ownership, ordering) видны только в standalone/dedicated server |
Считать, что OnRep зовётся тоже на сервере | По умолчанию OnRep зовётся только на клиентах; на сервере значение меняется напрямую |
Значение для собеседований
Репликация — обязательная senior-тема для любого UE5-собеседования с упором на multiplayer. Проверяется:
- Что сервер — authority, и клиенты — отражение его состояния.
- Разница между
RoleиRemoteRole(на сервере моя рольAuthority, на клиенте моя роль уже неAuthority). - Как объявить и зарегистрировать реплицируемое свойство (двухшаговый процесс:
UPROPERTY+DOREPLIFETIME). - Когда
ReplicatedUsing=OnRep_Xи гдеOnRep_Xзовётся. - Три типа RPC и их направления:
Server(клиент→сервер),Client(сервер→owning client),NetMulticast(сервер→все). - Reliable vs Unreliable: гарантии доставки, порядка, что нельзя слать reliable часто.
- Когда репликация свойства, а когда RPC: HP — свойство, выстрел — multicast RPC, попытка действия — server RPC.
- Что такое
Relevancyи почему дальние actor'ы не получают updates.
Типичный неверный ответ: «Репликация — это синхронизация переменных между клиентами, нужно поставить Replicated на переменную и оно само разошлётся». Реальный ответ — модель server-authoritative, изменение на сервере; на клиенте Replicated без DOREPLIFETIME ничего не делает; направление одностороннее; для команд клиент→сервер нужен Server RPC, не присваивание переменной.