Вот игра: https://games.zenkovich.space/TokenDelivery/
Вот код и ресурсы: https://github.com/o2-engine/o2-Template/pull/1
Дело в том, что я знатный велосипедостроитель! Я решил сделать игру не просто сам, но еще и полностью на своих инструментах:
-
игровой движок o2 — https://github.com/o2-engine/o2
-
нодовая ассето-генерилка онлайн — https://assetsline.zenkovich.space/
Одно дело баловаться синтетическими тестами, другое дело — сделать игру! Хоть и не большую. Начнем с движка
o2 game engine
Это мой десятилетний пет-проект, который вот вот стал более-менее пригодным чтобы наконец-то делать в нем игры. В нем есть все что нужно для мобильных и веб игр: 2D / 3D, редактор и сцена, UI, партиклы, анимации, скрыптинг, звуки и физика. Почти как Unity3D, но без существенного изьяна
Я хотел проверить две пункта:
-
можно ли на o2 делать нормально игры. Именно делать игры, а не постоянно допиливать движок, ибо то ту то там отваливается
-
применение ИИ в рамках движка, сможет ли он генерить код и ассеты под него, разобраться с функаионалом и тп
Первый пункт, пожалуй, удался. Доработки были, но скорее минорные и по ходу дела, никак меня не тормозили.
Второй пункт, на удивление, тоже удалcя — весь код для игры сгенерен ИИ. Конечно, не без моей помощи, однако ИИ вполне понимал как работать с движком.
Здесь во многом повлияло то, что в репозитории o2 рядом с иходниками лежит markdown документация, где описана архитектура движка, и описаны все подсистемы. Так же в правилах ИИ описано, что прежде чем изобретать какой-то велосипед, стоит уточнить в документации наличие аналога. Например, в одну из итераций над другой игрой, он решил анимации сделать через изинги в коде. Все работает, однако кастомный код хуже чем внутренний формат анимаций, где все эти изинги есть и еще и в редакторе можно докрутить.
Так же повлиял и размер самого o2: всего несколько мегабайт исходного кода. Да, это не много, я знаю о чем говорю, потому что на работе сходники нашей игры (мобильной к слову) весят 70мб.
Ну и конечно же сам Fable 5. Последние модели и правда заставляют задумываться, что я буду делать когда роботы заберут мою работу
Код
Внутри игры используется C++ вперемешку с JavaScript. Игра простая, вполне можно было бы обойтись JavaScript, но мне здесь было интересно проверить связку C++ и JS в своем движке.
Код написан с помощью Claude Fable 5, я его конечно же ревьюил, но руками не делал ничего.
Получилось это отчасти потому что юзал Fable 5, отчасти из-за покрытия тестов. Век тестов, я вам скажу! Раньше их не писали потому что лень, нет времени, из-за глупости… Но сейчас писать тесты — легче простого, грех не пользоваться
Итого вся игра (и движок впридачу) покрыты юнит тестами. Так же есть вкрапления интеграционных тестов на проверку механик: в движке есть функционал для снятия скриншотов, прокрутки кадров, кликов и тп — через тестовый драйвер, который ИИ может использовать для самопроверки.
Базовое правило в корне проекта: на все писать тесты и делать отчет
Это позволяет ИИ строго идти к выполнению задачи, вместо предположений и топтания на месте. В итоге это превращается скорее в работу гейм-дизайнера, где ты уже говоришь не что накодить, а что ты хочешь получить: «сделай небольшой баунс машинки после вопорота»
Далее ИИ идет сам по цепочке: кодить — тестировать — показать мне. Итого у меня скопилось более 50 скриншотов-отчетов о проделанной работе, по которым видно как «вырастает» игра
Генерация арта

