[DevLog] Редактор карт для настольного Зомбицида, часть 3, заключительная (?)

Доделал графический интерфейс, добавил настройки, добавил все игровые тайлы и релизнул версию 0.1.0. Теперь редактором можно пользоваться.

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

Графический интерфейс

Теперь есть три вкладки интерфейса:

  • Тайлы. Главная вкладка для редактора. Drag’n’Drop всё ещё не работает, поэтому приходится сначала кликать на тайл в таблице, потом кликать на место на карте.
  • Генерация. Здесь должны были быть настройки для случайной генерации карты, но так как ни алгоритм коллапса волновой функции, ни чего-то ещё я так и не сделал, тут есть просто одна кнопка: «переделай!».
  • Настройки. Размер карты и список наборов Zombicide, из которых доступны тайлы. Хотел сделать так, чтобы настройки сохранялись и не нужно было их каждый раз менять при запуске программы, но лень.

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

Ад зависимостей и менеджер загрузки

В проекте большинство компонентов — это акторы. У них есть зависимости друг от друга. Например, есть компонент TileRegistry — реестр всех доступных тайлов. Есть TilePool, он отвечает за то, какие тайлы можно поместить на карту. Второй зависит от первого. А ещё от Settings. Все они нужны для EditorModel. И так далее.

[DevLog] Редактор карт для настольного Зомбицида, часть 3, заключительная (?)

Все эти компоненты должны инициализироваться при запуске приложения, и поначалу я помещал логику инициализации в BeginPlay. Проблема в том, что порядок инициализации компонентов произвольный, т.е. если мне нужно в BeginPlay использовать другой компонент, то он может оказаться ещё не готовым.

Я нашёл метод PostInitializeComponents, который вызывается до BeginPlay. Процесс стал таким: в PostInitializeComponents объект инициализирует себя, а в BeginPlay делает то, что требует зависимости. Поначалу это работало, но потом стало ясно, что нужен строгий порядок инициализации.

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

void ALoadingManager::BeginPlay() { Super::BeginPlay(); Settings->Load(); TileRegistry->Load(); TilePool->Load(); MapGenerator->Load(); EditorModel->Load(); EditorView->Load(); }

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

Тайлы

Затем нужно было либо найти игровые тайлы, либо оцифровать их самому. Найти не получилось, поэтому пришлось идти по второму пути. К счастью, у друзей есть сканер. К сожалению, тайлы не влезают полностью в формат A4. Пришлось сканировать каждый два раза, по половине за раз. 25 тайлов, 2 стороны у каждого, 2 сканирования на каждую — всего 100 сканирований (Оля, спасибо большое, я это ценю!).

После этого два скана я объединял в один с помощью Krita (бесплатный графический редактор с открытым кодом). Накладывал две половинки в отдельных слоях, включал прозрачность каждого слоя 50% и инструментами трансформации подгонял их друг к другу, чтобы не было видно швов (с переменным успехом).

Затем через Filters -> Adjust -> Auto Contrast сделал их почётче.

Повторить 50 раз и готово.

Теперь в приложении есть все тайлы для фентезийного Зомбицида, кроме дополнительных наборов Black Plague Games Tiles и Green Horde Tiles Set.

C++ vs Blueprints: мнение после проекта

Изначально я стремился делать всё через C++, так как классические текстовые языки мне гораздо привычнее и с ними я работаю быстрее. Так же я не могу принять то, что блюпринты — это бинарные файлы и с ними не работает Diff.

Но в Unreal Engine нельзя чётко разделить проекты на те, что сделаны чисто на C++, и те, что сделаны чисто на блюпринтах. Второе ещё более-менее реально, но вот чисто на C++ сделать игру практически нельзя, так как всё, что требует работы с мешами, эффектами, ресурсами, анимациями, интерфейсом и подобным, лучше делать через визуальный редактор, а это сразу означает, что ты создаёшь blueprint-class. Даже если в нём не будет никакого кода, это уже блюпринт.

Вот одно из лучших видео на эту тему. Здесь объясняется, как работают C++ и Blueprints в UE4, как они связаны друг с другом и как лучше организовать свою работу.

Я посмотрел это видео относительно поздно, уже под конец проекта, но я сам пришёл к тому же подходу, что описывается в этом видео: базовые классы написаны на C++ и взаимодействуют друг с другом через свои интерфейсы, а блюпринты наследуют эти классы и отвечают за то, что лучше делать через редактор: визуализация, эффекты, вот это всё.

[DevLog] Редактор карт для настольного Зомбицида, часть 3, заключительная (?)

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

Я старался как можно больше всего делать через C++, а блюпринты использовал для графического интерфейса.

Итог

Получился неплохой проект для изучения программирования в Unreal Engine 4. Именно программирования, так как я всё ещё ничего не знаю о том, как работать со светом, мешами, анимацией и всем прочим, что не связано напрямую с написанием кода. Но это мне не особо и нужно.

Чтобы можно было выпускать версию 1.0.0, нужно сделать следующее:

  • Добавить нормальный алгоритм генерации карты и расположения на ней дверей, квестов и прочих объектов.
  • Drag’n’Drop.
  • Сохранение настроек (это самое простое, мне просто лень).
  • Нормально настроить билд в Unreal Engine, чтобы он не весил 375мб (160мб в архиве) и не нагружал процессор с видеокартой.

Сомневаюсь, что ещё буду продолжать над ним работать, но если кому-то это нужно, пул-реквесты принимаются.

Скорее всего это мой последний домашний проект в ближайшие пару лет, теперь свободное время буду тратить на некоторые другие вещи.

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

сегодня опробую) ты фри мод пока не делал?) только генерация ?)

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

1

Согласен. В Unity гораздо проще войти.