Вот игра: https://games.zenkovich.space/TokenDelivery/

Вот код и ресурсы: https://github.com/o2-engine/o2-Template/pull/1

Дело в том, что я знатный велосипедостроитель! Я решил сделать игру не просто сам, но еще и полностью на своих инструментах:

Одно дело баловаться синтетическими тестами, другое дело - сделать игру! Хоть и не большую. Начнем с движка

o2 game engine

Article content
Редактор с запущенной игрой

Это мой десятилетний пет-проект, который вот вот стал более-менее пригодным чтобы наконец-то делать в нем игры. В нем есть все что нужно для мобильных и веб игр: 2D / 3D, редактор и сцена, UI, партиклы, анимации, скрыптинг, звуки и физика. Почти как Unity3D, но без существенного изьяна

Я хотел проверить две пункта:

  • можно ли на o2 делать нормально игры. Именно делать игры, а не постоянно допиливать движок, ибо то ту то там отваливается

  • применение ИИ в рамках движка, сможет ли он генерить код и ассеты под него, разобраться с функаионалом и тп

Первый пункт, пожалуй, удался. Доработки были, но скорее минорные и по ходу дела, никак меня не тормозили.

Второй пункт, на удивление, тоже удалcя - весь код для игры сгенерен ИИ. Конечно, не без моей помощи, однако ИИ вполне понимал как работать с движком.

Здесь во многом повлияло то, что в репозитории o2 рядом с иходниками лежит markdown документация, где описана архитектура движка, и описаны все подсистемы. Так же в правилах ИИ описано, что прежде чем изобретать какой-то велосипед, стоит уточнить в документации наличие аналога. Например, в одну из итераций над другой игрой, он решил анимации сделать через изинги в коде. Все работает, однако кастомный код хуже чем внутренний формат анимаций, где все эти изинги есть и еще и в редакторе можно докрутить.

Так же повлиял и размер самого o2: всего несколько мегабайт исходного кода. Да, это не много, я знаю о чем говорю, потому что на работе сходники нашей игры (мобильной к слову) весят 70мб.

Ну и конечно же сам Fable 5. Последние модели и правда заставляют задумываться, что я буду делать когда роботы заберут мою работу

Код

Внутри игры используется C++ вперемешку с JavaScript. Игра простая, вполне можно было бы обойтись JavaScript, но мне здесь было интересно проверить связку C++ и JS в своем движке.

Код написан с помощью Claude Fable 5, я его конечно же ревьюил, но руками не делал ничего.

Получилось это отчасти потому что юзал Fable 5, отчасти из-за покрытия тестов. Век тестов, я вам скажу! Раньше их не писали потому что лень, нет времени, из-за глупости... Но сейчас писать тесты - легче простого, грех не пользоваться

Итого вся игра (и движок впридачу) покрыты юнит тестами. Так же есть вкрапления интеграционных тестов на проверку механик: в движке есть функционал для снятия скриншотов, прокрутки кадров, кликов и тп - через тестовый драйвер, который ИИ может использовать для самопроверки.

Базовое правило в корне проекта: на все писать тесты и делать отчет

Это позволяет ИИ строго идти к выполнению задачи, вместо предположений и топтания на месте. В итоге это превращается скорее в работу гейм-дизайнера, где ты уже говоришь не что накодить, а что ты хочешь получить: "сделай небольшой баунс машинки после вопорота"

Далее ИИ идет сам по цепочке: кодить - тестировать - показать мне. Итого у меня скопилось более 50 скриншотов-отчетов о проделанной работе, по которым видно как "вырастает" игра

Генерация арта

Article content

С одним лишь кодом игру не сделаешь! Окей, можно, смотря на явление демосцены, поражаешься на что может быть способен просто код...

Ну да ладно, в моей игре арт не генерится в рантайме, а сгенерен заранее. Использовал нынче популярный ИИ для генерации изображений - Nano Banana 2. Относительно дешев, умеет понимать стилистику, и почти что контролируемый. Забегая вперед - контроль генерации изображений и был самой большой головной болью

