Как отлаживать проблемы репликации в проекте Unreal Engine?
Позиции врагов «телепортируются», а полоска здоровья отстаёт, но только в реальной игре по сети — в PIE на машине разработчика всё гладко. Вы добавляете задержку в PIE через Net PktLag/PktLoss и читаете сетевые инструменты:
PIE чистая локальная сеть: гладко, рассинхрона нет
Net PktLag=120 PktLoss=5: врага дёргает/телепортирует, здоровье отстаёт
showdebug net: актёр врага есть, NetUpdateFrequency низкая
Net.DumpRelevantActors 1: враг ЕСТЬ в списке релевантных для клиента
Лог авторитета: "Enemy SetHealth on SERVER" (состояние пишет сервер)
Определите причину.
Воспроизведите в PIE с несколькими клиентами, затем используйте Net PktLag/PktLoss для симуляции плохой сети, оверлей showdebug net, Net.DumpRelevantActors и логирование авторитета, чтобы понять, какая машина пишет состояние и зарегистрировано ли свойство.
- ✗Тестировать только на идеальной локальной сети без задержки и потерь
- ✗Отлаживать на одной машине и считать, что серверная сторона ведёт себя так же
- ✗Никогда не проверять, зарегистрировано ли свойство для репликации
- →Что
Net PktLagпоказывает такого, чего не даёт чистый локальный тест? - →Как подтвердить регистрацию свойства, не читая исходный код?
Сценарий
Игроки жалуются: позиции врагов «телепортируются», а полоска здоровья иногда отстаёт. На машине разработчика в PIE всё гладко — баг проявляется только в реальной игре по сети.
Симптом против причины
Гладко локально, плохо по сети — классический признак того, что баг скрыт нулевой задержкой PIE. Идеальная локальная сеть прячет потерю пакетов, джиттер и проблемы порядка.
Инструменты отладки
1. Воспроизведение реальной сети
Net PktLag=120 // искусственная задержка, мс
Net PktLagVariance=40
Net PktLoss=5 // потеря пакетов, %
Эти консольные команды в PIE воссоздают условия, при которых проявляется баг.
2. Сетевой оверлей
showdebug net
Показывает реплицируемых актёров, их частоту обновлений и нагрузку на соединение прямо на экране.
3. Дамп релевантности
Net.DumpRelevantActors 1
Подтверждает, реплицируется ли проблемный актёр конкретному клиенту вообще — если его нет в списке, виновата релевантность или дормантность.
4. Логирование авторитета
UE_LOG(LogTemp, Warning, TEXT("%s SetHealth on %s"),
*GetName(),
HasAuthority() ? TEXT("SERVER") : TEXT("CLIENT"));
Подтверждает, что состояние пишется на сервере, а не на клиенте.
5. Проверка регистрации
- Свойство помечено
Replicated/ReplicatedUsing? - Есть
DOREPLIFETIMEвGetLifetimeReplicatedProps? - Вызван
Super::GetLifetimeReplicatedProps?
Типичный итог
«Телепортация» врага — это коррекция: клиент предсказывал движение, а авторитетное обновление сервера приходило с задержкой и резко поправляло позицию. Лечится сглаживанием интерполяции и проверкой NetUpdateFrequency.