Я создал видеоигру с помощью нейросетей, но не смог опубликовать ее в Steam
Это история из Сообщества. Редакция задала вопросы, бережно отредактировала и оформила по стандартам журнала
Более десяти лет я создаю видеоигры в одиночку.
Моим первым проектом стал простой 3D-файтинг, а последним — игра, которую в реальном времени создают сразу несколько нейросетей.
Расскажу, откуда у меня появилась такая идея и почему я не смог опубликовать игру в Steam.
Путь в разработке и выпущенные игры
Я с детства интересовался видеоиграми и их разработкой. Помню, что часто рисовал в тетрадях выдуманные уровни и записывал интересные идеи. Когда в 2010 году у меня появился компьютер и доступ в интернет, я редактировал файлы и создавал моды для различных игр. После этого изучал игровые конструкторы вроде Raycasting Game Maker.
В 2013 году начал самостоятельно изучать программирование и игровой движок Unity. Мне тогда было 16 лет, я учился в школе и целыми днями сидел за компьютером. Уже через несколько месяцев опубликовал в Steam первую игру — Drunken Wrestlers. Это был простой 3D-файтинг с ragdoll-физикой. Так называют анимацию «тряпичной куклы» — когда модели реалистично сгибаются при взаимодействии с окружающей средой.
Drunken Wrestlers была скачана более 10 миллионов раз. В игру даже сыграл известный ютуб-блогер PewDiePie — его ролик собрал 3,5 миллиона просмотров. Через несколько лет я выпустил ремейк игры для мобильных устройств в Google Play.
В 2016 году я начал разработку второй части. По сути, Drunken Wrestlers 2 стала моим первым серьезным проектом. Я в одиночку создавал онлайн-мультиплеер, редактор карт, несколько режимов и кастомизацию персонажей. У меня не было достаточно знаний для игры такого уровня, поэтому разработка растянулась.
Через три года игра вышла в Steam в раннем доступе, но я продолжал над ней активно работать еще столько же времени. Лишь летом 2022 года, спустя шесть лет разработки, Drunken Wrestlers 2 была закончена.
Моей третьей игрой стал платформер Locomotorica: Staggering Ragdoll — он тоже создан с помощью ragdoll-физики. В этот раз игроку нужно не драться, а учиться ходить и преодолевать препятствия.
Сделать это очень сложно: на геймпаде нужно использовать сразу несколько кнопок, чтобы передвигать ноги персонажа. Даже невысокий выступ или маленькая дыра становятся трудными испытаниями. Если не получится их пройти, 3D-модель забавно упадет.
Locomotorica: Staggering Ragdoll вышла в Steam в конце мая 2023 года. Параллельно я начал разрабатывать свою четвертую и самую необычную игру. Она создана с помощью нейросетей.
Увлечение нейросетями
Впервые я обратил внимание на нейросети в далеком 2015 году, когда они создавали смешные галлюциногенные картинки с собаками. Я подумал, что технология точно пригодится в создании видеоигр — особенно таким соло-разработчикам, как я. Но полноценно познакомился с нейросетями лишь в 2019 году: после релиза GPT-2 пытался создавать чат-ботов.
Из-за развития нейросетей я стал одержим идеей создать игру, которая бы процедурно генерировалась в реальном времени. Такой подход мог значительно увеличить реиграбельность проекта и даже сделать его бесконечным. Но у меня не было технических средств для реализации такой амбициозной игры.
Все изменилось в конце 2022 года. Я вынужденно уехал из России и за границей впервые получил доступ к ChatGPT и OpenAI API. Тогда я понял, что процедурная генерация текстовых ассетов для игр — кода, диалогов, сценария — становится возможной.
Это осознание подтолкнуло меня сделать хотя бы прототип игры своей мечты. На тот момент уже была возможность создавать картинки с помощью Stable Diffusion и озвучку через синтез речи. Я посчитал, что с помощью этих элементов будет логично делать игру в жанре визуальной новеллы на английском языке.
Идея и разработка новой игры
Начало разработки. В конце января 2023 года я начал работу над новой игрой и назвал ее Dreamio: AI-Powered Adventures. Она создана во втором лице, то есть игрок не взаимодействует с миром напрямую, а читает и слушает рассказчика с искусственным интеллектом. Тот придумывает ситуации и спрашивает, что игрок будет делать дальше. Можно отвечать что угодно и задавать рассказчику уточняющие вопросы про окружение или персонажа.
Я дал игрокам возможность самостоятельно описать стартовый сеттинг, то есть мир игры. А еще предварительно сгенерировал несколько предустановленных сеттингов, например мир киберпанка или зомби-апокалипсис.
Генерация ответов. В тот момент ChatGPT еще не имела API, то есть сторонние разработчики не могли работать с сервисом напрямую. Поэтому я использовал GPT-3 — эта версия нейросети просто генерирует продолжение текста пользователя. Так что у меня была полная свобода при составлении запроса. Когда OpenAI сделала ChatGPT API публичным, оказалось, что ChatGPT тоже может продолжать текст, поэтому переход с GPT-3 был простым.
Основной запрос для генерации сюжета с помощью GPT-3 выглядит примерно так:
- Рассказчик: *описывает стартовый сеттинг*
Игрок: *совершает действие*
Рассказчик:
После каждого ответа игрока диалог отправляется в нейросеть. Так как переписка оканчивается на пустой реплике рассказчика, GPT-3 анализирует контекст и генерирует продолжение. После каждого действия игрока процесс повторяется.
Обход лимита символов. У GPT-3 есть ограничение на длину запроса. После определенного количества реплик он становится слишком длинным — нейросеть отказывается с ним работать. Чтобы обойти ограничение, я решил генерировать краткое содержание игровой сессии.
Запрос для генерации краткого содержания истории выглядит следующим образом:
- Рассказчик: *стартовый сеттинг*
Игрок: *действие*
Рассказчик: *продолжение*
Игрок: *действие*
Рассказчик: *продолжение*
Игрок: *действие*
Рассказчик: *продолжение* - Краткое содержание событий и важных деталей
Нейросеть анализирует сессию и заменяет историю кратким содержанием. Последующие запросы выглядят так:
- Предыдущие события: *краткое содержание*
Рассказчик: *продолжение*
Игрок: *действие*
Рассказчик: *продолжение*
После идеи с кратким содержанием сессии я решил добавить автоматическую генерацию вариантов действий. Она упрощает игру для тех, кому лень самостоятельно набирать текст.
Когда игрок нажимает кнопку «What are my choices?», GPT-3 генерирует пронумерованный список возможных действий.
Озвучка. Реплики рассказчика озвучиваются синтезом речи. Я пробовал озвучивать их с помощью ElevenLabs. Рассказчик звучал как живой, но стоимость озвучки оказалось запредельно высокой. Я остановился на Neural2 от Google. Игрок тоже может отвечать рассказчику голосом. Речь распознает нейросеть Whisper от OpenAI.
Генерация иллюстраций. Мне пришлось придумать запрос для GPT-3, который в ответ создавал запрос для Stable Diffusion. Упрощенно он выглядит так:
- Рассказчик: *стартовый сеттинг*
Игрок: *действие*
Рассказчик: *продолжение* - Создай визуальное описание текущей сцены
В ответ на запрос GPT-3 вынуждена визуально описать текущую сцену. Полученный ответ автоматически отправляется в формате запроса в Stable Diffusion. Сгенерированное изображение подгружается в игру и отображается рядом с диалоговым окном как иллюстрация.
Пришлось уделить много времени формулировке запроса и настройкам Stable Diffusion, чтобы у полученных иллюстраций был общий стиль. После этого изображения проходят через нейросеть MiDaS.
Она создает карту глубины, которая позволяет имитировать параллакс-эффект на иллюстрациях, смещая пиксели и умножая вектор смещения на глубину.
Введение правил и ограничений. Даже на начальном этапе разработки было интересно исследовать сгенерированные миры и ситуации. Но в игре не было ни рамок, ни возможности проиграть.
К примеру, игрок мог ответить «я взлетаю» — и рассказчик покорно слушался, даже если мир игры не предусматривал суперспособностей. А без возможности проиграть порой пропадал смысл сеттинга. К примеру, во время зомби-апокалипсиса можно было дразнить врагов без последствий.
Я решил проблему таким образом: добавил инструкции к запросам для рассказчика и дал игроку возможность настраивать эти инструкции. Запросы к GPT-3 со стандартными инструкциями теперь выглядели так:
- Инструкция рассказчику: когда игрок умирает, напиши Game over. Если игрок попробует сделать что-то сверхъестественное, напиши, что он не может это совершить.
- Рассказчик: *стартовый сеттинг*
Игрок: *действие*
Рассказчик:
GPT-3 берет во внимание инструкции. Если игрок умирает, рассказчик выводит на экране надпись Game over, а если игрок пытается сделать что-то сверхъестественное, рассказчик отказывает ему. Игра распознает надпись Game over в диалоговом окне и заканчивает игру, но предлагает загрузить последнее сохранение.
Эти незначительные изменения сделали игру намного более увлекательной и заставили игрока тщательнее продумывать действия.
Попытка опубликовать игру в Steam
Разработка заняла у меня чуть больше трех месяцев. Уже в начале мая я отправил сборку Dreamio на рассмотрение в Steam. Меньше чем через неделю поддержка Steam спросила, имею ли я права на датасеты, на которых тренировались нейросети.
Я ответил, что имею права на использование этих нейросетей в соответствии с лицензионными соглашениями OpenAI и StabilityAI. Шесть недель спустя, в конце июня, поддержка прислала письмо с отказом. Причина — отсутствие прав на использование ассетов.
Не могу понять логику Valve, ведь в Steam уже есть игры, в которых используют ассеты, сгенерированные в нейросетях. Станет ли компания удалять уже выпущенные игры? Видимо, нет.
Большинство игр, релиз которых был отклонен вместе с моей, упоминали использование нейросетей на своей странице в магазине. А ведь есть разработчики, которые это скрывают. Интересно, собирается ли Valve отказывать в публикации их игр. В общем, в политике компании вижу нестыковки, а решение отказать мне считаю странным и недальновидным.
Итоги и планы
У Dreamio: AI-Powered Adventures до сих пор есть страница в Steam. Но сейчас игра доступна только на моем сайте. В нее можно сыграть бесплатно — для этого нужен аккаунт на Patreon.
Скоро я выложу исходный код игры в открытый доступ и займусь чем-нибудь другим. С тех пор как я начал создавать Dreamio, появились новые технологии, которые упрощают жизнь игровым разработчикам.
Думаю, с помощью Function calling API в ChatGPT со временем можно будет создавать улучшенных игровых NPC. Они будут взаимодействовать с окружением, а не просто вести себя как чат-боты с лицом. Да и процедурная генерация целых 3D-миров с помощью нейросетей, кажется, тоже не за горами.
В общем, идей у меня всегда много — на какой-то конкретной пока не остановился. Но ясно одно: с нейросетями я буду осторожнее. Наверное, вернусь к ним, только когда получу доступ к API безопасных для коммерческого использования нейросетей вроде Adobe Firefly или Llama 2.