Исходный размер 2480x3500

UE-разработка в рамках Gorilla Warfare

PROTECT STATUS: not protected

GORILLA WARFARE

Gorilla Warfare — это мультиплеерная PvP-игра на Unreal Engine, построенная вокруг коротких динамичных матчей, хаотичных сражений между обезьянами, гранат, интерактивного окружения и нескольких игровых режимов.

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

Исходный размер 1332x720

Задачи

В течение года моя работа была сосредоточена на технической основе проекта: сетевой логике, игровых режимах, настройках матча, системах раунда, интерактивных объектах и поддержке стабильности проекта.

Многие задачи были связаны между собой, поэтому важной частью работы было не просто реализовать отдельную функцию, а встроить ее в общий flow игры: от лобби и выбора настроек до перехода на карту, старта раунда, подсчета очков и завершения матча.

Исходный размер 4309x3172

Отдельная сложность проекта заключалась в мультиплеере. В сетевой игре недостаточно сделать механику локально: нужно учитывать, где хранится состояние, кто принимает решения, какие данные должны быть доступны серверу, а какие должны приходить клиентам для отображения в UI. Поэтому большая часть систем строилась так, чтобы сервер оставался источником правды, а клиенты получали актуальное состояние матча без рассинхронизации.

Исходный размер 1146x480

Сетевая логика

Исходный размер 4442x2592

Мультиплеерная основа построена на Steam Sessions: игроки могут создавать лобби, находить их через внутриигровой поиск серверов и подключаться к сессиям. Также поддерживаются приглашения через Steam, поэтому подключение возможно как через интерфейс игры, так и через Steam.

Исходный размер 1751x720

Для проверки сетевой логики использовался локальный запуск нескольких клиентов через Sandboxie. Это ускорило тестирование, потому что большинство систем нужно было проверять не в одиночном режиме, а сразу в сценариях с несколькими игроками, чтобы у всех все работало, а не только у сервера или клиента.

Исходный размер 1720x707

После базового подключения сессий появилась задача сделать фильтр для поиска серверов, чтобы в списках лобби не было чужих игр. Это было сделано через параметры Steam Sessions: перед отображением лобби проверяется название игры и версия билда. Благодаря этому игрок видит только совместимые сессии Gorilla Warfare, без чужих проектов и серверов другой версии.

Исходный размер 1720x707

Матч

Старт раунда проходит через отдельную логику ожидания игроков на сервере. Матч не начинается, пока все участники не подключились на карту.

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

Исходный размер 1720x720

Дальше логика игрока зависит от активного игрового режима. После смерти система проверяет правила текущего режима и определяет, что должно произойти дальше.

В Banana King игрок возвращается в матч после смерти, потому что режим построен вокруг постоянного сбора бананов и изменения счета.

В Straftat смерть работает иначе: игрок выбывает до конца раунда, потому что там выигрывает последний выживший.

Исходный размер 720x406

Для таких ситуаций был нужен режим наблюдателя. После смерти обезьяна заменяется на отдельную пешку наблюдателя с возможностью свободного полета по уровню. Так умерший игрок остается подключенным к матчу, но больше не участвует в текущем раунде. При этом GameMode может корректно отслеживать, кто еще жив, исключать выбывших игроков и определять победителя раунда.

Для разработчиков также была введена специальная кнопка, которая переводит игрока в пешку наблюдателя и обратно. Это было сделано для более быстрого и удобного способа снимать ролики и делать скриншоты.

Исходный размер 1080x443

Отдельно была реализована система очков. Данные о текущем счете игроков хранятся в PlayerState, а общая информация о ходе матча и правилах подсчета находится на стороне сервера в GameState и GameMode. Благодаря этому каждый клиент получает актуальные значения через репликацию и использует их только для отображения в UI.

Такой подход важен для мультиплеера, потому что интерфейс не должен рассчитывать результат локально. Сервер остается источником актуального состояния, а игроки видят синхронизированный счет без расхождений между игровой логикой и тем, что отображается на экране.

Исходный размер 1440x720

Еще один важный элемент матча — система улучшений. Сейчас она подготовлена как техническая база для будущей механики между раундами.

Игроку уже можно выдать улучшение, а новые варианты быстро создаются на основе общей структуры.

Логика реализована модульно через компоненты и GAS, поэтому новые улучшения можно добавлять без переработки основной системы.

Игровые режимы

Игровые режимы построены через наследование от общего класса GM_Gameplay. В нем находится логика, которая одинакова для всех режимов: запуск и завершение матча, переходы между состояниями, работа с игроками и базовые сетевые события.

