Дневник разработки №2, Harmonis: the hand-made kingdoms
Прошло чуть больше двух недель с прошлого поста, самое время для нового поста! :>
Итак, начнем с главного — игра теперь выглядит вот так:
Алгоритм генерации сетки
Стал остро вопрос оптимизации из-за явных статеров при создании уровня. Не очень большие, всего в несколько секунд, но при этом их точно не должно быть.
Логика на блюпринтах, в них вскрылся неприятный момент — асинхронных операция по умолчанию как-бы и нет (совсем нет), и все делается в одном потоке. Есть варианты, которые позволят это немного поправить, вроде таких, но об этом я узнал немного позже нужного, да и глубоко не копал как именно имплементирован асинхронных операции в подобных плагинах.
Но об этом я узнал чуть позже, а первая мысль у меня была — пора переписывать алгоритм генерации сетки. В чем суть.
Изначально я взялся за UE5 сходу, изучая что и как работает на ходу — есть задача пытаюсь решить знакомыми способами, — а спустя время уже, если нужно, переделаю. И тут получилось также.
Первый вариант генерации сетки работал так: берется родительский элемент, и в нем уже обрабатывается вся логика на основе огромной матрицы: создается двумерный массив NxM, каждое значение заполняется инстансом дочернего элемента (шестигранника) и локальный указывается поворот и смещение в рамках всех элементов.
Сделать было достаточно легко, но из минусов — (очень) большой оверхед по данным, да и тайтлы для взаимодействия друг с другом должны сначала обращаться к родительскому элементу, а тот уже по матрице ищет соседей нужного элемента. Неудобно.
Как решить проблему?
- На ходу увеличивать матрицу по мере необходимости. Изначально NxM, потом N^2xM^2 и так далее. Но остается проблема с неудобным взаимодействием тайлов друг с другом.
- Не заполнять ячейки матрицы, если ячейка не является соседом заполненной клетки. Все также есть проблема с неудобным взаимодействием тайлов.
- Переделать все на с матрицы на граф. Идеально!
В случае графа — мы имеем столько элементов, сколько нужно. Каждый элемент знает только о соседях, и мы можем без лишней мороки обращаться к соседям напрямую — к примеру, узнать есть ли там кто, а если есть — то что находится на соприкасающейся с нами стороне соседа: домики, леса, поля и так далее.
Но как узнать есть ли рядом? Оу, да мы же в 3D!
Просто берем и направляем по короткому лучу в каждую из сторон шестигранника (заранее настроив коллизии объектов, чтобы случайно не наткнуться что-то лишнее) — если наталкиваемся на соседа, то записываем его себе в список соседей, и также заносим себя в базу соседа.
А если луч ничего не ходит — просим основной, родительский элемент, создать новый пустой тайл по соседству.
По итогу статтеры пропали, и мое сердце на время стало спокойным.
Система типов и биомов
Ввел Полноценную систему типов и биомов. В целом, ничгео сложного, но в какой-то момент я обнаружил для себя что в блюпринтах есть полноценная система e-num'ом, чему был безумно рад — на ее основе я сразу сделал возможность назначить и переключить режимы «биомов» (пока что есть только снежный и летний) и категорий шестигранников.
У каждого шестигранника есть содержимое в виде набора «сцен». Сцена может занимать от одной до шести сторон шестигранника. Соответственную в случайном виде набирается набор сценок которые суммарно занимают все шесть сторон, и уже после из них собирается сам тайл.
Категории — описание сценки. Городские домики, леса, поля и так далее. Основная геймплея как раз в том, что пользователю нужно наличным способом сочетать стороны шестигранников друг с другом и набирать очки.
Внешний вид
Потихоньку продолжил дорабатывать и добавлять модельки и сцены, сделал анимацию мельниц и случайную генерации цвета крыш у домиков.
Лбновил шейдер снега — смог заставить работать его в рантайме, а не только «либо есть везде, либо нет», но пока он, сам по себе, выглядит не очень и нужно дорабатывать :)
Стим
Обновил постеры, да и разнообразил саму страничку, чтобы она выглядела не так... убого. Попозже хочу добавить трейлер, но пока сама игра выглядит еще слишком сыро для такого.
В следующие недели планирую визуально доработать геймплей — анимации добавление нового шестигранника, подсвечивание стыкующихся граней, звуки, работа над моделям и сценами. А после уже будет время для системы заданий и попыток создания сложных систем, вроде рельс или рек и озер.
Добавляйте в желаемое, если вам нравится :)