Упаковка игры и обзор мультиплеера

Урок про то, как превратить проект в готовую игру, и обзорный взгляд на сетевой мультиплеер.

Упаковка (Packaging) — это процесс сборки проекта в самостоятельное приложение под конкретную платформу, которое можно запустить без редактора.

От проекта к игре

В редакторе вы тестируете игру кнопкой Play, но игроку нужен готовый исполняемый файл. Упаковка собирает код, ассеты и движок в дистрибутив под выбранную платформу (Windows, консоль, мобильное устройство).

Этапы упаковки

  1. Выберите платформу: Platforms → Windows (или другая).
  2. Укажите конфигурацию: Development (с отладкой) или Shipping (финальная, быстрая).
  3. Запустите Package Project.
  4. Движок скомпилирует код, «приготовит» (cook) ассеты в формат платформы и соберёт билд.
КонфигурацияКогда использовать
DevelopmentТестирование вне редактора, с логами
ShippingФинальный релиз: быстрее, без отладочных средств

Key-шаг — cooking: ассеты конвертируются в оптимизированный для платформы вид (например, текстуры сжимаются под конкретное железо), а неиспользуемые исключаются.

Обзор мультиплеера

Сетевая игра в Unreal построена на модели «клиент-сервер». Есть авторитетный сервер, хранящий «истину» о состоянии игры, и клиенты, которые отображают её и шлют свои действия. Это защищает от читерства: клиент не решает сам, попал ли он, — это решает сервер.

Репликация и authority

Чтобы данные с сервера попадали к клиентам, их помечают как реплицируемые. Сервер меняет значение — оно автоматически синхронизируется с клиентами. Понятие authority означает: только сторона с полномочиями (обычно сервер) имеет право менять состояние.

Клиент жмёт "выстрел"
     |  (RPC на сервер)
Сервер: проверяет, считает попадание (authority)
     |  (репликация результата)
Все клиенты: видят эффект выстрела и урон

Как работает под капотом

Реплицируемые переменные сервер рассылает клиентам при изменении. Действия игрока передаются на сервер через RPC (Remote Procedure Call) — удалённый вызов функции. Сервер проверяет действие и реплицирует результат всем. Эта архитектура — причина, по которой важно правильно разделять GameMode (сервер) и GameState (всем): мы заложили её ещё в уроках про каркас игры.

Частые ошибки

  • Тестировать только в редакторе. Упакованный билд может вести себя иначе; проверяйте сборку.
  • Доверять клиенту в мультиплеере. Решения о попаданиях и уроне должен принимать сервер.
  • Забыть пометить переменную реплицируемой. Тогда клиенты не увидят изменений.

Подготовка к релизу

Перед упаковкой финального билда стоит пройти чек-лист. Уберите отладочные выводы и тестовые объекты с уровней. Проверьте, что игра запускается с правильного стартового уровня — он задаётся в Project Settings. Настройте иконку и название приложения. Соберите билд в конфигурации Shipping и обязательно протестируйте именно его, а не редактор: в упакованной игре нет редакторских костылей, и иногда всплывают проблемы, незаметные при Play в редакторе. Частая засада — ассет, который грузился в редакторе, но не попал в cook из-за того, что на него ссылались лишь косвенно.

Для мультиплеера к этому добавляется тестирование с несколькими экземплярами. Редактор умеет запускать сразу несколько клиентов (Number of Players в настройках Play), имитируя сетевую игру локально. Так проверяют репликацию: то, что видит сервер, должны корректно видеть и клиенты. Сетевые баги коварны — они проявляются только при нескольких участниках, поэтому тестировать мультиплеер в одиночку бессмысленно.

Итоги

  • Упаковка собирает игру в самостоятельный билд под платформу.
  • Cooking конвертирует ассеты под целевое железо; Shipping — финальная конфигурация.
  • Мультиплеер построен на авторитетном сервере и клиентах.
  • Репликация синхронизирует данные, RPC передаёт действия; authority у сервера.
Проверьте себя
1. Что делает шаг cooking при упаковке?
AУдаляет проект
BКонвертирует ассеты в оптимизированный для платформы вид
CЗапускает игру в редакторе
DСоздаёт Blueprint
2. Кто в модели мультиплеера Unreal хранит «истину» о состоянии игры?
AКаждый клиент сам
BАвторитетный сервер
CСлучайный игрок
DGameState на клиенте
3. Как действие игрока передаётся на сервер в мультиплеере?
AЧерез материал
BЧерез RPC (удалённый вызов функции)
CЧерез Tick
DЧерез Content Browser