Знаете что это?
Так выглядит проигрывание треков.
Есть 3 массива треков: Для главного меню, для игры и для боевого режима.
Внутри каждого массива треки проигрываются случайным образом с плавными переходами. Переключение на трек из другого массива так же происходит плавно.
Я, наверное, месяц воевал с этим и вот только получилось сделать то, что я ожидаю.
Так выглядит проигрывание треков.
Есть 3 массива треков: Для главного меню, для игры и для боевого режима.
Внутри каждого массива треки проигрываются случайным образом с плавными переходами. Переключение на трек из другого массива так же происходит плавно.
Я, наверное, месяц воевал с этим и вот только получилось сделать то, что я ожидаю.
👍5
Как жаль, что нельзя себя клонировать и одновременно заниматься несколькими задачами.
В общем разбираю проект Lyra. Да, это онлайн шутер, но это совершенно не важно. Те архитектурные решения, которые применены под капотом, можно брать на вооружение для любых жанров.
Проект уходит от основных принципов ООП, которые являются базой для всего движка, и добавляет модульную систему.
Это особенно привлекательно, потому что используя Mass Entity - я уже отказался от некоторых принципов ООП в пользу дата ориентированного дизайна и событийной системы. В игре объекты более не являются главными на сцене. Главные - это данные, которые работают в многопотоке, удобные для процессора, а вместо объектов - визуальные пустышки, которые ничего из себя не представляют.
И вот я сейчас для каждой системы делаю плагин. Это для меня удобнее и легче ими делиться и использовать в других проектах. И как оказалось, Lyra тоже полностью построена на плагинах. Но там они не для каждой системы, а для всего, включая контент. И Game Mode там используется лишь в качестве пустышки. Основную роль выполняет система игрового опыта. Она отвечает за то, какие плагины будут загружены для выбранной игровой сессии. Таким образом в игре только тот контент, который реально используется.
Если кратко, то как это будет выглядеть. У нас есть стратегия. Игровой опыт - это Data asset, игровые данные - это Data Registry, игровой менеджер - это Subsystem.
Получается, что менеджер работает не с конкретными данными, а с их типами. В нём построена логика управления и он спокойно себе работает.
В игровых данных содержатся таблицы с приоритетами. Например есть таблица юнитов для определенной фракции/нации/расы. Все эти данные передаются в менеджер. Если вы выпустили DLC, где меняется какая-то фракция или меняете ее специально под условия миссии в кампании, то устанавливаете более высокий приоритет.
А игровой опыт сообщает, какие именно наборы таблиц доступны для данной игровой сессии.
Значит, data asset определяет, какие таблицы доступны для данной игровой сессии, data registry отправляет по приоритету какие именно нужно использовать данные из таблиц, а subsystem просто работает с полученными данными. И передаёт их, к примеру, в mass entity.
Получаем архитектурные оптимизации на всех уровнях. Проблема только в реализации. Это очень трудоемкий процесс. Нужно много времени и сил. Но думаю, что рано или поздно я приду к результату и мы вместе сможем пощупать результат.
В общем разбираю проект Lyra. Да, это онлайн шутер, но это совершенно не важно. Те архитектурные решения, которые применены под капотом, можно брать на вооружение для любых жанров.
Проект уходит от основных принципов ООП, которые являются базой для всего движка, и добавляет модульную систему.
Это особенно привлекательно, потому что используя Mass Entity - я уже отказался от некоторых принципов ООП в пользу дата ориентированного дизайна и событийной системы. В игре объекты более не являются главными на сцене. Главные - это данные, которые работают в многопотоке, удобные для процессора, а вместо объектов - визуальные пустышки, которые ничего из себя не представляют.
И вот я сейчас для каждой системы делаю плагин. Это для меня удобнее и легче ими делиться и использовать в других проектах. И как оказалось, Lyra тоже полностью построена на плагинах. Но там они не для каждой системы, а для всего, включая контент. И Game Mode там используется лишь в качестве пустышки. Основную роль выполняет система игрового опыта. Она отвечает за то, какие плагины будут загружены для выбранной игровой сессии. Таким образом в игре только тот контент, который реально используется.
Если кратко, то как это будет выглядеть. У нас есть стратегия. Игровой опыт - это Data asset, игровые данные - это Data Registry, игровой менеджер - это Subsystem.
Получается, что менеджер работает не с конкретными данными, а с их типами. В нём построена логика управления и он спокойно себе работает.
В игровых данных содержатся таблицы с приоритетами. Например есть таблица юнитов для определенной фракции/нации/расы. Все эти данные передаются в менеджер. Если вы выпустили DLC, где меняется какая-то фракция или меняете ее специально под условия миссии в кампании, то устанавливаете более высокий приоритет.
А игровой опыт сообщает, какие именно наборы таблиц доступны для данной игровой сессии.
Значит, data asset определяет, какие таблицы доступны для данной игровой сессии, data registry отправляет по приоритету какие именно нужно использовать данные из таблиц, а subsystem просто работает с полученными данными. И передаёт их, к примеру, в mass entity.
Получаем архитектурные оптимизации на всех уровнях. Проблема только в реализации. Это очень трудоемкий процесс. Нужно много времени и сил. Но думаю, что рано или поздно я приду к результату и мы вместе сможем пощупать результат.
🔥4
Вышел новый эпизод.
YouTube
https://youtu.be/VoXUc8N75K0
Boosty
https://boosty.to/svaretsky/posts/4ce9a432-4018-4c1c-a114-7ea93c2b5ae0?share=post_link
VK
https://vkvideo.ru/video-166367099_456239405?list=ln-7lRVVtznDpv2f4ZmPd
RuTube
https://rutube.ru/video/7be69553bbc99ea60c5a7e0d5294030a/
YouTube
https://youtu.be/VoXUc8N75K0
Boosty
https://boosty.to/svaretsky/posts/4ce9a432-4018-4c1c-a114-7ea93c2b5ae0?share=post_link
VK
https://vkvideo.ru/video-166367099_456239405?list=ln-7lRVVtznDpv2f4ZmPd
RuTube
https://rutube.ru/video/7be69553bbc99ea60c5a7e0d5294030a/
YouTube
Ep.003 Вступительный ролик, сплеш и иконка игры
Всем привет! В этом эпизоде я покажу, как добавить видео с логотипом перед запуском игры, как изменить сплеш экран и как заменить иконку приложения(игры). Будут так же разобраны некоторые нюансы.
Спасибо за просмотр!
[FAB]: https://www.fab.com/ru/sellers/Svaretsky…
Спасибо за просмотр!
[FAB]: https://www.fab.com/ru/sellers/Svaretsky…
👍3❤1
Закончил ещё монтаж своего исследования по сравнению тика и таймера на блюпринтах и на c++. Сегодня до конца дня опубликую.
Результаты такие, что даже в пустом проекте с лёгкой нагрузкой на C++ прирост в 10 FPS во всех сценариях.
Что касается таймера или тика, то на блюпринтах работает лучше таймер (если включено ограничение на количество срабатываний в одном кадре) и на C++ практически паритет между ними.
Таймер все равно показывает чуть более лучшую работу и создает более равномерную нагрузку.
Ну и ещё использовать один тик/таймер в менеджере и выполнять функцию при итерации по массиву через цикл даёт ещё больший прирост, чем переход на C++, если сравнивать с вызовом той же функции внутри каждого объекта. Вот так.
Я кайфанул от исследования, надеюсь вам тоже понравится.
Результаты такие, что даже в пустом проекте с лёгкой нагрузкой на C++ прирост в 10 FPS во всех сценариях.
Что касается таймера или тика, то на блюпринтах работает лучше таймер (если включено ограничение на количество срабатываний в одном кадре) и на C++ практически паритет между ними.
Таймер все равно показывает чуть более лучшую работу и создает более равномерную нагрузку.
Ну и ещё использовать один тик/таймер в менеджере и выполнять функцию при итерации по массиву через цикл даёт ещё больший прирост, чем переход на C++, если сравнивать с вызовом той же функции внутри каждого объекта. Вот так.
Я кайфанул от исследования, надеюсь вам тоже понравится.
👍4
Опубликовал новое видео
YouTube
https://youtu.be/fsL8ug4vK1A
Boosty
https://boosty.to/svaretsky/posts/d537bd70-6a9f-4a6b-8d17-2f13c829eadc?share=post_link
VK
https://vkvideo.ru/video-166367099_456239406?list=ln-ZDCcVXiNedGcHMVzPb
RuTube
https://rutube.ru/video/6c878fdda8849629c1a56d3b9b9d514b/
YouTube
https://youtu.be/fsL8ug4vK1A
Boosty
https://boosty.to/svaretsky/posts/d537bd70-6a9f-4a6b-8d17-2f13c829eadc?share=post_link
VK
https://vkvideo.ru/video-166367099_456239406?list=ln-ZDCcVXiNedGcHMVzPb
RuTube
https://rutube.ru/video/6c878fdda8849629c1a56d3b9b9d514b/
YouTube
Ep.004 Что лучше? Timer или Tick? Blueprints или C++?
Всем привет! В этом эпизоде я проведу большое исследование и сравню тик с таймером на блюпринтах и на плюсах. Так же я проведу сравнение с переносом логики в общий менеджер и бонусом будет пакетная обработка данных. Результаты получились очень интересные…
👍3
Следующий плагин, который будет базой для всех будущих плагинов в рамках RTS (и который будет бесплатным), будет так же содержать уникальные технологии из Lyra, которые постепенно буду адаптировать под RTS.
Идей очень много. Хочу чтобы была поддержка модов/dlc. Надеюсь все получится.
Идей очень много. Хочу чтобы была поддержка модов/dlc. Надеюсь все получится.
👍2
Сейчас занимаюсь созданием экрана загрузки. Это должно заложить фундамент многим системам.
То есть это не просто экран, это целая система, которая в дальнейшем будет управлять и загрузкой контента.
Так же сюда войдёт и управление шейдерами, вернее их компиляцией.
Насчет шейдеров. Их компиляция именно на ПК является неприятной проблемой. Это когда надо после запуска игры ещё минут 10 сидеть ждать, когда она завершится.
Сейчас в проекте никакого контента нет, а значит и проблемы нет. Но хочу заложить инструменты для ее решения уже сейчас.
Я ещё не знаю можно ли так сделать, но план такой. Шейдеры должны делиться на 3 группы:
1. Общие для всей игры
2. Общие для конкретного уровня
3. Временные.
Что это значит, когда запускаете игру, то на экране загрузки происходит компиляция первой группы шейдеров. Это самые основные шейдеры, которые есть в игровых меню и которые есть на любом игровом уровне. Базовый минимум, так сказать.
Затем вы запускаете игровой уровень и на этом экране загрузки компилируются шейдеры для данного уровня.
И в моменте, когда играете - будет ещё подзагрузка шейдеров различных объектов, которые встречаются редко или находятся только на определённой локации. Но тут есть проблема, что могут быть микрофризы во время компиляции. Но и на это есть решение, сделать компиляцию асинхронной. А на момент загрузки показывать временный шейдер.
Таким образом, первая компиляция будет разбита на 3 этапа. Когда запускаете игру или уровень повторно, то по такой же логике будут загружаться/выгружаться скомпилированные ранее шейдеры.
Получается баланс между качеством и скоростью работы.
То есть не нужно будет ждать много времени при первом запуске, но при этом и не будет фризов во время работы. А за счёт разделения на группы минимизируются случаи, когда видите временный шейдер вместо основного.
Нужно только понять, каким образом сортировать шейдеры и задавать им группы.
Сейчас я создаю экран загрузки и на нем происходит компиляция всех шейдеров с отображением прогресса.
Потом буду делать управление загрузкой контента. Логика такая, что при запуске уровня мы будем сообщать, какие таблицы контента будут присутствовать на уровне. Затем data registry определяет среди всех таблиц уже конкретный контент (например есть в игре колодец, он имеет свой ID и есть набор контента для этого колодца. Например установлено DLC, которое меняет внешний вид этого колодца или мод и data registry определяет, какой именно вид, на текущий момент, имеет этот колодец и формирует ссылку на актуальную модель) затем эта ссылка отправляется в подсистему, которая займётся загрузкой этой модели в память.
Тема очень сложная и интересная. Когда будет что показать, расскажу на видео уже подробнее и понятнее. Что это, а главное зачем и почему нельзя это игнорировать.
Это, так сказать, дорожная карта конкретно для системы загрузки. Будут ещё и другие системы и все нужно развивать параллельно. Нельзя взять и доделать сразу до конца одну из систем.
То есть это не просто экран, это целая система, которая в дальнейшем будет управлять и загрузкой контента.
Так же сюда войдёт и управление шейдерами, вернее их компиляцией.
Насчет шейдеров. Их компиляция именно на ПК является неприятной проблемой. Это когда надо после запуска игры ещё минут 10 сидеть ждать, когда она завершится.
Сейчас в проекте никакого контента нет, а значит и проблемы нет. Но хочу заложить инструменты для ее решения уже сейчас.
Я ещё не знаю можно ли так сделать, но план такой. Шейдеры должны делиться на 3 группы:
1. Общие для всей игры
2. Общие для конкретного уровня
3. Временные.
Что это значит, когда запускаете игру, то на экране загрузки происходит компиляция первой группы шейдеров. Это самые основные шейдеры, которые есть в игровых меню и которые есть на любом игровом уровне. Базовый минимум, так сказать.
Затем вы запускаете игровой уровень и на этом экране загрузки компилируются шейдеры для данного уровня.
И в моменте, когда играете - будет ещё подзагрузка шейдеров различных объектов, которые встречаются редко или находятся только на определённой локации. Но тут есть проблема, что могут быть микрофризы во время компиляции. Но и на это есть решение, сделать компиляцию асинхронной. А на момент загрузки показывать временный шейдер.
Таким образом, первая компиляция будет разбита на 3 этапа. Когда запускаете игру или уровень повторно, то по такой же логике будут загружаться/выгружаться скомпилированные ранее шейдеры.
Получается баланс между качеством и скоростью работы.
То есть не нужно будет ждать много времени при первом запуске, но при этом и не будет фризов во время работы. А за счёт разделения на группы минимизируются случаи, когда видите временный шейдер вместо основного.
Нужно только понять, каким образом сортировать шейдеры и задавать им группы.
Сейчас я создаю экран загрузки и на нем происходит компиляция всех шейдеров с отображением прогресса.
Потом буду делать управление загрузкой контента. Логика такая, что при запуске уровня мы будем сообщать, какие таблицы контента будут присутствовать на уровне. Затем data registry определяет среди всех таблиц уже конкретный контент (например есть в игре колодец, он имеет свой ID и есть набор контента для этого колодца. Например установлено DLC, которое меняет внешний вид этого колодца или мод и data registry определяет, какой именно вид, на текущий момент, имеет этот колодец и формирует ссылку на актуальную модель) затем эта ссылка отправляется в подсистему, которая займётся загрузкой этой модели в память.
Тема очень сложная и интересная. Когда будет что показать, расскажу на видео уже подробнее и понятнее. Что это, а главное зачем и почему нельзя это игнорировать.
Это, так сказать, дорожная карта конкретно для системы загрузки. Будут ещё и другие системы и все нужно развивать параллельно. Нельзя взять и доделать сразу до конца одну из систем.
Задачка не из легких. Отложил экран загрузки, потому что для него ещё нужно заложить фундамент. А именно заложить модульную архитектуру, как в Lyra. Для этого разбирал, как из редактора можно редактировать .ini файлы, чтобы подменять стандартные классы. Например изменить стандартный класс WorldSettings на собственный, чтобы в параметрах Game mode можно было выбрать ещё Game Experience, который и будет управлять тем, какой контент будет использоваться в игре.
С этим я разобрался. Этот фундамент и заложил. Теперь буду делать инструменты для управления этими плагинами с контентом. Сейчас только один тестовый грузится, но нужна возможность определять, для какого уровня какой список плагинов грузить. А потом для этих плагинов установить приоритизацию, чтобы моды и DLC вставали поверх оригинального контента и чтобы не возникало ошибок после их отключения.
С этим я разобрался. Этот фундамент и заложил. Теперь буду делать инструменты для управления этими плагинами с контентом. Сейчас только один тестовый грузится, но нужна возможность определять, для какого уровня какой список плагинов грузить. А потом для этих плагинов установить приоритизацию, чтобы моды и DLC вставали поверх оригинального контента и чтобы не возникало ошибок после их отключения.
👍3
Пока показывать нечего, но уже могу сказать, что поддержку модов и DLC я успешно сделал.
Есть базовый контент в виде таблицы. И через DLC можно подменить любой из элементов таблицы. А затем DLC выключается и снова используется базовый элемент.
А таким образом можно не только подменять, но и добавлять новое.
Это работает, но никак не продемонстрировать пока что, ибо отсутствует сам контент и инструменты, чтобы управлять им.
Есть базовый контент в виде таблицы. И через DLC можно подменить любой из элементов таблицы. А затем DLC выключается и снова используется базовый элемент.
А таким образом можно не только подменять, но и добавлять новое.
Это работает, но никак не продемонстрировать пока что, ибо отсутствует сам контент и инструменты, чтобы управлять им.
Уже приближаюсь к результатам. Сделал создание каталогов.
Вы, как дизайнер, самостоятельно определяете поля в структуре, самостоятельно создаете таблицы и заполняете их и в настройках проекта самостоятельно задаёте имена для каталогов и выбираете созданный Data Registry, а в нем указываете тег для связи с таблицей и вот система управления контентом готова!
Это круто. Я создал несколько данных для 5 юнитов и они отображаются, затем создал плагин DLC, в котором модифицировал одного юнита и в игре получил 4 обычных юнита и 1 модифицированного.
А чтобы вам получить данные конкретного объекта, будь то юнит, здание, ресурс или ещё чего - просто указываете тег и получаете его данные.
Вы, как дизайнер, самостоятельно определяете поля в структуре, самостоятельно создаете таблицы и заполняете их и в настройках проекта самостоятельно задаёте имена для каталогов и выбираете созданный Data Registry, а в нем указываете тег для связи с таблицей и вот система управления контентом готова!
Это круто. Я создал несколько данных для 5 юнитов и они отображаются, затем создал плагин DLC, в котором модифицировал одного юнита и в игре получил 4 обычных юнита и 1 модифицированного.
А чтобы вам получить данные конкретного объекта, будь то юнит, здание, ресурс или ещё чего - просто указываете тег и получаете его данные.
👍2
Постараюсь показать коротко, как работает управление контентом.
Сначала вы формируете этот контент, любой. То есть создаёте структуру (характеристики юнитов, зданий, ресурсов или ссылки на виджеты для интерфейса или наборы звуков или цветовое оформление). Затем на основе этой структуры создаете таблицу. И получается множество строк с разным набором данных.
Таблицы данных можно сделать для основной игры, для DLC, для модов, для сезонных обновлений. На этапе создания структуры - обязательно нужно добавить первым параметром Gameplay Tag. Это будет ID для конкретной строки внутри таблицы.
Пока выглядит все стандартно. Таблицы используются внутри коллекций. Например коллекция юнитов, коллекция зданий, коллекция виджетов.
На первом скрине - создание коллекции. Ей присваивается тег (это корень того тега, что указывали в структуре, чтобы в сортировке участвовали только данные определённого типа) и имя для коллекции, а затем Data Registry, которая и является коллекцией. Именно она будет управлять контентом и формировать актуальную таблицу данных. На втором скрине выглядит процесс добавления таблицы в коллекцию. Указывается имя коллекции, приоритет и сама таблица, которую нужно добавить. Как это работает. Например в основной таблице есть теги: юнит 1 и модель крестьянина, юнит 2 и модель пикинера, юнит 3 и модель мушкетера к примеру. У этой таблицы приоритет 0. Затем выпускаете сезонное обновление и там есть таблица, у которой тег юнит 2 и модель мечника. Приоритет у таблицы 100.
И на выходе в самой игре вы имеете крестьянина, мечника и мушкетера. Выключаете сезонное обновление и снова пикинёр вместо мечника.
Таким же образом можно изменить различные объекты для сюжетных миссий, менять параметры или интерфейс.
На третьем скрине у меня создание интерфейса.
Сначала идёт регистрация слоя (основной виджет будет один и он многослойный. Слой для игрового меню, слой для главного меню, слой для игры, слой для загрузочного экрана. Затем идёт выбор слоя и ему задаётся виджет контента. Виджет контента содержит внутри слоты. Это просто текстовое описание того, что там должно быть. Например панель с кнопками зданий для строительства, панель с ресурсами. В другом игровом виджете может игровая карта на весь экран.
И вот тут именно слоты представляют весь интерес, они ожидают контент в виде конкретного виджета. Виджеты в слоты встают по тегу. Открываете каталог, ищете актуальный виджет для нужного слота и добавляете его в слот.
Зачем это надо. К примеру в оригинальной игре можно построить 4 здания и всего 3 ресурса. Вы устанавливаете DLC и там добавляется новое здание и новые 2 ресурса. DLC это плагин, внутри находится вся логика и таблицы для каталогов. К примеру этот плагин содержит новые виджеты, в которых есть панель с 5ю ресурсами и 5 кнопок для строительства зданий.
Выключаете плагин и снова 4 здания и 3 ресурса.
Кроме плагинов - так можно настраивать игровые уровни основной игры, чтобы внутри был только нужный контент. Это настраивается в Game Mode.
Сначала вы формируете этот контент, любой. То есть создаёте структуру (характеристики юнитов, зданий, ресурсов или ссылки на виджеты для интерфейса или наборы звуков или цветовое оформление). Затем на основе этой структуры создаете таблицу. И получается множество строк с разным набором данных.
Таблицы данных можно сделать для основной игры, для DLC, для модов, для сезонных обновлений. На этапе создания структуры - обязательно нужно добавить первым параметром Gameplay Tag. Это будет ID для конкретной строки внутри таблицы.
Пока выглядит все стандартно. Таблицы используются внутри коллекций. Например коллекция юнитов, коллекция зданий, коллекция виджетов.
На первом скрине - создание коллекции. Ей присваивается тег (это корень того тега, что указывали в структуре, чтобы в сортировке участвовали только данные определённого типа) и имя для коллекции, а затем Data Registry, которая и является коллекцией. Именно она будет управлять контентом и формировать актуальную таблицу данных. На втором скрине выглядит процесс добавления таблицы в коллекцию. Указывается имя коллекции, приоритет и сама таблица, которую нужно добавить. Как это работает. Например в основной таблице есть теги: юнит 1 и модель крестьянина, юнит 2 и модель пикинера, юнит 3 и модель мушкетера к примеру. У этой таблицы приоритет 0. Затем выпускаете сезонное обновление и там есть таблица, у которой тег юнит 2 и модель мечника. Приоритет у таблицы 100.
И на выходе в самой игре вы имеете крестьянина, мечника и мушкетера. Выключаете сезонное обновление и снова пикинёр вместо мечника.
Таким же образом можно изменить различные объекты для сюжетных миссий, менять параметры или интерфейс.
На третьем скрине у меня создание интерфейса.
Сначала идёт регистрация слоя (основной виджет будет один и он многослойный. Слой для игрового меню, слой для главного меню, слой для игры, слой для загрузочного экрана. Затем идёт выбор слоя и ему задаётся виджет контента. Виджет контента содержит внутри слоты. Это просто текстовое описание того, что там должно быть. Например панель с кнопками зданий для строительства, панель с ресурсами. В другом игровом виджете может игровая карта на весь экран.
И вот тут именно слоты представляют весь интерес, они ожидают контент в виде конкретного виджета. Виджеты в слоты встают по тегу. Открываете каталог, ищете актуальный виджет для нужного слота и добавляете его в слот.
Зачем это надо. К примеру в оригинальной игре можно построить 4 здания и всего 3 ресурса. Вы устанавливаете DLC и там добавляется новое здание и новые 2 ресурса. DLC это плагин, внутри находится вся логика и таблицы для каталогов. К примеру этот плагин содержит новые виджеты, в которых есть панель с 5ю ресурсами и 5 кнопок для строительства зданий.
Выключаете плагин и снова 4 здания и 3 ресурса.
Кроме плагинов - так можно настраивать игровые уровни основной игры, чтобы внутри был только нужный контент. Это настраивается в Game Mode.
👍1
В общем, что я сделал. Направил все силы на систему управления контента. Вынес в отдельный плагин SGCCatalogManager и отвязал от контекста RTS. То есть данную систему можно будет использовать в любом проекте и выйдет в релиз она раньше, чем планировалось.
Распространение через FAB, бесплатно.
Внутри 50% инструментов движка. 10% из Lyra и 40% того, что сделал я. А именно взял все и собрал в одном удобном месте + добавил инструменты для работы из редактора.
Всеми DLC, сезонными обновлениями и контентом основной игры управляет разработчик внутри редактора.
Для игроков хочу сделать отдельный лаунчер, в котором можно было бы выбирать моды и сам ModKit для создания модов. Этого пока нет, как делать я ещё не знаю. По сути пока внутри есть шаблон плагина, ini файлы и json скрипт, который все это может использовать. Хотелось бы сделать создание модов не в редакторе анрила, а в маленькой exe программе. Чтобы по сути она редактировала таблицу из игры и создавала ее копию с увеличенным приоритетом и измененными данными.
Распространение через FAB, бесплатно.
Внутри 50% инструментов движка. 10% из Lyra и 40% того, что сделал я. А именно взял все и собрал в одном удобном месте + добавил инструменты для работы из редактора.
Всеми DLC, сезонными обновлениями и контентом основной игры управляет разработчик внутри редактора.
Для игроков хочу сделать отдельный лаунчер, в котором можно было бы выбирать моды и сам ModKit для создания модов. Этого пока нет, как делать я ещё не знаю. По сути пока внутри есть шаблон плагина, ini файлы и json скрипт, который все это может использовать. Хотелось бы сделать создание модов не в редакторе анрила, а в маленькой exe программе. Чтобы по сути она редактировала таблицу из игры и создавала ее копию с увеличенным приоритетом и измененными данными.
👍1
Итак, что сделано на сегодня.
Есть плагин для управления контентом. Там создаются каталоги контента и есть поддержка модов. Для того, чтобы люди могли в своих редакторах создавать моды для вашей готовой игры есть кнопка для экспорта минимального API (имена каталогов, пути, копии структур по которым строятся таблицы) и отдельный плагин ModKit, через который и создаются моды, а так же упаковываются.
Так же есть лаунчер или скорее менеджер модов, в котором можно управлять включением/выключением модов, а так же порядком их загрузки.
Вдохновлялся тем, как сделано на CreationEngine у Bethesda.
Все работает, кроме модов 🤣
Осталась одна нерешенная проблема. Когда происходит пакинг мода, ему задается некий спецификатор, как и при пакинге игры. И получается игра пакуется в одном проекте, мод в другом - на выходе пакеты с разными спецификаторами. Они не совпадают и поэтому игра не может прочитать мод.
Как мне кажется, это последняя проблема, которая у меня осталась, чтобы осуществить поддержку пользовательских модификаций.
Есть плагин для управления контентом. Там создаются каталоги контента и есть поддержка модов. Для того, чтобы люди могли в своих редакторах создавать моды для вашей готовой игры есть кнопка для экспорта минимального API (имена каталогов, пути, копии структур по которым строятся таблицы) и отдельный плагин ModKit, через который и создаются моды, а так же упаковываются.
Так же есть лаунчер или скорее менеджер модов, в котором можно управлять включением/выключением модов, а так же порядком их загрузки.
Вдохновлялся тем, как сделано на CreationEngine у Bethesda.
Все работает, кроме модов 🤣
Осталась одна нерешенная проблема. Когда происходит пакинг мода, ему задается некий спецификатор, как и при пакинге игры. И получается игра пакуется в одном проекте, мод в другом - на выходе пакеты с разными спецификаторами. Они не совпадают и поэтому игра не может прочитать мод.
Как мне кажется, это последняя проблема, которая у меня осталась, чтобы осуществить поддержку пользовательских модификаций.
🔥1
Мучаюсь тут уже достаточно долго. Разделил ответственность. Не хочу, чтобы у тех, кто установил мод ради определенной цели - получал в довесок ещё кучу мусора, который использовать не будет.
Базовый плагин будет добавлять паттерн lyra. Что это значит.
В движке есть Game Feature Plugin который позволяет через плагины добавлять контент. Примерно так создают DLC и сезонные обновления.
Но такие плагины загружаются вместе с игрой на старте.
Но когда вы в игровом меню, то вам наверняка не нужен в памяти контент из игры.
А если вы, когда делаете сезонное обновление, хотите ещё оставить режим, в котором нет сезонного контента, как тогда быть?
Для этого паттерн Lyra и используется.
Вы для каждого уровня устанавливаете собственный список плагинов, а так же таблицы с контентом.
Как работает Data Registry. Это по сути карточка контента. Она ничего не весит, поиск, фильтрация - выполняется очень быстро и функции чтения потокобезопасны - это значит, что возможно многопоточное чтение.
Когда вы запрашиваете контент по тегу, происходит асинхронная (или синхронная) загрузка таблицы и из кеша выдается нужная структура. Эта таблица может быть постоянно в Кеше, может выгрузиться по таймеру или можно выгрузить самостоятельно.
И вот вы получили структуру с данными, она грузится целиком, но вам могут быть не нужны все данные. Поэтому если есть ссылки на объекты, то их нужно хранить в качестве soft ссылок. Получается, если вам нужен меш из структуры, а не числа, то вы асинхронно (или синхронно) загружаете этот меш и используете. Будет подробное видео по использованию. Оно будет полезно и для тех, у кого есть плагин и у кого его нет. Плагин это просто дополнительное удобство и все. Не волшебная таблетка.
Но ещё будет 2 плагина. 1 нужен разработчику. Этот плагин собирает данные, чтобы для его игры можно было делать моды.
Второй плагин нужен модеру, у которого нет доступа к проекту игры. У него есть только скачанная игра и те данные, которые предоставил разработчик. Моддер создаёт моды для игры определённой версии и добавляет их к игре (не в игру, игра о них не знает) и data registry делает свою магию.
Для управлениями модами используется собственный launcher.
Базовый плагин будет добавлять паттерн lyra. Что это значит.
В движке есть Game Feature Plugin который позволяет через плагины добавлять контент. Примерно так создают DLC и сезонные обновления.
Но такие плагины загружаются вместе с игрой на старте.
Но когда вы в игровом меню, то вам наверняка не нужен в памяти контент из игры.
А если вы, когда делаете сезонное обновление, хотите ещё оставить режим, в котором нет сезонного контента, как тогда быть?
Для этого паттерн Lyra и используется.
Вы для каждого уровня устанавливаете собственный список плагинов, а так же таблицы с контентом.
Как работает Data Registry. Это по сути карточка контента. Она ничего не весит, поиск, фильтрация - выполняется очень быстро и функции чтения потокобезопасны - это значит, что возможно многопоточное чтение.
Когда вы запрашиваете контент по тегу, происходит асинхронная (или синхронная) загрузка таблицы и из кеша выдается нужная структура. Эта таблица может быть постоянно в Кеше, может выгрузиться по таймеру или можно выгрузить самостоятельно.
И вот вы получили структуру с данными, она грузится целиком, но вам могут быть не нужны все данные. Поэтому если есть ссылки на объекты, то их нужно хранить в качестве soft ссылок. Получается, если вам нужен меш из структуры, а не числа, то вы асинхронно (или синхронно) загружаете этот меш и используете. Будет подробное видео по использованию. Оно будет полезно и для тех, у кого есть плагин и у кого его нет. Плагин это просто дополнительное удобство и все. Не волшебная таблетка.
Но ещё будет 2 плагина. 1 нужен разработчику. Этот плагин собирает данные, чтобы для его игры можно было делать моды.
Второй плагин нужен модеру, у которого нет доступа к проекту игры. У него есть только скачанная игра и те данные, которые предоставил разработчик. Моддер создаёт моды для игры определённой версии и добавляет их к игре (не в игру, игра о них не знает) и data registry делает свою магию.
Для управлениями модами используется собственный launcher.
👍2
Сейчас такой медиазастой, потому что много работы на C++ ведётся по разным направлениям и очень много разбора движка, Modular gameplay, game features, data registry, Lyra, common ui и meta sound.
Завтра выпущу новый эпизод с небольшим обзором на то, что происходит в закулисье. Тема очень интересная, но это, конечно, моё субъективное мнение.
Завтра выпущу новый эпизод с небольшим обзором на то, что происходит в закулисье. Тема очень интересная, но это, конечно, моё субъективное мнение.
👍4
Эпизод задерживается не просто так. Во время записи *как обычно* пришла новая идея и я создал замену стандартному сплешу, который можно настраивать.
👍1🤨1