Как разработчик-одиночка создаёт классическую CRPG в Unity
Разработчик-одиночка Роб Коска из Sawtooth Games рассказывает, как классические настольные системы, модульная архитектура и доступные инструменты помогают ему создавать современную партийную ролевую игру Revenge of the Firstborn с использованием Unity. Демоверсия уже доступна.

«Revenge of the Firstborn» — это грядущая партийная CRPG, которая опирается на классические философии дизайна, черпая глубину и сложность из настольных систем, при этом принимая современные рабочие процессы разработки. Созданная на основе набора правил D&D 3.5 SRD и разработанная в основном в одиночку, проект сочетает в себе тактический бой, модульную системную архитектуру и тщательно спланированный производственный процесс, поддерживаемый подрядчиками и доступными сторонними инструментами.
В нашем интервью разработчик Роб Коска из Sawtooth Games рассказал, как «Revenge of the Firstborn» опирается на такие источники вдохновения, как «Temple of Elemental Evil» и «Baldur’s Gate», одновременно решая задачи построения системы ролевой игры с большим количеством элементов при работе с небольшой командой.
От архитектуры на базе Unity и рабочих процессов на основе готовых компонентов до оптимизации производительности и создания собственных инструментов для редактора — проект предлагает детальный взгляд на то, как классический дизайн CRPG может быть адаптирован к современным ограничениям разработки.
Также сейчас доступна демо-версия!

«Revenge of the Firstborn» построена на основе классического набора правил 3.5 SRD. Что побудило принять решение основать ваши системы на этой основе, и как вы адаптировали её для современного игрового опыта? Почему не сам 5E или что-то подобное?
Роб Коска, соло-разработчик из Sawtooth Games: Я выбрал 3.5 SRD из-за того, что это гораздо более «жёсткий» набор правил, чем 5E. Он предоставляет гораздо больше возможностей для создания персонажа (особенно с учётом того, что достижения в 5E не включены в SRD), и, на мой взгляд, бой в нём более глубокий, чем в 5E.
Связанным вопросом, который мне время от времени задают, является вопрос о том, почему вообще был выбран настольный набор правил? Ну, учитывая масштаб того, что влечёт за собой полноценная ролевая игра, у меня и так достаточно работы по реализации того, что мне не нужно проектировать (и игровой баланс!) с нуля.

На какие игры (как новые, так и старые) вы в основном опираетесь для вдохновения?
Роб Коска: Самым непосредственным источником вдохновения для «Revenge of the Firstborn» является «Temple of Elemental Evil». В своей полностью исправленной форме ToEE — это мастерская реализация тактического боя, который возможен с правилами 3.5. Моя цель состояла в том, чтобы соответствовать боевым возможностям движка, созданного для этой игры, и при этом, надеюсь, добавить немного больше повествовательной изюминки в то, что по сути было массовым походом по подземельям без особого сюжета.
Я большой поклонник всех трёх игр «Baldur’s Gate», а это значит, что они почти обязательно подсознательно влияют на мою работу, но я решил пойти по пути создания игроком всей партии и периодического присоединения к ней NPC, а не создания единственного главного героя, который набирает свою партию в ходе игры.
Сколько человек в команде, какой у всех опыт в прошлом и как долго разрабатывалась игра?
Роб Коска: Всего над игрой в той или иной степени работали четыре человека. Мне очень повезло с тем, кого я смог найти для контрактной работы, особенно учитывая, что у меня нет контактов в индустрии. Работа распределяется следующим образом:
Есть 3D-моделлер по имени Кирилл Бузмаков. Мне приходилось быть довольно разборчивым в 3D-работах, которые я заказывал, потому что для меня это очень дорого. Мне посчастливилось наткнуться на работы Кирилла на форуме RPG, где он искал внештатную работу, и он создал несколько монстров, чтобы помочь заполнить этот классический бестиарий D&D, а также создал собственную модель для главного NPC игры.
Я нанял пару потрясающих 2D-художников по имени Хейтор Кейруз и Лукас Оливейра, которые создают все портреты персонажей для более чем 125 монстров в игре и многочисленных NPC, а также различные элементы пользовательского интерфейса. Это была самая большая инвестиция в игру, и, на мой взгляд, она окупилась, придав ей отточенный, уникальный вид.
Всё остальное — это я. Мне посчастливилось иметь опыт в области разработки программного обеспечения и управления командой, оба навыка я использовал, чтобы воплотить «Revenge of the Firstborn» в жизнь.

