Данная работа является генератором подземелий в трехмерном пространстве. Основной особенностью генератора является использование маркеров, расставленных в пространстве и использующихся при создании комнат и коридоров. Генерация подразумевает следующие этапы: ручная расстановка маркеров, генерация комнат, триангуляция связей на основе центров комнат, выбор подгафа при помощи генетического алгоритма и построение путей алгоритмом А*.
Проект является частью магистерской выпускной квалификационной работы по образовательной программе "Технологии разработки компьютерных игр" Школы разработки видеоигр Университета ИТМО. Вся работа написана на языке C# в игровом движке UNITY.
Скриншот ниже представляет пример результата работы генератора. Для примера использовалось подземелье с шириной и глубиной в 30 ячеек, а высотой в 10 ячеек, что дает суммарный объем в 9.000 ячеек. Также, вручную были размещены пять изначальных комнат – входа, выхода, босса, комната с ключом и, соответствующая ей, закрытая комната. Была добавлена обязательная связь комнаты босса с выходом, а также целью являлась минимизация количества коридоров и разветвленности подземелья.
Темносерым отмечена область работы генератора. Белыми параллелограммами – комнаты, среди которых определенные типы отмечены специальными значками-маркерами. Красными линиями отмечены первичные связи комнат, а черными – оставшиеся после минимизации их числа. Синим построены коридоры между комнат.
Работа является проектом, разработанным в Unity. Для запуска достаточно скачать репозиторий и открыть его через Unity Hub. Собранная тестовая сцена находится по пути Assets/Scenes/SampleScene.unity и содержит настройки из Обзора.
Генерация запускается через метод StartGeneration компонента Generator. В этом же компоненте можно выставить размеры используемого пространства. Компонент Rooms Spawner содержит настройки генерации комнат. Параметр Show Debug позволяет включить отображение ячеек, "занятых" ядрами комнат.
Для тестирования генератора предоставлен компонент Generation Repeater, который функционирует в 2х режимах:
- Предпросмотр (Demo Mode = On) – генерация одного подземелья, включая его отображение на сцене
- Тестирование (Demo Mode = Off) – множественная генерация Total Generations подземелий с выводом логов каждые Step Count подземелий. НЕ отрисовывает подземелья на сцене. Также можно указать Типы анализаторов, которые выведут результаты в соответствующие CSV файлы
Для добавления маркеров комнат нужно добавить компонент RoomNode на новый GameObject или же можно использовать префаб Assets/Prefabs/RoomNode.prefab. Настройки доступные для маркеров:
- Позиция – определяется позицией GameObject-a
- Room Size – желаемый размер комнаты
- Room Type – тип комнаты, генерируемой маркером
- Room – настройки комнаты, которые зависят от выбранного типа
- Pre Setup Actions – действия генерации, вызывающиеся перед этапом создания комнат
- Pre Tree Build Actions – действия генерации, вызывающиеся перед построением подграфа связей комнат
- Post Gen Validate Actions – действия генерации, вызывающиеся после работы генератора
У компонента Generator можно указать объекты-оценщики, которые будут влиять на отбор ребер в полученом после триангуляции Делоне графе. Оценщики могут быть "обязательными" – не пропускающими решение, если оно не подходит, и "взвешенными" – оказывающими установленное влияние на конечный результат. Доступные оценщики:
- Graph Component Rater – устанавливает обязательным условием достижимость всех комнат
- Key Locks Rater – устанавливает обязательным условием возможность открыть все закрытые комнаты
- Edges Count Rater – устанавливает взвешенное условие для процентного количества дополнительных коридоров
- Edges Length Rater – устанавливает взвешенное условие для средней относительной длины коридоров
- Slope Rater – устанавливает взвешенное условие для среднего относительного наклона коридоров
- Branching Rater – устанавливает взвешенное условие для разветвленности подземелья
Автор: Боев Ярослав
Полный текст работы можно найти на GitHub
Кодстайл для языка С# соответствует таковому указанному на сайте Microsoft