{"id":3824,"url":"\/distributions\/3824\/click?bit=1&hash=a0d33ab5520cacbcd921c07a49fc8ac5b78623b57936b992ce15c804b99210d4","title":"\u041a\u0430\u043a\u0443\u044e \u0440\u0435\u043a\u043b\u0430\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043d\u0430 DTF \u0438 \u043a\u0442\u043e \u0435\u0451 \u0443\u0432\u0438\u0434\u0438\u0442","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"75ec9ef4-cad0-549d-bbed-1482dc44e8ee","isPaidAndBannersEnabled":false}

King, Witch and Dragon. DevLog #12

Давно не было апдейтов и тому было несколько причин.

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

Во-вторых, после завершения работы над логикой боя, я начал прорабатывать игровой мир - сеттинги, биомы, а также примерно прикидывать объём работы по созданию окружения. И работы оказалось много... ОЧЕНЬ много.

В-третьих, я изучал новый софт. Но обо всём по порядку.

Сеттинг игрового мира

В одном из предыдущих девлогов я уже касался вопроса структуры мира игры.

Весь мир можно разделить на 3 основных секции:

  • Вступление. Тут игрок проходит туториал, учится основным игровым механикам и приобретает 4 специальных способности.
  • Исследование мира. Эта секция состоит из хаба и 4 больших локаций-биомов, в конце каждой из которых игрока ждёт босс
  • Заключительный этап в конце которого игрока ждёт финальный босс-файт с главным злодеем.

Я решил для начала сфокусироваться на фазе исследования и проработать 4 локации. Для каждой локации нужно было сделать следующее:

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

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

Визуальный сеттинг и референсы

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

Я решил не тратить время на создание собственных концепт артов и сделать упор на поиск подходящих референсов, с последующей их адаптацией. Потратив пару вечеров в Pinterest я нашёл достаточное количество материала, чтобы начать работу.

После нескольких итераций брейншторма, проработки и отсева, я выбрал следующие локации.

Парящие острова

В локации парящих островов много открытого пространства, относительно небольшие платформы, много прыжков и много возможности упасть. Чтобы дойти до босса игрок должен постепенно подниматься всё выше и выше.

Небольшая подборка рефов

Подземные руины

В противоположность парящим островам, подземные руины создают ощущение замкнутого, тесного пространства. Игрок должен спускаться всё глубже и глубже, чтобы дойти до босса (опять же контраст в направлении движения, по сравнению с островами).

Царство грибов

Царство грибов представляет собой органическую локацию, в которой отсутствуют прямые линии, а в качестве опасности выступают шипы, плющи и кислота. Грибы, при этом, являются неотъемлемой частью топологии уровня, они могут быть размером с дерево и персонаж может прыгать по их огромным шляпкам.

Механическая долина

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

Геймплейные механики

Тут я просто приведу табличку, которую составил для себя. Некоторые из механик не выглядят такими уж оригинальными, другие "позаимствованы" из других игр, но что поделать. Главное, подчеркнуть разннобразие локаций и сеттингов.

Синие - для паучьих лап; Зеленые - для змеи; Красные - для щупальца; Оражевые - для крыльев.

Пайплайн работы над ассетами

Собирать картинки из интернета это, конечно, здорово, но рано или поздно придётся и ассеты для игры делать.

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

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

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

Те, кто интересуется процедурной генерацией, скорее всего слышали про один широко известный в узких кругах софт, который специализируется именно на этом - Houdini. Также его часто упоминают в контексте симуляций, моушн дизайна и визуальных эффектов.

Моё знакомство с Houdini

Я сам давно на него поглядывал, но пощупать всё никак не доходили руки. Да и в интернетах многие пугают, что "Гудини не для всех", "Гудини странный" и т.д. Но я всё равно решил уделить немного времени и чуть более глубоко изучить предмет.

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

Процедурная геренация - это классно, а Houdini выводит этот процесс на совершенно иной уровень. Но мысль о том, что ассеты надо будет генерить в Houdini, а потом переносить их в Unity через условный FBX, не давала мне покоя. По сути получалось то же самое, что моделить в Blender'e, а потом экспортировать в движок. Но потом я узнал про Houdini Digital Assets и это перевернуло всё с ног на голову...

Houdini Digital Assets

Работая в гудини вы создаёту структуру нод, которая по заданному алгоритму создаёт геометрию. Houdini Digital Asset (или коротко HDA) является эдаким контейнером, который позволяет упаковать ваш алгоритм, перенести его в игровой движок, и создавать ассеты прямо в игровом движке. Для этого в движке необходимо установить плагин Houdini Engine.

Вот, например, видео с официального сайта SideFX (разработчики Houdini), в котором показано, как в HDA можно скормить простые примитивы Unity, а на выходе получить стилизованную полуразрушенную колонну. То есть, можно генерить готовые ассеты на основе примитивов, использующихся для блокинга уровня.

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

Первые результаты

Потратив пару недель на чтение мануалов и просмотр туториалов, я начал чувствовать уверенность в своих силах и решил попробовать сделать что-нибудь не по туториалам, а что-то реально полезное для проекта. Свой первый настоящий HDA. Начал я с того, что проапгрейдил лицензию до Indie и установил Houdini Engine (он требует лицензии и идёт в комплекте с Houdini Indie).

Я начал думать с чего бы начать. Первыми на ум пришли снова камни. Но это скучно и неинтересно. Можно было бы начать с деревьев, но для ни и так уже есть миллион готовых инструментов. Я искал что-нибудь простое, но интересное. Что-то, что может иметь много разных вариаций. Я пробежался по списку сеттингов и нашёл ответ...

Что вы знаете о процедурных грибах? Далее я вам расскажу и покажу, что о них знаю я.

Грибы мне показались идеальным кандидатом на роль первого пробного HDA. Я посмотрел на референсы и составил список параметров, который позволил бы мне создать если не все, то хотя бы большинство из представленных на них грибов (с некоторыми допущениями, конечно же).

Спустя пару вечеров я закинул готовый HDA в Unity и на его основе за несколько минут создал вот такие ассеты:

Также я написал специальный шейдер и создал на его основе материал, который прописан внутри HDA и который автоматически назначается при создании нового объекта. Шейдер не содержит текстур, весь цвет задаётся с помощью Vertex color'a. Помимо этого можно гибко настраивать затенение, контурный свет (rim light) и свечение разных областей.

Помимо фентезийных грибов можно создавать и более реалистичные вариации:

А также грибы причудливой формы:

Сам процесс создания нового объекта выглядит так:

Буквально за 3-4 минуты создаётся новый ассет. Инструмент достаточно гибкий и позволяет настраивать следующие параметры:

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

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

Что дальше?

Пока что я крайне доволен результатом. Я планирую более глубоко изучить возможности Houdini и конкретно возможности HDA. Параллельно я буду нарабатывать библиотеку инструментов для создания процедрных ассетов внутри Unity. По мере появления новых интересных инструментов буду делиться ими в девлоге.

Чтобы поддержать разработку игры, добавляйте King, Witch and Dragon в вишлист на Steam, это важно не только для моей мотивации, но и для алгоритмов Steam. Чтобы принять участие в обсуждении, вступайте в группу ВК, а также подписывайтесь на меня в Twitter и Instagram.

Спасибо за внимание!

0
34 комментария
Написать комментарий...
Vaskrol

Ку.

Полагаю, данные параметры можно крутить скриптом в рантайме, чтобы генерить кучу разных грибов на лету? Или гриб придется "запекать" в эдит тайме?

Ответить
Развернуть ветку
Андрей Торчинский
Автор

В рантайме, к сожалению, генерить нельзя. Можно запекать в gameobject или сразу в префаб. При этом меш кешируется и сохраняется в папке Assets.

Ответить
Развернуть ветку
Vaskrol

Блин, а я уже ожидалку расчехлил :(

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Там прикол в том, что плагин не сам все считает. Он устанавливает соединение с запущенным инстансом Houdini и отправляет ему данные. Houdini всё обсчитывает и возвращает в плагин результат (меш). По сути он просто убирает этап импорта/экспорта и позволяет смотреть результат в контексте игровой сцены.

Ответить
Развернуть ветку
Vaskrol

В принципе звучит прикольно. Для грибов мне это кажется оверкиллом (хотя кто знает), но когда мне нужно будет сделать 100 разных домов для деревни или города, эта штука может помочь.

И сразу вопрос в связи с сотней домов: эта штука может сделать так, чтобы каждый сгенеренный вариант меша использовал один и тот же материал?

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Vaskrol

Зависит от объема работы для того, чтобы настроить генератор грибов.

Если это заняло условно 3 часа, а правка одного гриба в условном Блендере занимает 5 минут, то до определенного числа грибов проще их править вручную.

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Да, выигрыш получается при большом объёме. Если нужно сделать штучный объект с нужной степенью проработки деталей, то правильнее будет сделать его руками в блендере. Указанный выше подход нужен для типовых объектов, которыми нужно заполнить локацию.

Ответить
Развернуть ветку
Vaskrol

А сколько времени заняло создание этого конкретно генератора грибов?

Ответить
Развернуть ветку
Андрей Торчинский
Автор

3 вечера. Но это был первый опыт и я собрал все возможные грабли. Надеюсь, со временем можно будет за вечер собирать нужный генератор.

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Я сам риггинг и скиннинг в гудини ещё не ковырял.

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Да, мои грибы именно так и сделаны. Они все имеют один материал, сразу по умолчанию ставится флаг Static, при рендеринге они батчатся и рисуются все за 1 draw call.

Ответить
Развернуть ветку
ArtyGrand

Разные цвета/градиенты в материале батчатся? Вроде бы же должны новые материалы создавать внутри движка?

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Все цвета и градиенты задаются цветом вершин меша (vertex color). Шейдер берет этот цвет с вертексов и красит меш. В самом материале никакие цвета и градиенты не задаются. Поэтому на всех моделях один и тот же материал, но разные цвета.

По тому же принципу работает дефолтный шейдер спрайтов в Юнити - с помощью vertex color’a можно задавать tint спрайта не меняя материал.

Ответить
Развернуть ветку
Leusov

Получилось очень красиво и фентезийно.

Ответить
Развернуть ветку
mr Fetch

люблю грибы
как еду и как декор в играх)

Ответить
Развернуть ветку
Игнат Емельянов

Поражаюсь с вашей мотивации! 

Ответить
Развернуть ветку
Стандартный бокал

Моделировать ползунками. Ставлю Класс! 5+

Ответить
Развернуть ветку
Igorious

🍄 Ура, новая часть! 🍄
Редактор грибов — это даже немного забавно :-)