С одним лишь кодом игру не сделаешь! Окей, можно, смотря на явление демосцены, поражаешься на что может быть способен просто код…
Ну да ладно, в моей игре арт не генерится в рантайме, а сгенерен заранее. Использовал нынче популярный ИИ для генерации изображений — Nano Banana 2. Относительно дешев, умеет понимать стилистику, и почти что контролируемый. Забегая вперед — контроль генерации изображений и был самой большой головной болью
И здесь можно разделить работу над артом на три части:
-
генерация концепта, интерфейса и базовых объектов
-
генерация карты, зданий и пропсов (лавочки, кусты и тп)
-
генерация звуков, музыка, видео
Основная проблема генерации арта для игры: следование общему стилю и соблюдение технических требований.
Вы можете попросить ИИ сгенерировать иконку, кнопку, домик и все что нужно для игры — и он все сгенерирует. Но если вы попробуете собрать из этого игру или интерфейс… оно мягко говоря не будет подходить друг к другу. Каждый раз для ИИ это будет с чистого листа, и он сделает как посчитает нужным, а не как вы себе представляете
С этой идеей я сделал свою небольшую тулзу, где с помощью нод можно собирать пайплайны генерации арта, который будет наследовать стиль и описание, а так же заточен под игры — делать прозрачный фон, вырезать спрайты и тп
Вот пример пайплайнов для генерации арта в игру хакатона,
https://assetsline.zenkovich.space/#/s/FkxYrwbE-EIam4-tVhR7R6V6UnyvkAuGl5WuOAYdr_U?p=the%20loop
Как это работает:
-
сначала пользователем задается описание и сеттинг игры, с помощью текстовых нод
-
из этого генерируется концепт игры (или можно вставить свой)
-
из концепта генерятся экраны игры, объекты и так далее. Все они получают референс в виде самого концепта, поэтому все производные контролируемо наследуют стиль концепта
-
из концепта, экранов UI, заготовок игровых карт можно извлекать отдельные объекты. Например, спрайты UI — иконки, плашки, кнопки. Из концептов игровой карты объекты, тайлы земли и так далее
-
эти части можно «доработать» до нужного состояния, описав правки или даже нарисовав от руки какой-то пример
-
готовые спрайты сохранить в файлы для интеграции в движок
Если приглядеться к скриншоту выше, там так и сделано: слева сгенерирован концепт игры. Сверху извлечены элементы интерфейса HUD: иконка валюты, настройки, прогресс-бар топлива. Снизу извлечена машинка игрока, из нее сгенерено несколько других машинок для траффика.
Но не весь арт получилось сгенерить в этой тулзе, домики и тайлы карты пришлось генерировать с помощью скриптов
Скрипты-генераторы для зданий и пропсов

