Вот игра: 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
ImSheff
Материал огонь, сохраню себе , мне есть что подчерпнуть, загорелся попробовать тоже что-то простенькое сделать)
anz Автор
спасибо!