Привет, Хабр. Я — Андрей Макар-Уваров, Head of Frontend в Surf. Недавно решил проверить одну гипотезу: насколько далеко можно уехать на ИИ в разработке, если взять задачу, в которой ты абсолютный ноль.

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

Менюшка игры
Менюшка игры

Что использовал в работе:

  • модель — Grok;

  • движок — Godot;

  • текстуры — через fal.ai.

Сначала всё выглядело легко: за вечер нагенерировал логику, интерфейс, лабиринт. Казалось, что дальше я просто диктую идеи, а код появляется сам. Но эйфория быстро закончилась, когда увидел, что получилось.

Мы в Surf пишем о таких экспериментах с ИИ в отдельном Телеграмм-канале «Директорат Surf обсуждает». Показываем опыт в разработке, тестировании и проектировании мобильных продуктов — приходите читать.

1-й этап: если всё идёт хорошо, значит, что-то идёт не так

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

Через несколько часов я понял, что проблема не в модели, а я просто не понимаю GDScript. Когда работаешь с незнакомым стеком, становится почти невозможно отличить, это баг кода или галлюцинация нейросети.

В итоге мне это надоело и я просто переписал проект на C#. Godot его поддерживает, а знакомый синтаксис резко снижает уровень хаоса. 

2-й этап: кастинг ИИ-моделей

Я попробовал несколько вариантов моделей: Minimax, Codex, DeepSeek, GLM. У каждой свои особенности:

  • GLM мог зависнуть прямо посреди ответа.

  • Minimax и Codex воспроизводили одни и те же баги.

  • DeepSeek иногда не столько решал задачу, сколько морально поддерживал.

Лучше всех в итоге показал себя Kimi. С ним я сгенерировал котика, это было легко. А вот сгенерировать того же котика в разных ракурсах и с тем же стилем оказалось сильно сложнее. Модель просто не понимала этого. Плюс fal.ai упорно не хотел рисовать на прозрачном фоне. Пришлось написать небольшой Python-скрипт, который вырезает фон и делает его прозрачным.

В итоге игра заработала как я и хотел: котик с фонарём и собачка — всё светится и выглядит довольно уютно.

Первая версия игры
Первая версия игры

На этом этапе я базово собрал игру. Но впереди меня ждал

3-й этап: АНИМАЦИЯ!

Пишу это слово капсом и с восклицательным знаком, потому что именно так я к ней подходил. Я был уверен, что если современные нейросети могут вставить Люка Скайвокера в «Властелин колец» и устроить битву каннибалов-качков, то заставить котика махать лапкой — это задача на 15 минут. Спойлер: нет. 

Здесь у меня было два плана к разработке.

План А: сейчас быстренько сделаем спрайты

Мой бэкграунд — веб-фронтенд. До этого проекта с игрой я про анимацию знал ровно одно: нужно сделать спрайт-лист. Это такая картинка, на которой последовательно расположены кадры анимации. Персонаж как бы двигается, если быстро показывать эти кадры по очереди.

Логика была простая: 5 кадров «котик идёт направо», 5 кадров «котик идёт налево».

Примерно так мне представлялась анимация, которую я визуализировал в ИИ.
Примерно так мне представлялась анимация, которую я визуализировал в ИИ.

Но здесь оказалась важна консистентность. Для большинства моделей, даже самых топовых, пять кадров — это пять независимых вселенных. Да, есть reference image. Есть каскадная генерация и ползунки «похожести», выкрученные на максимум. Но в каком-то из кадров фонарь обязательно превращается в банан, у котика отрастает шляпа или он вдруг становится полосатым, хотя до этого был рыжим.

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

Мои выводы: почему AI хорошо рисует объект, но плохо передаёт движение

Я понял, что сгенерировать один удачный кадр и сгенерировать серию кадров — задачи разного уровня сложности:

  1. Когда мы просим модель нарисовать котика с фонарём в определённом стиле, она решает задачу создания одного образа.

  2. Когда мы просим её показать, как этот же котик движется, оставаясь тем же самым в каждом кадре, задача становится другой. Здесь уже важно удерживать идентичность персонажа во времени: движение лапок, смену силуэта, удержание пропорций от кадра к кадру.

