Знакомство
Привет, меня зовут Олег. Это моя первая статья не только на Хабре но и в жизни. Я геймплей программист команды Funky Games -- образованной в начале 2024 года 4мя студентами магистрантами Школы разработки видеоигр (ШРВ) ИТМО. И в этой статье я хочу рассказать о процессе разработки нашей игры FunkyPirates.
Игра начиналась как курсовой проект, часть обучения второго семестра на программе ШРВ. Я четко понимал, что хочу сделать игру с продолжением... а не проект для портфолио в стол, поэтому решил собрать команду. Из информации о студентах у меня было только общее впечатление о курсовых проектах прошлого семестра, презентациях с майлстоунов и конечно же финального питча. Кроме качества работы студентов для меня было важно их свободное время, для сбора информации о котором мы заполняли специальную табличку. Я не работаю и готов посвятить все свободное время игре и желал найти подобных же людей в команду. И так, нашу команду составили: я программист, Матвей геймдизайнер, Паша программист и Влад геймдизайнер.
Дизайн
Как и полагается, начали мы наше взаимодействие с придумывания идеи. Мы договорились о встрече, на которой каждый желающий сможет представить свою идею. Базовые положения с которыми я входил в этот разговор:
игра для рынка, с маркетинговым позиционированием
игра из готовых визуальных ассетов, потому что на иное нет ресурсов
что-то с хорошим соотношением предложения и спроса, потому что когда к нам приходил Кирилл Бубенко из VK Play, он нам рассказал, что у следующих игр соотношение самоё выгодное (соре за качество):
![Диаграмма с отношением заработка и предложения Диаграмма с отношением заработка и предложения](https://habrastorage.org/getpro/habr/upload_files/f37/043/c72/f37043c729a495dac8616907ee5d62ea.png)
Большая часть членов команды кмк также разделяла подобные тезисы. Матвей предложил хорошую идею с пиратами, которые приплывают на остров, выкапывают сундук сокровищ и должны с ним уплыть на корабле. К этому также добавилось смешное физическое взаимодействие, гарантирующее веселье.
Работали мы в миро, и финальный артефакт этого обсуждения выглядит следующим образом:
![Скриншот доски миро идея Скриншот доски миро идея](https://habrastorage.org/getpro/habr/upload_files/e84/6e7/966/e846e7966590faf480c82514a61c2d37.jpg)
Из забавного, в начале курса нам сказали провести прототипирование проектов, поскольку компьютерных прототипов у большинства студентов еще не было, в том числе и у нас, оставшимся вариантом прототипирования оставался бумажный, настольный прототип. Мы придумали пошаговую версию с глобальными часами для симуляции окружения, пространственной и временной стоимостью действий. И даже поиграли в это! Выглядело это как то так:
![Скриншот миро. Бумажный прототип Скриншот миро. Бумажный прототип](https://habrastorage.org/getpro/habr/upload_files/914/79b/0c0/91479b0c00484470d243b587fdedb8c9.jpg)
При этом сложно сказать, что это прототипирование нам как-то помогло. Большинство проблем, о которых мы подозревали еще до его проведения, такие как например, проседающая динамика или неясный баланс фазы доставки сундука, остались и по сей день. Поскольку на нас давило время, нужно было принимать и закреплять решения, начинать делать, мы решили отложить их решения до момента проведения настоящих экспериментов.
Конечно же это не вся дизайнерская информация по игре. В ходе курса мы заполняли дизайн документ в Confluence, использование которого было продиктовано требованиями курса.
Начало разработки
Мы начали разработку. Делаем мы на Unreal Engine 5, поскольку это требования ШРВ, не то чтобы кто-то был сильно против. Нужно понимать, что за плечами у каждого, как минимум прошлый семестр UE, с курсовым проектом, но ноль понимания, как делать на нем онлайн игры. Я тогда думал: “Ничего страшного, справимся, вон сколько туториалов на YT лежит”. Также мы делаем все в основном в BluePrint’s, потому что это банально проще и используем cpp только там, где без этого никак. Мы думали, что в UE уже есть все, достаточно высокоуровневое, чтобы сделать онлайн игру, если бы я увидел это видео тогда…
Первым делом мы взялись конечно же за разработку персонажа. По началу для реализации физичности персонажа мы использовали Physics Animation из 5.2 на базовом Character и вот, что получалось:
![Physical Animation с Character, мувмент с эмуляцией сети Physical Animation с Character, мувмент с эмуляцией сети](https://habrastorage.org/getpro/habr/upload_files/8ed/444/f12/8ed444f12011320fc335c3807f75e1e1.gif)
![Physical Animation с Character, перенос сундука Physical Animation с Character, перенос сундука](https://habrastorage.org/getpro/habr/upload_files/08c/7da/a6e/08c7daa6e6ca8a44238ff9aeecf49a2e.gif)
Очевидно, это провал, потому что Character вообще не считается с Chaos физикой, но не использовать Character очень сильно не хотелось, чтобы не потерять clinet side prediction и reconciliation. Однако пришлось:
![Physical Animation с Pawn Physical Animation с Pawn](https://habrastorage.org/getpro/habr/upload_files/c5a/a44/ab8/c5aa44ab85f9384f36b914a11fdf5e52.gif)
![Physics Control Pawn, взаимодействие двух персонажей Physics Control Pawn, взаимодействие двух персонажей](https://habrastorage.org/getpro/habr/upload_files/90a/c99/c5f/90ac99c5f07734c4872a934c2a619690.gif)
В ходе этого процесса, мы также перешли на новейшую версию того времени UE5.3, поскольку в ней был улучшен экспериментальный Physics Control Comp, на основании которого в итоге и был построен наш персонаж. Изначально для балансировки использовалась классическая дополнительна сила, решение которое я подсмотрел в статье. Затем вместе с переходом на Physics Control сила была заменена на еще один Control Point, который контролирует не только высоту таза, но и его ориентацию, что позволило управлять направлением взгляда персонажа. В общем-то дальше дело по большей части в подборе параметров. В основном нам говорят, что управлять персонажем приятно.
![Physics Control Pawn, прото метание и перенос сундука Physics Control Pawn, прото метание и перенос сундука](https://habrastorage.org/getpro/habr/upload_files/4ec/dda/b1e/4ecddab1eb768aa5acfa23bd6a74f16b.gif)
Репликация физики движения работает на стандартном методе репликации UE. Я очень долго ломал голову, как же сделать нормально сервер авторитетно, но с предсказанием на стороне сервера, пересматривая по несколько раз презентацию разработчиков Rocket League. Пришел к выводу, что эпики по сути и занимаются разработкой похожего решения, с двумя дополнительными режимами репликации Predictive Interpolation и Resimulation, первый из которых в 5.4 вышел в бету. Но все еще оба метода работают нестабильно и далеки от релизного состояния, поэтому мы с надеждой ждем)
Середина и выпуск
Где-то к середине апреля у нас были готовы основные механики, почти собран один остров и выглядело это примерно так:
![Первый играбельный прототип с ассетами Первый играбельный прототип с ассетами](https://habrastorage.org/getpro/habr/upload_files/032/e47/49e/032e4749ed378345908ec17cb6f25286.gif)
Большинство механик, мы реализовали при помощи стандартных, популярных решений, то есть при помощи RPC и репликации. И это сыграло с нами плохую шутку, хотя бы потому, что не все механики являются сервер авторитетными, что грозит читерами. Не все механики имеют предсказание на стороне клиента, что вводит большой инпут лаг. И всех этих проблем, как нам кажется можно было избежать, если бы мы использовали Gameplay ability system, об использовании которого мы думали еще в самом начале разработки, но из-за давления времени решили отложить это на потом. Сюрприз так оно и получилось, теперь мы думаем о переходе на него осознанно и походив по граблям.
В мае нам объявили, что ВК организовывает VK Play лабораторию и мы можем туда попасть, мы конечно же поставили себе новую цель: обязательно туда попасть. Мы делали нашу игру в формате Listen Server (один из игроков является хостом для всех остальных), а для сведения игроков вместе планировали использовать Steam. И вот за две недели до оглашения результатов первого отбора в лабораторию, нам говорят, чтобы мы исключили упоминания Steam (такое требование площадки) и перешли на решение без стима и виртуальных локальных сетей (типо hamatchi) за неделю. Мы с Пашей впопыхах начали это реализовывать, Паша очень быстро написал серверный менеджер и мы начали это обкатывать. Мы еще немного поборолись с использованием ВК аутентификации на клиенте и их прекрасной документацией. Но смогли все таки реализовать и игра вышла в ВК Плей лабораторию.
Финальную версию игры можно увидеть в нашем геймплейном трейлере:
По прошествии первой недели в лаборатории по первым отзывам мы поняли, что игре нужны боты, люди не могут собрать партию для игры. Поэтому быстро в течение недели были реализованы простые боты на основе стохастического дерева поведения, главной задачей которых было, позволить игроку одному пройти по всему игровому циклу, по всем этапам игры, не делая ничего.
Мы надеемся, что эта статья была интересна и может даже полезна для вас. Мы рады делится информацией о нашей игре и технических деталях её реализации. У нас осталось еще много задокументированного о процессе разработке. Если вы хотите узнать об игре больше:
Вы можете ознакомиться с нашей страницей на VK Play. И посетить наш телеграм канал.