Ответить
Развернуть ветку
ShizZ
Ответить
Развернуть ветку
Данил Свечков

Круто!

Ссылка на Houdini по-русски:

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Welcome to the club 

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
ARTER Pendragon

Знаю только процедурну янемацаю

Ответить
Развернуть ветку
Иван Гуляев

Класс. Желание работать в геймдеве увеличилось) (но всё равно туда не пойду, хоть и питаю к представителям индустрии уважение)

Ответить
Развернуть ветку
xxx xxx

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

Ответить
Развернуть ветку
Vaskrol

А зачем?

Ответить
Развернуть ветку
xxx xxx

Тысяч сто кубиков, как отдельные объекты опустят Вам фпс в ноль и сожрут кучу памяти, если их скинуть в один мешь всё вернётся в норму.

Ответить
Развернуть ветку
Vaskrol

100к кубиков да, но 100к ёлок все же обычно не делают :) Но я понял, ворлдгенерация.

Ответить
Развернуть ветку
Андрей Торчинский
Автор

Для этого есть static batching, который сливает объекты с одним материалом в один большой меш и скармливает его видеокарте. И именно этот батчинг реализован для грибов из статьи. 100 тысяч разных грибов будут рендериться как один объект за один проход.

Ответить
Развернуть ветку
xxx xxx

Сами разрабы пишут об этом в документации - However, it also has some downsides; static batching incurs memory and storage overhead. 

Ответить
Развернуть ветку
Vaskrol

Удалено

Ответить
Развернуть ветку
Читать все 34 комментария
null