И здесь можно разделить работу над артом на три части:

  • генерация концепта, интерфейса и базовых объектов

  • генерация карты, зданий и пропсов (лавочки, кусты и тп)

  • генерация звуков, музыка, видео

Основная проблема генерации арта для игры: следование общему стилю и соблюдение технических требований.

Вы можете попросить ИИ сгенерировать иконку, кнопку, домик и все что нужно для игры - и он все сгенерирует. Но если вы попробуете собрать из этого игру или интерфейс... оно мягко говоря не будет подходить друг к другу. Каждый раз для ИИ это будет с чистого листа, и он сделает как посчитает нужным, а не как вы себе представляете

С этой идеей я сделал свою небольшую тулзу, где с помощью нод можно собирать пайплайны генерации арта, который будет наследовать стиль и описание, а так же заточен под игры - делать прозрачный фон, вырезать спрайты и тп

Вот пример пайплайнов для генерации арта в игру хакатона,

https://assetsline.zenkovich.space/#/s/FkxYrwbE-EIam4-tVhR7R6V6UnyvkAuGl5WuOAYdr_U?p=the%20loop

Как это работает:

  • сначала пользователем задается описание и сеттинг игры, с помощью текстовых нод

  • из этого генерируется концепт игры (или можно вставить свой)

  • из концепта генерятся экраны игры, объекты и так далее. Все они получают референс в виде самого концепта, поэтому все производные контролируемо наследуют стиль концепта

  • из концепта, экранов UI, заготовок игровых карт можно извлекать отдельные объекты. Например, спрайты UI - иконки, плашки, кнопки. Из концептов игровой карты объекты, тайлы земли и так далее

  • эти части можно "доработать" до нужного состояния, описав правки или даже нарисовав от руки какой-то пример

  • готовые спрайты сохранить в файлы для интеграции в движок

Если приглядеться к скриншоту выше, там так и сделано: слева сгенерирован концепт игры. Сверху извлечены элементы интерфейса HUD: иконка валюты, настройки, прогресс-бар топлива. Снизу извлечена машинка игрока, из нее сгенерено несколько других машинок для траффика.

Но не весь арт получилось сгенерить в этой тулзе, домики и тайлы карты пришлось генерировать с помощью скриптов

Скрипты-генераторы для зданий и пропсов

Article content

Проблема в том, что карта города в игре изометрическая, что накладывает жесткие ограничения на арт для игры:

  • все объекты карты должны располагаться четко по сетке

  • должны быть соблюдены углы изометрии

И здесь очередная проблема предсказуемости генератора арта. Да, домики с концепта извлекались весьма бодро, но у всех них плыли либо наклон, либо перспектива, либо вообще все сразу. Попытки собрать из этого "город" были просто ужасны - все криво, косо и вразнобой

Пришлось делать еще более детерминированный пайплайн генерации арта, с помощью скриптов.

Картинки зданий и пропсов все так же генерировались nano banana 2, однако до и после генерации были шаги, добавляющие предсказуемости результату:

  • Генерация концептов зданий и пропсов с помощью лайн-арта, сгенеренного скриптом. Здесь скрипт готовит супер-простые изображения зданий с четкими параметрами изометрии и размерами сетки. Они в примерах на скриншоте сверху, серые домики с простыми окнами и красным основанием

  • этот лайн-арт, концепт и довольно жесткие промты подавались на генерацию nano banana 2

  • полученный результат анализировался скриптом и отправлялся на доп правки через генерацию ИИ. Под сгенеренное здание подкладывался лайн-арт, и жесткий промт - исправить ошибки соответствия параметрам изометрии, убрав его остатки

  • исправленный вариант проходил валидацию скриптом, если изображение содержало пиксели явно не там где они могли быть - результат отбраковывался и отправлялся на перегенерацию

  • последний этап - валидация человеком. Подготовленные отчеты я просматривал сам, и указывал какие варианты удачные, а какие генерировать заново

