Генерация тюбетейки в Unity: Pixel Art RPG

Процесс создания процедурной генерации тюбетейки для 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 для отключения анизотропной фильтрации. Экспериментируя с коэффициентами уравнения, можно получать разные формы тюбетейки: более узкие, широкие, плоские или закругленные.

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

Что будем искать? Например,программа