[DevLog] Редактор карт для настольного Зомбицида, часть 1

Архитектура проекта, зачатки процедурной генерации карт, а также попытки разобраться в Unreal Engine 4 после опыта разработки на Unity.

ZombicideMapEditor — это редактор/генератор карт для настольной игры Zombicide. Это небольшой проект с открытым исходным кодом, с помощью которого я изучаю Unreal Engine 4.

Я анонсировал проект чуть больше месяца назад, но по факту работал над ним всего неделю. Эта неделя, в целом, ушла на две вещи: я разбирался в основах UE4 и разрабатывал архитектуру проекта.

Изучение Unreal Engine 4

Disclaimer: всё в этом разделе является мнением человека, который мало работал с UE4, поэтому могут быть фактические ошибки.

Раньше я думал, что в UE4 можно разрабатывать либо на C++, либо на блюпринтах, либо смешивая их. На практике оказалось не совсем так, потому что я неправильно понимал, что такое блюпринты.

Во-первых, это не инструмент визуального программирования, как я всегда считал. Блюпринты (буквально переводится как «чертежи») используются не только для работы с логикой, но и с данными. Можно создать новый BP-класс, настроить его в редакторе, добавить новые компоненты, установить текстуры, меши или другие ресурсы. Получится блюпринт, но мы вообще не касались какого-либо визуального программирования.

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

К сожалению, даже официальная документация смешивает понятия Blueprint и Blueprint Visual Scripting, будто это одно и то же. Из-за этого я долгое время считал: «Я же знаю C++, мне не нужны блюпринты». Оказалось, что нужны. У меня ещё впереди работа с графическим интерфейсом. Насколько я помню по опыту разработки Кукухи, там вообще лучше всё делать на блюпринтах.

Кстати, из-за того, что визуальное программирование так популярно в UE4, часто сложно найти, как что-то сделать на C++. 90% поисковой выдачи — это блюпринты. C++ документация у них не очень удобная. Я пока не научился в ней быстро ориентироваться.

Кроме этого, я пытался разобраться в местной системе акторов и компонентов. Сразу уточню, что я перевожу Actor как «актор», а не как «актёр», так как актор, имхо, — более устоявшийся термин в разработке ПО.

Пока мне кажется, что компонентная модель в Unity удобнее, чем в UE4. Там есть GameObject’ы, на которые можно добавлять MonoBehaviour’ы, содержащие данные и логику. В UE4 акторы сами по себе содержат данные и логику, и к ним ещё можно добавлять ActorComponent’ы, которые тоже реализуют какое-то поведение, но с другим интерфейсом. Хотя большой разницы нет.

Архитектура проекта и зачатки генерации карт

Я подумал и решил делать базовый MVC (model-view-controller). Его идея в том, что код делится на три компонента. Model — это данные и внутренняя логика. View — это то, как данные из модели показываются пользователю. Controller — это то, как ввод пользователя модифицирует модель.

[DevLog] Редактор карт для настольного Зомбицида, часть 1

Я очень скептически отношусь ко всяким MVC, MVP, MVVM и прочим штукам. В разработке игр, по моему мнению, они вообще редко применимы, так как зачастую очень сложно полностью изолировать логику от отображения. Но у меня здесь простой проект, поэтому я могу реализовать MVC в его буквальной интерпретации: у меня есть папка с классами для Model и папка с классами для View. До Controller пока не дошёл и не уверен, что он будет в явном виде.

Всё содержимое уровня на текущий момент
Всё содержимое уровня на текущий момент

Model содержит сетку для тайлов, полный реестр всех тайлов, пул тайлов для генерации, логику идентификаторов тайлов и логику генерации карт. Модель не знает ничего о том, как она будет отрисовываться на экране.

View реагирует на события в Model, читает её данные и создаёт на экране спрайты с соответствующими тайлами из игры.

[DevLog] Редактор карт для настольного Зомбицида, часть 1

Генерация карт сейчас очень простая: для каждой секции берётся случайный тайл и поворачивается случайным образом (0, 90, 180 или 270 градусов). Уже получается что-то похожее на настоящие карты, но со странностями типа лестницы, упирающейся в стену.

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

Что дальше

Раз это редактор карт, то нужно добавить возможность редактировать эти карты. Дальше я сосредоточусь на интерфейсе. Хочу, чтобы был список всех возможных тайлов, сгруппированных по выпускам игры (два базовых издания и дополнения), и чтобы можно было мышкой перетягивать тайлы из списка и собирать из них карту. Т.е. нужно будет разбить экран на две секции: доступные тайлы и рабочую зону с картой. И реализовать Drag’n’Drop для переноса между секциями.

После этого можно будет заняться усложнением алгоритма генерации.

Исходный код можно найти здесь:

2323
13 комментариев

Эх такой бы генератор для Особняков безумия, я бы столько кастомных сценариев наделал. 

1
Ответить

Код открыт, можно форкнуть и сделать редактор для других игр)

1
Ответить

Комментарий недоступен

Ответить

Не сложно, но, наверное, долго. Ещё арт нужно брать где-то. Такие проекты для создания карт для ролёвок периодически на кикстартере появляются, да и вообще много уже готовых есть. 

3
Ответить

Не особо сложно. Но я бы такое, всё же, в вебе делал, а не средствами игрового движка.

1
Ответить