Демоверсия подчёркивает сочетание открытого исследования и лазания по подземельям. Как вы подошли к проектированию этих двух очень разных игровых пространств как с точки зрения систем, так и с точки зрения дизайна уровней?
Роб Коска: Они не так отличаются, как может показаться, по крайней мере, на мой взгляд. Я стараюсь, чтобы в каждом из них было немного повествования через окружение. Особенно на открытой местности, вы хотите вознаградить игрока за исследование каждого уголка, в котором он находится, чем-то, что можно найти.
Внутренние и внешние пространства сильно различаются с точки зрения того, на чём я фокусируюсь технически. В открытых пространствах мне пришлось изучить инстансинг GPU, чтобы все травы и деревья, которые могут быть на экране одновременно, не перегружали компьютер игрока. В помещениях главная техническая задача — освещение. В фэнтези-RPG, конечно, факелы — это главное. Вы должны внимательно следить за тем, как близко вы размещаете каждый источник света к другому источнику, особенно учитывая, что в моём случае каждый из шести членов группы может нести свой собственный источник света.

Партийные RPG могут стать чрезвычайно сложными изнутри. Как вы структурируете свои системы для создания персонажей, способностей и прогресса, чтобы они были гибкими и удобными в обслуживании?
Роб Коска: Очень важно следовать хорошим принципам объектно-ориентированного программирования. Предпочтение композиции, чтобы всё было модульным — атрибуты — это свой класс, эффекты — это свой класс. Атрибуты содержат эффекты, персонажи содержат атрибуты и так далее.
Также важно понимать, как лучше передавать сообщения между объектами и запускать события. Если у вас много объектов в каждой сцене, которые что-то делают каждый такт, даже если по отдельности это немного, в сумме это будет быстро накапливаться. Важно, чтобы как можно больше скриптов ничего не делали, пока один из скриптов, который что-то делает каждый такт/кадр, не запустит событие, на которое нужно отреагировать. Это хорошая архитектура кода, и она помогает поддерживать слабую связанность.
Эффективное использование префабов и вложенных префабов (или их эквивалентов в Unreal Engine) также очень полезно для организации и поддержки. Хороший пример из Revenge of the Firstborn — это коробки, которые показывают предметы инвентаря в пользовательском интерфейсе. Они используются в представлении инвентаря персонажа (очевидно), но также отображаются при добыче контейнеров. Создание префаба для пользовательского интерфейса инвентаря и префаба для пользовательского интерфейса добычи с вложенными префабами для фактических значков и их логики означает, что если мне нужно что-то изменить, я могу изменить это в одном месте, и это изменится везде, где это используется.

С технической точки зрения, какой движок вы используете и каковы были ключевые причины такого выбора для этого проекта?
Роб Коска: Я использую Unity. Выбор сводится почти исключительно к тому, что под капотом используется C#, и у меня уже был почти десятилетний опыт работы с языком на профессиональном уровне. Сейчас, спустя десятилетие после этого выбора, я, вероятно, продолжу использовать Unity из-за того, что он соответствует оптимальному сочетанию возможностей и сложности движка.
Можете ли вы рассказать нам о своём типичном рабочем процессе создания сцены, от раннего наброска до окончательного освещения и реализации игрового процесса?
Роб Коска: Для типичной сцены в подземелье я начинаю в Excel, верите вы в это или нет, как показано выше. Я изменяю ширину столбцов так, чтобы ширина была такой же, как высота строки. Это даёт мне виртуальную «миллиметровку», на которой я могу разметить своё подземелье. Я начинаю с того, что блокирую расположение основных комнат и расположение лестниц, чтобы добавить вертикальное разнообразие в подземелье.
После этого я ищу хорошие места для размещения одной или двух ловушек и планирую, где я хочу, чтобы происходили встречи. Каждая комната пронумерована, и легенда гласит, что происходит в этой комнате.
Как только я визуализировал таким образом всё подземелье, пришло время начать размещать стены и полы в Unity. Я настроил все свои префабы так, чтобы при размещении в позициях whole-number vector3 они правильно совпадали. Таким образом, я могу быстро подставить полы и стены на место и не иметь зазоров или наложений с z-боем.
У всех моих стен есть служебные скрипты, которые я могу использовать для создания и размещения колонн, факелов и любых других часто используемых объектов. Это позволяет мне размещать всё, что я хочу, одним щелчком мыши, и знать, что они будут размещены последовательно.
Как только окружение будет готово, остаётся только разместить ловушки, монстров и добычу в тех местах, которые я предварительно запланировал, используя свою раскладку в Excel.