конечный этап приемки - часть получилось кривой
конечный этап приемки - часть получилось кривой

Тайлы дороги

Отдельного внимания заслуживают тайлы дороги, т.к. в них требуется максимальная точность арта, ведь они должны идеально стыковаться друг с другом

У меня было много итераций и попыток сгенерировать готовый тайлсет. Было много правдоподобных вариантов, но они не стыковались и отличались по стилю от концепта. Либо вылезали артефакты разметки дороги и другие мелочи

Здесь выход был такой же, как с домиками - генерация поверх лайн-арта. Но здесь даже пришлось идти еще дальше:

Article content
лайн-арт для тайлов дороги
  • генерировать тайлы дороги в векторном виде в 2D

  • переводить в изометрию

  • накладывать текстуры дороги, бардюров и разметку программно

  • прогонять итоговый тайлсет через nano banana 2 с промтом "улучши, но соблюдай границы"

Получилось хорошо, и попадало в стиль. А самое главное - я получил хорошие стыка тайлов дороги при генерации города.

Генерация города

Город Трумана
Город Трумана

Здесь финально все генерируется в коде, с простыми правилами и весами у зданий и объектов. Какой-то архитектурной идеи тут нет, и если присматриваться можно найти кучу абсурда. На хакатоне время ограничено, поэтому вот так. Хотя, безусловно, генерацию можно довести.

Интересный момент тут был с попыткой генерировать целые кварталы через nano banana 2. Идея простая - вместо того чтобы составлять кварталы из объектов в коде, можно вставлять целые кварталы, сгенеренные ИИ: они получались гораздо интереснее и продуманнее, без абсурдных расположений зданий и объектов. Лавочки органично стояли в небольших скверах, ларьки не зажаты между 2мя зданиями и вообще много мелких прикольных деталей.

Но довести не получилось, ведь даже супер-детерменированный пайплайн все равно давал отсилы 5% хороших генераций, и идею пришлось отбросить. Плыло все: тени, изометрия, квартал мог спонтанно вырасти вверх потому что пешеходная дорожка логично бы там продолжалась... в общем, довольно бесполезно

Звуки и музыка

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

Бонус - видео-анимации

Еще прикольная штука - вставка видео в игру, вместо анимаций. Идея далеко не новая, просто раньше запихивать видео в мобильные игры считалось слишком тяжелым. Сейчас уже можно позволить себе на современных девайсах. А анимацию сделать - пол минуты

Работает просто: видео генерируется с хромокеем, который отрезается шейдером в игре на девайсе. Сверху не самый удачный цвет хромакея выбран, вокруг синего чипа видны артефакты. Но сделано все буквально за 10 минут, что на мой взгял отлично для игры

Что-то вроде выводов

Хорошо это или плохо, что игра сгенерена с помощью ИИ? Кто-то скажет "нейрослоп!" и отчасти будет прав, нас ждут наводнения беспросветно тупых игр, склепанных за один день.

Однако я тут вижду и массу плюсов. Во-первых, для себя - я могу делать игры, не имея дорогузей команды художников, тестировщиков и программистов. Я могу реализовывать свои идеи

Во-вторых, так как порог сложности выпуска игры снижается, конкуренция выйдет в плоскость интереса самой игры и геймплея. То есть будут побеждать в игре на выживание не просто те, кто способен сделать игру, а самые интересные идеи с точки зрения задумки и геймплея. Думаю это однозначно приведет нас к очередным шедеврам


Больше о разработки игры, движка и околотехнического, в моем менее формальном телеграм канале: https://t.me/o2engine

Комментарии (2)


  1. ImSheff
    03.08.2026 06:17

    Материал огонь, сохраню себе , мне есть что подчерпнуть, загорелся попробовать тоже что-то простенькое сделать)


    1. anz Автор
      03.08.2026 06:17

      спасибо!