Привет всем спонсорам!
Работа над проектом в июне оказалась плодотворной и интересной. Правда, я настолько увлёкся разработкой, что почти забыл о новом ролике. Исправлять это недоразумение придётся в июле, причём высокими темпами.
[Grim Wild]
Основные задачи были нацелены на закрытие всех старых дыр, чтобы завершить разработку версии 0.3, протестировать её нововведения и приступить к созданию 0.4. И это всё было успешно сделано.
Новые переходы поверхностей
Я давно планировал переделать визуальное отображение поверхностей. В предыдущие попытки результат меня не удовлетворял. А теперь - очень даже.
Все поверхности визуально выпирают на соседние клетки, и там рисуется переход.
Границы можно рисовать разные - за это отвечает отдельная текстура. У сыпучих поверхностей она такая:
Некоторые переходы выглядят не очень красиво, но это тестовый вариант.
В сравнении с прошлым визуалом, я считаю нововведение крайне удачным. Вся логика, кстати, целиком и полностью просчитывается на видеокарте, так что отнимать драгоценных ресурсов у процессора не будет.
Редактор спрайтов
В результатах работы за май я упоминал разработку редактора спрайтов. Тогда я писал, что он существует "для меня самого" только в движке.
В июне его разработка продолжалась, и я ввёл туда несколько инструментов, которые будут полезны и мододелам. Например, визуальное редактирование сокетов или указание области текстуры для отрисовки.
Теперь редактор доступен прямо в игре, и с его помощью создатели модов смогут намного быстрее и удобнее работать со спрайтами.
Раньше я думал, что изменение свойств спрайтов будет происходить через окно виртуальных ассетов (а там просто текстовые поля) или через Lua. Как же хорошо, что теперь это не так!
Композитные текстуры
Типичная текстура в GW имеет формат RGBA8. В каждом канале (красный, зелёный, синий, прозрачность) один пиксель занимает восемь бит (значения от 0 до 255).
Если для RGB это оправдано, то вот для прозрачности (которая в ГВ не имеет промежуточных значений; то есть пиксель либо строго прозрачный, либо строго непрозрачный) достаточно всего одного бита. В остальные 7 я могу записывать для пикселя любую другую информацию.
Испытания маски блеска прошли неудачно: в реальности всё выглядит не так красиво, как в моих фантазиях.
Главная задача композитных текстур - создать в системе отрисовки дополнительный функционал, при этом полностью сохранив изначальную производительность и базовые принципы. Например, полную совместимость с runtime текстурными атласами. Повторное использование спрайтов через Sprite Pool. Объединение Draw Calls и кэширование команд для отрисовки.
Разработка этой механики состояла из двух частей:
1) Текстуры с побитовой манипуляцией надо как-то создавать. Никакие популярные программы не позволяют делать это быстро и удобно.
2) Текстуры надо правильно обрабатывать (добавлять на атлас / использовать в шейдере на GPU). И делать это так, чтобы результат при использовании обычных текстур ничем не отличался от композитных.
Именно этими пунктами я и занимался в июне. Вторая часть не такая уж интересная, потому что заготовки под неё я делал с самого начала работы над новой отрисовкой.
А вот первая - очень даже. Ведь я сделал удобную утилиту, позволяющую создавать композитные текстуры автоматически. Всё, что требуется от меня или от мододела - это загрузить вводные данные из нескольких самых обычных текстур.
Финальная текстура визуально почти ничем не отличается от базовой. Я специально сделал так, чтобы при предпросмотре (например, в проводнике Windows) её прозрачность примерно была похожа на оригинальную
Демонстрация маски оттенка в игре:
Итоги месяца: июнь 2024
Как и было сказано, объединение Draw Calls + кэширование команд отрисовки + использование в Sprite Pool было полностью сохранено
Отложенное обновление трансформации
Про него я тоже писал в посте, так что теорию повторять не буду.
Обновление трансформации спрайтов (локация, поворот, масштаб) теперь происходит один раз в конце кадра и идёт сверху вниз: от "корней" (сцен, пристыкованных напрямую к уровню) до "листьев" (конечных спрайтов, к которым ничего не пристыковано).
Корни - это чанки. То, что они являются отдельной сценой, позволяет иметь возможность двигать их и менять видимость. Движение чанков может быть полезно для будущих идей, например, космических кораблей. 1 космический корабль являлся бы корнем, от которого при плавном движении по уровню наследовалась бы трансформация всех находящихся внутри объекты.
В июне для этой механики было сделано почти всё, но пара проблем всё же осталась. Как и ровно один вылет игры, причины которого я продолжаю активно расследовать. Именно из-за этих мелочей я и не могу уже сейчас заявить, что "система отрисовки на 100% готова". Она готова, вероятно, пока только на 99%.
Вариации спрайтов
В игре у спрайтов могут быть визуальные вариации. Например, тело человека: нормальное, тонкое, толстое и мускулистое. Или разный внешний вид для постройки "статуя".
Раньше мне приходилось создавать для каждой вариации отдельный ассет. У меня были, например, Body_Normal, Body_Thin, Body_Fat и Body_Muscular. Меня это более-менее устраивало, но когда я дошёл до одежды, началась полная жесть. Ведь она тоже имеет 4 вариации для каждого вида тела.
Именно поэтому я решил модифицировать механику типов спрайтов, о которой писал в прошлых итогах.
Если раньше ассеты спрайтов могли быть Single (1 спрайт внутри) или Directed (повернутые на 3 стороны: восток, юг, север), то сейчас они стали такими:
• Single: по 1 спрайту внутри вариации
• Double: по 2 спрайта (горизонтальный и вертикальный) внутри вариации.
• Triple: по 3 спрайта (восток, юг, север) внутри вариции.
• +TileSet, Custom (я писал о них раньше)
Тело теперь занимает всего один ассет (тип Triple, 4 вариации внутри)
Asset View
Я готовлюсь к реализации системы виртуальных ассетов (я про неё часто говорил, но она всё ещё не реализована), и некоторые изменения для этого уже вносятся в Asset Manager.
В основном это всё скучно и не представляет для спонсоров большого интереса. Единственное, что я бы хотел показать - это новое окно Asset View ("просмотр ассетов"), которое активно помогает мне в отладке и поиске проблем.
Здесь можно увидеть тип, название, путь и статус ассета (загружен/выгружен)
Этот инструмент будет полезен и мододелам, поэтому я решил включить его в саму игру. Доступен он прямо через консоль разработчика.
Lua и скрипты
Ещё одна важная часть развития проекта - это скриптовый язык Lua. Я продолжаю развивать и совершенствовать его возможности. И сейчас я с удивлением для себя обнаружил, что скорость тестирования и отладки у меня значительно выросла. В некоторых аспектах я предпочитаю писать именно Lua скрипты, а не код на C++ или спагетти на Blueprints.
Новые функции и "классы", которые были добавлены в июне
Немного деталей.
Внедрить Lua в проект на Unreal Engine оказалось не так уж сложно. Для этого существует как минимум два плагина: UnLua от Tencent и LuaMachine от независимых разработчиков.
Я попробовал оба этих плагина и остановился на LuaMachine как на базе, которую я начал модифицировать и дополнять под себя и свои нужды.
Китайцы хоть и сделали профессиональный и производительный продукт, но меня не заинтересовали: некоторая документация там есть только на китайском языке. Как и комментарии в коде. Как и описание коммитов в ГитХабе. В общем, к принудительному изучению китайского языка я оказался не готов.
(техническая информация)
В Grim Wild используется Lua 5.4. То есть не LuaJIT. К этому я отношусь спокойно, потому что супер-сложных и performance-critical скриптов в игре не будет. Lua у меня в проекте - это просто обёртка C++ кода, где и выполняется всё самое тяжёлое и важное.
Кстати, это не единственное, что косвенно связывает меня с Tencent. Когда-то давно я сделал концепт для логотипа GW (возможно, на тот момент ещё "Grim World") в форме буквы G, внутри которой спрятана буква W. А знаете, что сделали китайцы в логотипе своего WeGame? Спрятали W в букве G. Я узнал об этом совпадении только несколько лет спустя.
teedeezet: делаю свой RimWorld
Tencent: делаем свой Steam
Steam: Grim Wild (Playtest)
В Steam есть функционал для тестирования игр. Он называется Playtest. По сути, это отдельное приложение, которое связано с базовой игрой лишь одной и той же страницей в магазине.
Я решил использовать его, чтобы не смешивать стабильные версии GW и тестовые сборки. Ещё, как я думал, это будет полезно для "полу-закрытого" тестирования со спонсорами.
Использование плей-теста оказалось не таким радужным, как я себе представлял. Когда я на радостях раздал текущим тестировщикам ключи, выяснилась не очень приятная деталь.
Даже для закрытого тестирования мне нужно выпустить этот самый Playtest в Стим. А для этого надо мало того, что создать все картинки (которые вы увидите снизу), так ещё и пройти 2 проверки от Valve (на визуал + на сборку игры) и отметить проект как "Скоро выйдет", чтобы прождать в этом режиме 2 недели. И только после этого я смогу "выпустить" плей-тест, чтобы туда смогли заходить тестировщики.
Передо мной, на самом деле, стоит непростая задача: так как доступ к тестированию на втором этапе получат все желающие спонсоры огромной+ поддержки, мне надо как-то автоматизировать процесс выдачи ключей. Но главное даже не это. А то, что будет справедливо, всё-таки, если доступ к свежим версиям будут продолжать получать только активные спонсоры.
Пока что я придумал такую систему: при подписке на Бусти я буду высылать новому спонсору ключ от Playtest приложения. Но все обновления там выходят не на основную ветку, а на приватные (защищённые паролем).
Пароль этот я буду указывать в самых обычных постах на Бусти. Он одинаковый для всех. То есть видеть его смогут только те, кто имеет доступ к постам на Бусти => это активные спонсоры.
При отписке старые версии я забирать не собираюсь. Playtest просто остаётся в библиотеке Стима без доступа к новым версиям.
Если кто-то из вас уже сталкивался с похожей ситуацией, я буду рад обратной связи! Мне очень важно сделать эффективную и справедливую систему награждения бустеров!
Логотип Playtest (Valve вынудили меня его сделать уже сейчас)
Забавный момент: как только я сделал все нужные для магазина и библиотеки картинки, после чего Valve одобрили их, название приложения "Grim Wild (Playtest)" установилось и заблокировалось. Теперь поменять его без обращения в поддержку Steam нельзя.
Сменить название проекта, конечно, стало посложнее :)
[Публичная деятельность]
В июне над контентом для Ютуба и Бусти я почти не работал. Компенсироваться это будет тем, что июль у меня планируется месяцем, почти полностью посвящённым публичной деятельности. Это стало возможным, потому что все неотложные дела в проекте были доделаны, и теперь я свободен. Свободен не от работы, конечно. Свободен для назначения самому себе новых задач.
Я планирую работать одновременно над тремя видео: 7, 8 и 9 сериями роликов. И над парой постов для Бусти. И, наконец-то, над обещанным давно роликом про отрисовку, где я покажу свои многомесячные труды в динамике.
Спасибо за внимание!