
Инди-разработчик под ником 3DPyramid, не имеющий коммерческого опыта в геймдеве, но давно занимающийся созданием игр в свободное время, столкнулся с рутинной задачей: необходимость быстро добавить обводку к PNG-спрайтам. Проблема проявилась при работе с анимацией в Spine — деформация персонажа искажала заранее нарисованную обводку, а нативного инструмента для динамической обводки в редакторе не обнаружилось.
Проблема: деформация обводки при скелетной анимации
Как проявилась проблема
При использовании скелетной анимации в Spine обводка, нарисованная на исходных кадрах, деформируется вместе с мешем персонажа. Это приводит к визуальным артефактам: линия меняет толщину, ломается, теряет равномерность.
Поиск встроенного решения
Поиск решения в документации и сообществе Spine выдавал лишь обходные пути — дублирование слоёв, использование мешей-контуров, пост-эффекты через шейдеры. Ни один из вариантов не давал простого, предсказуемого результата без дополнительных затрат времени.
Обзор существующих подходов и их ограничений
Костыли внутри Spine
Пользователи прибегают к созданию отдельных мешей для обводки, настройке весов вершин, использованию скинов. Это требует глубокого понимания инструмента, увеличивает сложность проекта и не гарантирует идентичного вида обводки на всех кадрах.
Ручная правка в растровых редакторах
Экспорт кадров и обводка каждого в Photoshop или GIMP даёт контроль, но при десятках кадрах анимации превращается в часовую рутину. Для спрайтшитов с большим количеством кадров процесс становится нерациональным.
Шейдерная обводка в игровом движке
Написание outline-шейдера — базовый навык для программиста, однако значительная часть инди-разработчиков использует визуальное скриптинг или движки без доступа к шейдерам (Construct, GDevelop, ранние версии Godot без GDScript). Даже при наличии навыка шейдер не решает задачу, если нужна обводка только для части ассетов, или если требуется запечь обводку в текстуру для дальнейшего использования без рантаймовых затрат.
Принятие решения: требования к собственной утилите
Ключевые требования
Автор сформулировал минимальный набор функций, который закрывал бы потребность без излишеств:
- Настройка цвета, толщины и мягкости (размытия) обводки.
- Автоматическое расширение холста, если исходному изображению не хватает места для обводки.
- Пакетная обработка: возможность подать на вход папку с кадрами или спрайтшит и получить результат за один запуск.
- Работа с полупрозрачными пикселями — игнорирование или учёт альфа-канала при расчёте контура.
- Кроссплатформенность и отсутствие зависимостей от тяжелых фреймворков.
Принцип минимализма
Цель — утилита, которая запускается, выполняет задачу и не требует изучения интерфейса дольше пары минут.
Функционал Outliner: от простой обводки до эффекта тени
Режимы обводки
Реализованный прототип покрывает заявленные требования и добавляет несколько полезных режимов:
- Базовая обводка — равномерный контур заданного цвета и толщины вокруг непрозрачных пикселей.
- Мягкая обводка (размытие) — имитация внешнего свечения или тени через гауссово размытие контура.
- Режим тени — смещённый полупрозрачный контур, создающий эффект падающей тени без необходимости настраивать свет в движке.
Настройки и пакетная обработка
- Порог прозрачности — слайдер, позволяющий исключить из расчёта контура пиксели с альфой ниже заданного значения, что устраняет шум на краях сглаженных спрайтов.
- Авто-поля — автоматическое увеличение размера изображения на величину, достаточную для размещения обводки без обрезки.
- Пакетный режим — обработка всей директории с сохранением структуры имён файлов.
Интерфейс сводится к окну с перетаскиванием файлов, набором слайдеров и кнопкой запуска. Результат сохраняется рядом с исходниками или в указанную папку.
Публикация и дальнейшие планы
Каналы распространения
Утилита опубликована на личном сайте разработчика (3dpyramid.ru) и на платформе itch.io. Версия распространяется бесплатно как прототип.
Направления развития
Автор открыт к обратной связи: приоритеты доработки будут определяться запросами пользователей — поддержка спрайтшитов с метаданными, интеграция в пайплайны через CLI, расширение наборов пресетов обводки.
Рефлексия: от геймдева к разработке инструментов
Сравнение опыта разработки
Работа над Outliner принесла автору не меньшее удовлетворение, чем создание игр. В отличие от игровых проектов, где результат часто невидим до релиза, утилита сразу решает чью-то конкретную задачу.
Призыв к сообществу
Это сдвинуло фокус: вместо попыток «исправить Spine» или написать очередной движок, разработчик видит перспективу в создании небольших специализированных инструментов, закрывающих узкие боли инди-команд. Призыв к сообществу — попробовать Outliner в реальных задачах и поделиться мнением о нехватающем функционале.


