Спроектируйте систему возрождения игрока для мультиплеерного матча в Unreal Engine. Когда игрок умирает, после задержки он должен вернуться в подходящей точке спавна с чистым персонажем — без остаточного состояния от прошлой жизни. Постоянные данные вроде счёта, команды и статистики должны пережить смерть и перейти в новую жизнь, а не теряться с мёртвым телом. Возрождение должно быть авторитетным на сервере: клиент не должен сам решать, когда и где возродиться, или спавнить своего персонажа. Таймер возрождения должен быть виден клиентам с обратным отсчётом, а новый персонаж должен корректно появиться у всех клиентов. Опишите, что является расходуемым, а что постоянным между жизнями, кто выполняет возрождение и выбор точки спавна, где живёт постоянное состояние, и компромиссы вашего подхода.
Обрабатывайте возрождение в GameMode на сервере: при смерти старый Pawn уничтожается, а PlayerController выживает, затем после задержки GameMode выбирает PlayerStart и спавнит и овладевает новым Pawn. Постоянное состояние живёт на PlayerState.
- ✗Переиспользовать мёртвый Pawn вместо его уничтожения и спавна нового
- ✗Позволять клиенту спавнить или размещать свой Pawn вместо серверного
GameMode - ✗Хранить постоянные данные на
Pawn, которые теряются при его уничтожении
- →Как бы вы выбирали точку спавна, избегающую врагов и других игроков?
- →Как бы вы реализовали таймер возрождения, обратный отсчёт которого видят все клиенты?
Ключевые классы
AGameMode— server-only: владеет логикой возрождения, выбором точки спавна, таймерами.APlayerController— один на игрока; переживает смертьPawnи держит сессию.APlayerState— постоянные данные между жизнями: счёт, команда, статистика.APlayerStart— размещённые на уровне точки спавна, опционально тегированные.UHealthComponent— детектирует смерть, шлёт событие вGameMode.
Модель данных
Pawn — расходуемый: уничтожается при смерти, создаётся заново при возрождении. Controller и PlayerState постоянны и переживают смерть, поэтому всё, что должно сохраниться (счёт, команда), живёт на PlayerState, а не на Pawn.
Поток данных
- Здоровье падает до нуля →
UHealthComponentшлёт событие на сервере. GameModeзапускает анимацию смерти, черезFTimerHandleставит таймер возрождения.- По таймеру
GameMode::ChoosePlayerStartвыбираетAPlayerStart(по команде, расстоянию до врагов). GameModeспавнит новыйPawnи вызываетController->Possess(NewPawn).PlayerStateуже несёт счёт и команду — новый Pawn просто продолжает игру.
Соображения по репликации
Спавн и Possess происходят только на сервере; новый Pawn реплицируется клиентам автоматически. Таймер возрождения хранится на PlayerState или GameState как Replicated, чтобы клиент видел обратный отсчёт. Экран смерти — локальный UI, реагирующий на реплицированное состояние.
Настройка дизайнером
Задержка возрождения, режим выбора точки (случайно/по команде/безопасная) — поля DataAsset или конфиг GameMode. Точки APlayerStart размещаются и тегируются на уровне дизайнером. Правила числа жизней также данные.
Компромиссы
- Новый
Pawnvs. переиспользование: новый чист и без остаточного состояния, но дороже по спавну; переиспользование рискует утечкой старого состояния. - Фиксированная точка vs. динамический выбор: фиксированная проста, динамическая (дальше от врагов) честнее, но требует запросов к миру.