Какие инструменты и программное обеспечение являются центральными в вашем конвейере для создания окружения, персонажей и ассетов (например, моделирование, текстурирование, анимация и т. д.)?
Роб Коска: Учитывая, что я не художник в 3D или 2D, мой рабочий процесс там очень ограничен. Я полагаюсь на художников, которых нанял для этого. Однако я использую GIMP, чтобы часто менять цвета объектов. Я также использую инструмент из магазина ассетов Unity под названием Umotion, чтобы создавать самые базовые анимации прямо в редакторе Unity. В «Revenge of the Firstborn» есть несколько уникальных эффектов состояния, таких как сон и захват, которых нет в обычном наборе анимаций для ассетов в любом магазине ассетов (на которые мне приходилось сильно полагаться по бюджетным причинам), поэтому я использую Umotion для модификации существующих анимаций, чтобы, например, анимация ожидания выглядела так, будто существо оглушено.
Существуют ли какие-либо специальные инструменты, системы сценариев или внутренние рабочие процессы, разработанные вашей командой для поддержки сложности систем RPG?
Роб Коска: Да, и здесь ИИ действительно меня выручает. Я использовал ChatGPT и/или Claude для генерации любого количества пользовательских инспекторов и пользовательских окон редактора. Я пока не совсем доверяю ИИ генерировать код для игровых систем, кроме некоторого стандартного кода для перемещения элементов пользовательского интерфейса или поиска попаданий в navmesh.
Однако организовать отображение и обновление свойств, чтобы показать мне всё, что я хочу увидеть, в одном представлении? Да, пожалуйста. Например, в моей игре у дверей есть скрипт для управления тем, заперта ли она, установлена ли ловушка, можно ли её разрушить и как. Я попросил ИИ написать мне пользовательский инспектор, который отображает все эти данные в удобном формате с вкладками прямо в инспекторе. Я всё ещё не смог бы написать пользовательский инспектор, чтобы спасти свою жизнь; я слишком занят написанием игрового кода.

Производительность и масштабируемость могут быть сложной задачей в RPG с большим количеством систем. Каковы были самые большие технические проблемы, с которыми вы столкнулись, и как вы их решили?
Роб Коска: Самое главное, за чем нужно следить в любой игре, где много всего происходит, — это то, что происходит каждый кадр. Один из примеров — моя система восприятия. Это довольно тяжёлая работа для каждого существа в игре, и её выполнение каждый кадр вызывало проблемы. Поэтому я изменил её так, чтобы каждое существо регистрировалось с объектом-менеджером, и этот менеджер выполняет циклическую проверку, чтобы каждое существо проверяло восприятие каждые x десятых долей секунды. Преимущество в том, что теперь я могу настроить свою систему восприятия в одном месте, если кажется, что она недостаточно отзывчива. Дополнительные баллы за то, что сделал это сериализованным полем в инспекторе, так что даже не требуется изменение кода.
Другой большой проблемой для меня было освещение. В подземельях, полных факелов, и персонажами, которые могут нести факелы, мне пришлось пройтись по своему проекту с лупой, находя объекты, которые можно настроить так, чтобы они не отбрасывали тени, например. Настройка расстояния до тени и качества тени с помощью настраиваемых параметров игры также имеет решающее значение для того, чтобы игра запускалась на как можно большем количестве систем.
Другие проблемы масштабируемости были связаны с настройкой огромного количества монстров и предметов в игре. Это место, где ИИ может проявить себя. То, что он пишет пользовательские инспекторы для этих объектов, чтобы они были организованы и представлены хорошо, было большим плюсом.

