Дневник разработки №2, Harmonis: the hand-made kingdoms

Дневник разработки №2, Harmonis: the hand-made kingdoms

Прошло чуть больше двух недель с прошлого поста, самое время для нового поста! :>

Итак, начнем с главного — игра теперь выглядит вот так:

Алгоритм генерации сетки

Стал остро вопрос оптимизации из-за явных статеров при создании уровня. Не очень большие, всего в несколько секунд, но при этом их точно не должно быть.

Логика на блюпринтах, в них вскрылся неприятный момент — асинхронных операция по умолчанию как-бы и нет (совсем нет), и все делается в одном потоке. Есть варианты, которые позволят это немного поправить, вроде таких, но об этом я узнал немного позже нужного, да и глубоко не копал как именно имплементирован асинхронных операции в подобных плагинах.

Но об этом я узнал чуть позже, а первая мысль у меня была — пора переписывать алгоритм генерации сетки. В чем суть.

Изначально я взялся за UE5 сходу, изучая что и как работает на ходу — есть задача пытаюсь решить знакомыми способами, — а спустя время уже, если нужно, переделаю. И тут получилось также.

Первый вариант генерации сетки работал так: берется родительский элемент, и в нем уже обрабатывается вся логика на основе огромной матрицы: создается двумерный массив NxM, каждое значение заполняется инстансом дочернего элемента (шестигранника) и локальный указывается поворот и смещение в рамках всех элементов.

Из гугла, вот так выглядит матрица. 
Из гугла, вот так выглядит матрица. 
Старое видно, видно что при наведении мыши на пустое пространство появляется тайл.

Сделать было достаточно легко, но из минусов — (очень) большой оверхед по данным, да и тайтлы для взаимодействия друг с другом должны сначала обращаться к родительскому элементу, а тот уже по матрице ищет соседей нужного элемента. Неудобно.

Как решить проблему?

  1. На ходу увеличивать матрицу по мере необходимости. Изначально NxM, потом N^2xM^2 и так далее. Но остается проблема с неудобным взаимодействием тайлов друг с другом.
  2. Не заполнять ячейки матрицы, если ячейка не является соседом заполненной клетки. Все также есть проблема с неудобным взаимодействием тайлов.
  3. Переделать все на с матрицы на граф. Идеально!
Граф
Граф

В случае графа — мы имеем столько элементов, сколько нужно. Каждый элемент знает только о соседях, и мы можем без лишней мороки обращаться к соседям напрямую — к примеру, узнать есть ли там кто, а если есть — то что находится на соприкасающейся с нами стороне соседа: домики, леса, поля и так далее.

Демонстрируем работу проверки и создания соседей. Красный луч — это проверка есть ли кто-то рядом. 

Но как узнать есть ли рядом? Оу, да мы же в 3D!

Просто берем и направляем по короткому лучу в каждую из сторон шестигранника (заранее настроив коллизии объектов, чтобы случайно не наткнуться что-то лишнее) — если наталкиваемся на соседа, то записываем его себе в список соседей, и также заносим себя в базу соседа.

А если луч ничего не ходит — просим основной, родительский элемент, создать новый пустой тайл по соседству.

По итогу статтеры пропали, и мое сердце на время стало спокойным.

Система типов и биомов

Ввел Полноценную систему типов и биомов. В целом, ничгео сложного, но в какой-то момент я обнаружил для себя что в блюпринтах есть полноценная система e-num'ом, чему был безумно рад — на ее основе я сразу сделал возможность назначить и переключить режимы «биомов» (пока что есть только снежный и летний) и категорий шестигранников.

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

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

Пример переключателя биома внутри тайла. 
Пример переключателя биома внутри тайла. 

Внешний вид

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

Лбновил шейдер снега — смог заставить работать его в рантайме, а не только «либо есть везде, либо нет», но пока он, сам по себе, выглядит не очень и нужно дорабатывать :)

Стим

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

Постер сгенерировал через stable diffusion, а дальше доработал в фотошопе.
Постер сгенерировал через stable diffusion, а дальше доработал в фотошопе.
 :)
 :)

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

Добавляйте в желаемое, если вам нравится :)

20
6 комментариев