Процесс создания процедурной генерации тюбетейки для 2D PixelArt RPG игры на движке Unity заключается в разработке алгоритма, генерирующего различные варианты тюбетейки с уникальными текстурами.
Генерация формы
Алгоритм генерации формы тюбетейки основан на эллиптической кривой. Используемое уравнение (вид и способ использования описаны отдельно) проецируется на пространство 55×55 пикселей, обеспечивая необходимый уровень детализации в стиле PixelArt. Кривая плавно огибает пространство, имитируя форму головы, а столбцы пикселей рисуются по вычисленным значениям x и y. Попиксельная отрисовка столбцов обеспечивает характерный пиксельный вид. Функция генерации формы принимает на вход текстурные данные и возвращает карту высот.
<ul>
<li>Вычисление координаты y по уравнению для каждой координаты x.</li>
<li>Рисование столбца пикселей от вычисленного y вниз.</li>
<li>Интерполяция цветов для создания градиента от темного к светлому, имитирующего освещение.</li>
</ul>
Генерация текстуры
Генерация текстуры (узора) тюбетейки выполняется добавлением случайных линий. Линии рисуются слева направо, с случайным смещением вверх или вниз на 2 пикселя на каждом шаге. Это достигается использованием функции, выбирающей случайное значение из заданного набора.
<ul>
<li>Генерируется случайный цвет линии.</li>
<li>Выбирается случайная начальная точка на левом краю.</li>
<li>Линия рисуется, случайным образом смещаясь вверх или вниз на 2 пикселя на каждом шаге.</li>
</ul>
Для обеспечения повторяемости генерации используется детерминированный генератор случайных чисел (System.Random). Это позволяет хранить только номер тюбетейки, а не саму текстуру, экономя память.
Оптимизация
Процесс генерации включает обрезку текстуры по карте высот, удаляя пиксели за пределами формы тюбетейки. Карта высот представлена целочисленными значениями, что повышает точность. Исправлены ошибки в коде, например, использование типа int вместо float для высоты.
В проекте используются вспомогательные функции:
- RandomColor(): возвращает случайный цвет.
- GenerateColumns(): генерирует столбцы пикселей.
- Rotate(): поворачивает вектор (не используется в текущей реализации).
- Regenerate(): рекурсивно генерирует новые тюбетейки с заданным таймаутом.
Текущая реализация имеет ограничение: при движении персонажа вправо голова уменьшается, требуя генерации разных шапок для разных ракурсов. Планируется генерировать две текстуры: вид спереди и вид сбоку, или создать трёхмерную модель и проецировать её.
Настройки
В настройках текстуры установлены параметры filterMode = Point для предотвращения сглаживания пикселей и anisoLevel = 0 для отключения анизотропной фильтрации. Экспериментируя с коэффициентами уравнения, можно получать разные формы тюбетейки: более узкие, широкие, плоские или закругленные.
Разработанный алгоритм позволяет генерировать множество вариаций тюбетейки с уникальными текстурами. В дальнейшем планируется расширить функционал, добавив больше вариантов текстур, возможность использовать предварительно созданные шаблоны и реализовать генерацию тюбетейки для разных ракурсов.