Каков конкретно ваш основной процесс как в основном соло-разработчика? Вы делаете всё буквально самостоятельно или используете какую-либо внешнюю помощь через ИИ, подрядчиков, торговые площадки ассетов и т. д.
Роб Коска: Мне нравится [ИИ] для создания стандартного кода, который я мог бы написать сам, но он может сделать это быстрее. Такие вещи, как поиск допустимых позиций на navmesh или перемещение и мигание элементов пользовательского интерфейса. Это также очень помогло с пользовательскими инспекторами и окнами редактора, как я упоминал ранее.
Я сам писал код и занимался написанием, но нанял столько художников, сколько мог себе позволить. У меня нет ни таланта, ни времени на создание искусства для игры. Я также разумно использовал магазин ассетов Unity. Когда вы работаете над проектом такого огромного масштаба в одиночку, очень важно не изобретать велосипед. Например, инвентарь, туман войны и системы диалогов — это основные компоненты, которые были куплены в магазине ассетов и интегрированы в игру.
Крайне важно провести с самим собой разговор о том, «создавать или покупать». Иногда стоит написать что-то с нуля, чтобы иметь полный контроль, в других случаях имеет смысл подключить ассет.

Заглядывая вперёд, как вы видите, что ваш конвейер будет развиваться по мере того, как вы продолжите разработку вплоть до полного релиза?
Роб Коска: Я хочу максимально автоматизировать свой процесс. Мой процесс сборки не так эффективен, как хотелось бы. Я хочу дойти до того, чтобы нажать кнопку и получить сборку, но пока этого нет.
Я хочу создать больше валидаторов сцен, которые запускаются каждый раз, когда сцена сохраняется. Также я хотел бы создать ещё несколько валидаторов, которые запускаются до запуска самой сборки. Такие вещи, которые гарантируют, что вы не скопировали и не вставили guid, который должен быть уникальным, и тому подобное. У меня есть несколько таких, но более широкий набор помог бы предотвратить попадание в релизы того, что воспринимается как баги.
Я также хотел бы внедрить ИИ в процесс проверки кода. Очевидно, что как соло-разработчик у меня нет никого, кто мог бы взглянуть на мой код во второй раз, поэтому внедрение ИИ в процесс слияния может стать хорошим способом получить что-то вроде: «Эй, ты уверен, что так и должно быть?»

Наконец, есть ли какие-нибудь дополнительные закулисные материалы, такие как WIP-окружения, графы узлов или разбивки в движке, которыми вы можете поделиться, чтобы помочь разработчикам лучше понять, как была создана «Revenge of the Firstborn»?
Роб Коска: Все мои данные поставщиков хранятся в скриптовом объекте. Сам скриптовый объект представляет собой визуальный кошмар, изображённый выше.
Я попросил ChatGPT создать для него специальный редактор, и был в восторге от того, насколько хорошо он справился. Я сам не писал код для этого окна. Возможно, оно не самое красивое, но как неигровое оно и не должно быть таким.

Роб Коска: А вот специальный инспектор для одного из моих NPC. Этот инспектор ищет все соответствующие скрипты среди дочерних объектов и отображает все сериализованные свойства для них в виде вкладок. Это экономит мне столько времени, что не нужно щёлкать по иерархии и прокручивать инспектор. Это также было полностью написано ChatGPT.
ChatGPT был достаточно умён, чтобы использовать сериализатор инспектора Odin, где это было уместно, как только я сказал ИИ, что он у меня установлен.

Роб Коска: Я с осторожным оптимизмом отношусь к использованию ИИ в кодировании. Опасность для всех нас заключается в слепом доверии и использовании того, что он создаёт, но отношение к нему как к младшему разработчику, который нуждается в руководстве и тщательной проверке своей работы, имеет большой потенциал. Хотя я полностью понимаю негативную реакцию на искусство, созданное ИИ, я думаю, что кодирование с помощью ИИ отличается.
В интернете так много документации и открытого кода, что ИИ может обучаться на нём, и я не думаю, что это связано с теми же этическими проблемами с авторским правом, что и искусство, созданное ИИ, не говоря уже об отсутствии человеческого элемента, который люди осуждают, когда речь идёт об искусстве, созданном ИИ.
Роб Коска, разработчик игр в Sawtooth Games в Revenge of the Firstborn
Интервью проведено Дэвидом Джагно
И если вам нравится то, что мы делаем здесь, в 80 Level? Тогда обязательно установите нас в качестве предпочтительного источника в Google, чтобы видеть больше нашего контента в своей ленте.
Автор: Sawtooth Games