На практике это намного сложнее, чем генерация одного изображения.

План Б: смотрим видюшки на YouTube

После нескольких неудачных попыток я решил посмотреть, как вообще делают анимацию для инди-игр с ИИ в 2024–2026 годах.

Вариантов оказалось два:

  1. Видео → спрайты
    Сгенерировать 1–2 секунды видео, а потом вытащить из него кадры.

  2. Blender
    Собрать 3D-модель, сделать риг, анимировать и потом рендерить в 2D.

С Blender я никогда не работал, поэтому выбрал первый путь. И здесь был первый хороший результат: видео-модели Runway, Pika и их аналоги действительно дают консистентность движения. Котик шагает плавно, фонарь не скачет между кадрами, персонаж остаётся узнаваемым. На фоне прошлых попыток это выглядело как научный прорыв.

Но дальше возникла другая проблема. У них нет LoRA — кто не знает, это понимание системой стилистики. Например, можно задать такой промпт: «рисуй в стиле Васнецова, но с налётом советской мультипликации». Без LoRA модель выдаёт 3D-видео в стиле китайских маньхуа-адаптаций — слишком глянцевый и пластиковый.

Изначально у меня были хорошие статичные персонажи. После Blender мои акварельные котики превратились в пластилиновых смурфиков. Я потратил ещё вечер на попытки добиться нужного стиля через negative prompts и хитрые сиды — бесполезно.

Мои котики-смурфики
Мои котики-смурфики

План В: скелетная анимация

Решил попробовать встроенную в Godot 2D skeletal animation.

  1. Берём одну статичную картинку.

  2. Разрезаем персонажа на части: голова, тело, лапы, хвост.

  3. Собираем из этого скелет.

  4. Двигаем костями и получаем анимацию.

Главный плюс этого подхода — визуальная консистентность. Персонаж остаётся тем же самым. Не меняется стиль, нет случайных деталей. Для игры это очень сильный вариант.

Но и здесь был нюанс. Чтобы это работало, нужно разрезать спрайт на части (голова, тело, лапы), правильно расставить pivot points, связать костями в редакторе Godot и настроить инверсную кинематику.

То есть это уже не задача про код. Это задача про ручную работу в интерфейсе и базовое понимание анимации.

Я открыл редактор Godot, посмотрел на ноды, mesh’и, кости, веса и привязки — и понял, что снова ничего не понимаю. Например, почему при движении одной части тела деформируется другая; как правильно настроить скелет; как добиться естественного движения.

Что в итоге получилось

После всех этапов у меня остались статичные спрайты: рыжий котик с фонарём, белый зайчик, пес с умными глазами. Они выглядят миленько: рисованные, с акварельной текстурой. Но, увы, не двигаются как надо. Скользят по лабиринту, как фигурки на доске, а не бродят по нему.

Котик не видит препятствий и скользит по лабиринту.
Котик не видит препятствий и скользит по лабиринту.

Итог: игра всё равно работает. Механика передачи света считывается и без анимации. Атмосфера держится на освещении, темноте, звуке и общем ощущении пространства, а не только на движении персонажа. Отсутствие анимации не разрушило продукт, просто не позволило довести его до более полированного состояния.

Что здесь важно для разработчиков и лидов не только в геймдеве

Сформулировал основные выводы для себя как для разработчика и лида.

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

  2. AI плохо заменяет навык там, где нужны насмотренность и ручная работа. Анимация — это не просто последовательность кадров, а отдельное ремесло. То же касается визуального полиша, motion design, иллюстрации, 3D и других областей, где важны практика и чувство формы.

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

Что буду делать дальше

На следующий заход у меня есть три варианта:

  • взять Blender и разобраться глубже;

  • отдать анимацию специалисту;

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

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

Больше инсайтов от лидов в разработке читайте в нашем Телеграмм-канале «Директорат Surf обсуждает». Делимся размышлениями и практическими лайфхаками без воды и нытья.