Проблема в том, что карта города в игре изометрическая, что накладывает жесткие ограничения на арт для игры:
-
все объекты карты должны располагаться четко по сетке
-
должны быть соблюдены углы изометрии
И здесь очередная проблема предсказуемости генератора арта. Да, домики с концепта извлекались весьма бодро, но у всех них плыли либо наклон, либо перспектива, либо вообще все сразу. Попытки собрать из этого «город» были просто ужасны — все криво, косо и вразнобой
Пришлось делать еще более детерминированный пайплайн генерации арта, с помощью скриптов.
Картинки зданий и пропсов все так же генерировались nano banana 2, однако до и после генерации были шаги, добавляющие предсказуемости результату:
-
Генерация концептов зданий и пропсов с помощью лайн-арта, сгенеренного скриптом. Здесь скрипт готовит супер-простые изображения зданий с четкими параметрами изометрии и размерами сетки. Они в примерах на скриншоте сверху, серые домики с простыми окнами и красным основанием
-
этот лайн-арт, концепт и довольно жесткие промты подавались на генерацию nano banana 2
-
полученный результат анализировался скриптом и отправлялся на доп правки через генерацию ИИ. Под сгенеренное здание подкладывался лайн-арт, и жесткий промт — исправить ошибки соответствия параметрам изометрии, убрав его остатки
-
исправленный вариант проходил валидацию скриптом, если изображение содержало пиксели явно не там где они могли быть — результат отбраковывался и отправлялся на перегенерацию
-
последний этап — валидация человеком. Подготовленные отчеты я просматривал сам, и указывал какие варианты удачные, а какие генерировать заново
Тайлы дороги
Отдельного внимания заслуживают тайлы дороги, т.к. в них требуется максимальная точность арта, ведь они должны идеально стыковаться друг с другом
У меня было много итераций и попыток сгенерировать готовый тайлсет. Было много правдоподобных вариантов, но они не стыковались и отличались по стилю от концепта. Либо вылезали артефакты разметки дороги и другие мелочи
Здесь выход был такой же, как с домиками — генерация поверх лайн-арта. Но здесь даже пришлось идти еще дальше:
-
генерировать тайлы дороги в векторном виде в 2D
-
переводить в изометрию
-
накладывать текстуры дороги, бардюров и разметку программно
-
прогонять итоговый тайлсет через nano banana 2 с промтом «улучши, но соблюдай границы»
Получилось хорошо, и попадало в стиль. А самое главное — я получил хорошие стыка тайлов дороги при генерации города.
Генерация города
Здесь финально все генерируется в коде, с простыми правилами и весами у зданий и объектов. Какой-то архитектурной идеи тут нет, и если присматриваться можно найти кучу абсурда. На хакатоне время ограничено, поэтому вот так. Хотя, безусловно, генерацию можно довести.
Интересный момент тут был с попыткой генерировать целые кварталы через nano banana 2. Идея простая — вместо того чтобы составлять кварталы из объектов в коде, можно вставлять целые кварталы, сгенеренные ИИ: они получались гораздо интереснее и продуманнее, без абсурдных расположений зданий и объектов. Лавочки органично стояли в небольших скверах, ларьки не зажаты между 2мя зданиями и вообще много мелких прикольных деталей.
Но довести не получилось, ведь даже супер-детерменированный пайплайн все равно давал отсилы 5% хороших генераций, и идею пришлось отбросить. Плыло все: тени, изометрия, квартал мог спонтанно вырасти вверх потому что пешеходная дорожка логично бы там продолжалась… в общем, довольно бесполезно
Звуки и музыка

Тут все просто, подключен ElevenLabs к нодовой тулзе генерации, и все звуки с фоновой музыкой сгенерированы через него. Немного стоит приловчиться к заданию промта и параметров, но в итоге получается супер-просто
Бонус — видео-анимации

Еще прикольная штука — вставка видео в игру, вместо анимаций. Идея далеко не новая, просто раньше запихивать видео в мобильные игры считалось слишком тяжелым. Сейчас уже можно позволить себе на современных девайсах. А анимацию сделать — пол минуты
Работает просто: видео генерируется с хромокеем, который отрезается шейдером в игре на девайсе. Сверху не самый удачный цвет хромакея выбран, вокруг синего чипа видны артефакты. Но сделано все буквально за 10 минут, что на мой взгял отлично для игры
Что-то вроде выводов
Хорошо это или плохо, что игра сгенерена с помощью ИИ? Кто-то скажет «нейрослоп!» и отчасти будет прав, нас ждут наводнения беспросветно тупых игр, склепанных за один день.
Однако я тут вижду и массу плюсов. Во-первых, для себя — я могу делать игры, не имея дорогузей команды художников, тестировщиков и программистов. Я могу реализовывать свои идеи
Во-вторых, так как порог сложности выпуска игры снижается, конкуренция выйдет в плоскость интереса самой игры и геймплея. То есть будут побеждать в игре на выживание не просто те, кто способен сделать игру, а самые интересные идеи с точки зрения задумки и геймплея. Думаю это однозначно приведет нас к очередным шедеврам
Больше о разработки игры, движка и околотехнического, в моем менее формальном телеграм канале: https://t.me/o2engine
ссылка на оригинал статьи https://habr.com/ru/articles/1065796/