{"id":2713,"title":"\u041f\u0440\u043e\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u043f\u0438\u0449\u0435\u0432\u0443\u044e \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u044e \u0432 \u0442\u0435\u0441\u0442\u0435 \u0441 \u0448\u0438\u0444\u0440\u0430\u043c\u0438 \u0438\u0437 \u0435\u0434\u044b","url":"\/redirect?component=advertising&id=2713&url=https:\/\/tjournal.ru\/special\/kaleidofood&placeBit=1&hash=43dbc0e8385ac6d4fa636e1e47cba12e3da2d7cac7980b85578145baac53f361","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

Ку.

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

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

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

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

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

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

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

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

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

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

Ответить
1
Развернуть ветку
Последний ГОСТ

Комментарий удален по просьбе пользователя

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

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

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

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

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

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

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

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

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

Ответить
1
Развернуть ветку
Общий Илья

Комментарий удален по просьбе пользователя

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Круто!

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

Ответить
1
Развернуть ветку
Общий Илья

Комментарий удален по просьбе пользователя

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

Welcome to the club 

Ответить
1
Развернуть ветку
Общий Илья

Комментарий удален по просьбе пользователя

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

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

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

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

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

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

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

А зачем?

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

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

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

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

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

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

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

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

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

Удалено

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