Конкретные режимы — GM_Banana_King и GM_Straftat — наследуют эту функциональность и переопределяют только ту часть логики, которая отвечает за правила игры. Таким образом общая структура матча остается единой, а подсчет очков, обработка смерти игрока и условия победы реализуются отдельно для каждого режима.

Исходный размер 1278x720

Banana King — режим, где победитель определяется по количеству собранных бананов в конце раунда.

После смерти игрока сервер рассчитывает, сколько бананов должно выпасть из обезьяны, и создает их на карте. Другие игроки могут подобрать эти бананы, после чего счет обновляется и синхронизируется для всех участников матча.

Количество выпадающих бананов зависит от времени раунда. Чем дольше идет матч, тем выше цена смерти: ближе к концу один момент может сильнее изменить итоговый счет. Эта логика делает режим менее статичным, потому что преимущество игрока может измениться даже на последних секундах.

Исходный размер 1280x720

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

GameMode отслеживает состояние игроков после каждой смерти и проверяет, сколько участников еще остается в раунде. Когда остается последний живой игрок, раунд завершается, а победа засчитывается в общий счет.

Матч продолжается до заданного количества побед, которое выбирается в настройках лобби. За счет этого Straftat работает не как один короткий раунд, а как серия раундов с понятным условием завершения.

Исходный размер 1280x720

Игровые настройки

Выбор режима происходит в лобби до загрузки карты. Система берет путь выбранного уровня из Data Table, формирует ServerTravel-команду и передает нужный GameMode через параметр «? game=`». Именно поэтому Banana King и Straftat запускаются на выбранной карте через одну общую логику перехода, без ручной смены GameMode в настройках уровня.

Исходный размер 1720x720

Отдельно настраивается количество раундов и карт. В лобби задается, сколько раундов нужно выиграть на одной карте и сколько карт будет сыграно в рамках матча. После старта эти настройки передаются в GameMode. В конце каждого раунда он проверяет текущий счет и определяет следующий шаг: продолжить раунды на этой карте, перейти на следующую карту или завершить матч.

Исходный размер 1720x720

Так матч в Straftat строится как серия карт. На каждой карте проводится заданное количество раундов, а финал наступает только после прохождения выбранного количества карт.

Исходный размер 1752x720

Время раунда тоже задается в настройках лобби и передается в GameMode. Таймер работает от серверного времени: в начале раунда сервер фиксирует момент старта, а клиенты получают это значение и локально рассчитывают оставшееся время для UI. Такой подход не требует постоянной отправки таймера каждую секунду, но сохраняет синхронизацию для всех игроков.

Исходный размер 1720x720

В Banana King это же время используется не только для завершения раунда, но и для расчета количества бананов, выпадающих после смерти игрока. Поэтому настройка времени влияет не только на длительность матча, но и на внутреннюю экономику режима.

Объекты

После систем матча и игровых режимов отдельным направлением стала работа с объектами на уровнях. В Gorilla Warfare арена не должна быть просто статичной площадкой: окружение должно влиять на движение игроков, создавать опасные ситуации и давать дополнительные игровые возможности.

Исходный размер 1280x720

Одним из таких объектов стали поезда. Они работают как динамическая опасность на уровне: движение строится по spline, через который задаются начальная и конечная точки маршрута, а сам поезд перемещается между ними с заданной скоростью.

Основные параметры вынесены в переменные прямо на объекте, поэтому их можно менять при размещении на уровне: скорость, дистанцию движения, остановки, плавность перемещения и появление предметов на остановках. Благодаря этому один и тот же Blueprint можно использовать в разных ситуациях, не создавая отдельную логику для каждого поезда.

Исходный размер 1080x445

Конвейеры решают другую задачу: они работают одновременно как инструмент для сборки уровня и как gameplay-объект. Конвейер собирается по сплайну: вдоль линии автоматически генерируется модель, поэтому объект можно быстро растянуть, изменить форму и адаптировать под нужную часть карты. При этом конвейер не просто стоит на уровне, а перемещает игроков в заданном направлении, влияя на навигацию и позиционирование во время матча. Такая система ускоряет сборку карты и избавляет от необходимости вручную расставлять каждый сегмент.

Исходный размер 832x468

Разрушаемые объекты добавляют окружению еще один уровень интерактивности. Их можно двигать, повреждать и уничтожать во время матча. Модель, здоровье и фрагменты разрушения вынесены в переменные, которые можно менять прямо на уровне, поэтому каждый объект можно быстро настроить под конкретную ситуацию. После уничтожения объект перестает реплицироваться, чтобы снизить сетевую нагрузку и не передавать состояние его фрагментов всем игрокам. Также есть варианты объектов, из которых после уничтожения появляется оружие.

Исходный размер 1719x720
UE-разработка в рамках Gorilla Warfare
Проект создан 10.06.2026
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше