Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

Вот и истек таймлайн очередного месяца… Зачем мы все еще тут? Только для того чтобы страдать? Каждую ночь, я чувствую груз собственных ожиданий… и надежд… и может быть даже мечт. Дедлайн который я провалил… пропущенные пьянки… не дают мне спать спокойно, как будто это все еще в моих руках. Вы ведь тоже это чувствуете? В любом случае, как я и обещал, выпускаю статью спустя месяц(ну ладно, чуть больше). Сделано было не так много, ибо часть времени сожрала работа, а часть я сам спустил на китайские 3д мультики. Однако это ведь лучше чем ничего… лучше же?

Точки интересов для NPC

В процессе планирования проекта, я в определенный момент натыкался на какой-то плагин, который предоставлял инструмент взаимодействия ИИ с разными предметами, другими НПЦ и так далее. Кое-как его откопал, я понял что его функционала недостаточно для моих Наполеоновских планов.

На помощь ко мне пришел NPC Manager System! Если вкратце, то данный набор блюпринтов и структур позволяет создавать своеобразные точки интересов и взаимодействий для искусственных идиотов, определять их приоритеты, распорядок дня, и т.д. В точках взаимодействия можно указать анимации которые будут воспроизводиться, звуки, генерацию мешей, анимации общения с другим НПЦ и т.д. Ну и разумеется, куда без возможности предпросмотра анимации.

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

К сожалению не обошлось без проблем при интеграции:

  • Мои анимации имеют root motion, пришлось шаманить, чтобы анимации корректно отображались.
  • Также, мы можем воспроизводить анимации, но не можем спавнить соответствующий меш, под конкретную анимацию. Допустим персонаж сидит за столом, ест вилкой из своей тарелки, потом запускается анимация питья из кружки, но мы не можем в структуре изменить меш с вилки на кружку под соответствующую анимацию. Решить это можно либо полным переписыванием логики спавна меша, либо в анимации добавлять нотификацию и обрабатывать отдельно.
  • Нельзя указать вероятность воспроизведения анимаций(а рандом тот еще, может несколько раз подряд одну и ту же анимацию показать).
  • Когда персонаж достигает коллизии активации анимаций, то его подталкивает к нужной точке через обычные ноды установки локации. Из-за этого, персонаж как будто скользит до нужной точки, и выглядит это так себе.
  • Чисто архитектурная проблема с повторением похожего кода, из-за чего приходится вносить правки во многих местах.
  • Прочие минорные проблемы с резкими прерываниями анимаций.

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

Locomotion

Думаю все согласятся с тем, что стандартные анимации перемещения в UE - тупое говно, тупого говна! Поэтому еще в февральской демке я накатил кхм… реквизированную версию Ultimate Movement System чтобы пощупать нормальную систему перемещения. В общем-то, меня все устраивало, я даже настроил в ней интеграцию с океанологией для системы плавания. Однако, как только я начал спавнить НПЦ на этой системе, оказалось что она не просто ужасна в плане оптимизации, она просто КАТАСТРОФИЧНА! Добавление 7 нпц уже убивало мой фпс до 30 кадров! В общем стало понятно, что придется искать другой каркас для персонажей…

Самым высоко оцененным решением на рынке является Advanced Locomotion System V4 но во первых - последняя версия только для версии 5.0, а мне нужно 5.1, а во вторых - оно бесплатное, а бесплатное в геймдеве хорошим быть не может… или может?

Какими-то цыганскими фокусами я вышел на форк улучшенной версии AlsV4 под 5.1, скачал, запустил, впечатлился… спринт, присед, карабканье, анимации передвижений для мужского и женского персонажа, подстраивание положения ног под поверхность… в общем полный фарш. Да и с оптимизацией ситуация стала значительно лучше, но хватит ли нам этого…?

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

Создание персонажей

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

В процессе поиска какой-нибудь хорошей программы для создания персонажей, я вышел на Character Creator 4. И вот чудеса, для этой программы в маркетплейсе есть наборы одежды 1700 годов для мужчин и женщин! По итогу, я решил остановиться именно на ней.

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

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

Модельки неписей будут монолитными, но части одежды можно будет делать прозрачными или менять им оттенок. А вот персонажа игрока нужно будет распилить на куски, чтобы можно было одевать в разное шмотье без лишнего гемора. Хотя тогда встает вопрос как быть с членами команды, которых игрок тоже должен мочь принаряжать костюмами и кирасами…

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

Тут можно увидеть дырку(не отверстие) на спине, типичный пример проблемы с LOD-ами. Пока что исправляю это увеличивая отступ между одеждами в CC4, но и это довольно геморно…
Тут можно увидеть дырку(не отверстие) на спине, типичный пример проблемы с LOD-ами. Пока что исправляю это увеличивая отступ между одеждами в CC4, но и это довольно геморно…

Фантастические скелетал меши и где они тикают

Выгрузив персонажа из CC в UE, я решил протестировать сколько персонажей я вообще смогу отрисовать на карте. Установил на карту скелетал меши и установил анимацию питья из кружки за столом:

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

Дефолтное качество из CC оказалось весьма прожорливым, и на 40 манекенах мы уже проседаем до 30 кадров. Но только ли проблема в CC?

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

Пробуем с тем же кол-вом обычных манекенов, и фпс все равно сильно падает до 60-70 фпс. И это обычные скелетал меши без класса и логики…

Так а почему падает то? А все очень просто - кости(еще draw, но в данном случае это опустим). Скелетал меши очень дорогая вещь, ведь процессор должен обрабатывать позицию каждой кости, и передавать эту информацию в видеокарту. Т.е. мы в любом случае упираемся в Game Thread который мне жизненно необходим для кучи других расчетов.

Что мы можем сделать? Например у класса Character есть множество настроек оптимизаций. Самые производительные из них делают движения персонажей немного рваными. Например в этом видео можно посмотреть на оптимизации для обработки 150 дефолтных манекенов(хотя я не представляю что у него за процессор, что способен на такие обработки). Однако, манекены ALS это вам не это… я попробовал их оптимизировать согласно инструкции, но особого буста это не дало. Не говоря уже о том, что анимации стали выглядеть рвано.

Так, но подождите, я ведь говорил что в NPC Manager как раз есть нужные оптимизации. Почему бы не попробовать их? Так я и попробовал! Одна из самых интересных оптимизаций - отключать тик для скелетов, которых игрок не видит. Так вот, оптимизация эта работает через одно место, потому что проверяет видимость по одному лайн-трейсу от центра тела, да и то, только раз в 2 секунды. Интервал можно уменьшить, но не думаю что это хорошая идея… Но проблема даже не в этом, а в том, что включение/отключение аним-блюпринта ALS может привести либо к фаталу, либо к случайной поломке анимации. Персонажи либо совсем переставали двигать костями, либо двигали только частью. А если блюпринт не выключать, то оптимизации считай никакой не будет, ибо постобработка жрет очень много.

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

Вы меня конечно извините, но на кой хуй мне нужна вся эта мудреная логика на обычном сука неписе-планктоне который не умеет блять прыгать? На кой хуй мне нужно обрабатывать весь аним-блюпринт 100% времени, если большую часть непись живет на аним-монтажах которые смешиваются между собой. На кой хуй мне проверка ебаного пола в момент, когда персонаж находится в процессе сраной сука анимации, т.е. тупо записанное действие! Придется вырубать всю физику для коллизии, чтобы оно блять не жрало производительность в этот момент. Да и то, что-то я сомневаюсь что это решит все проблемы с производительностью в Character. Вот блять, у меня есть блядский навмеш который показывает неписю куда ходить надо, а куда не надо. Почему нельзя сделать отдельную настройку, на то чтобы вырубить физику полностью по умолчанию, и перемещать персонажа по нав мешу? Какой-то флаг то конечно есть, с похожим названием, но работает он вообще не так.

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

Vertex Animation Textures(VAT)

На этом моменте я завис надолго. Ходил по форуму анрила, и читал как все жаловались на производительность скелетных сеток. Читал даже как некоторые собирают персонажей через обычные статик меши, но это допустимо только для каких нибудь роботов. В какой-то момент, мне на глаза попалось видео о записи анимаций на текстуру. У меня глаза из орбит вылезли просто. Как на текстуру?! Такое возможно!? Как оказывается да, и насколько я понял, широко используется в ААА играх. Как я уже говорил ранее, основная проблема скелетных сеток - тикание на обновление позиций костей, и то что это обрабатывается в основном процессе игры. Но если записать анимацию в текстуру, то всю обработку анимации делает напрямую видеокарта. А значит достаточно создать статик меш на основе скелетал меша, и модифицировать у него материалы. Это настолько невероятный костыль, что у меня прямо мозг взорвался.

К сожалению, референсов по использованию данной техники в анриале, не то чтобы много… да еще и по-умолчанию нет возможности устанавливать лоды и нанит, что очень критично. Но к счастью, как раз в начале года нашелся пчелик, который создал свой собственный плагин Vertex Animation Manager на основе существующих наработок… Но к сожалению, плагин стоит весьма круглую копеечку(когда я впервые его увидел, он стоил 520 вечно-зеленых), и в гавани его нет... Но к счастью, на плагин была 50% скидка, и я решил его все-же прикупить, ибо гораздо быстрее заработаю эти деньги, чем буду самолично все допиливать. А также внутри уже есть возможность подключать лоды и нанит, ловить нотификации из анимаций, устанавливать сокеты, переключение анимаций с блендингом и т.д..

Плагин пока что очень сырой, то и дело можно словить фаталы при записи анимации. Особенно плохо дело с ALS скелетом. Он вообще отказался его записывать и кидал фатал. Попросил разраба пофиксить, отправил ему скелет и анимации. У него все работает. Пробую сам с повторить с отправленными ассетами. Тоже все ок. Парадокс. Разраб потом мне кинул новую версию плагина, которой еще нет в сторе, чтобы я на ней попробовал. Проблема все равно сохранилась, пришлось самому пофиксить костылем, хотя разраб и говорил что то что я сделал, должно было все сломать, но в моем случае починило. Парадокс. Энивей, зато получил новую версию в которой есть нужные мне фичи. Хотя тоже с багами, куда же без них.

Записал анимацию на текстуры все того же неоптимизированного скелета CC4, разместил 320 мешей, в итоге 60 фпс в кармане. А если подключить лоды, то можно и десяток тысяч разместить без проблем. С нанитом сложнее, у него большие проблемы с рендерингом лица и теней. Если тени вроде как починили в 5.2, то вот с лицами проблема остается. Но потенциально, можно использовать VAT и нанит на более простых мешах.

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

Тут пытливый читатель может спросить: это что, получается для каждого отдельного персонажа придется записывать текстуру с анимациями? И это отличный вопрос! Ответ на него и да, и нет. Для воспроизведения анимации нужно 4 текстуры(вообще не всегда, это еще от режима записи зависит), Position и Rotation хранят информацию о положении костей персонажа. А Nanite и Weights снимок всех текстур и точек на которые воздействует кость. Из этого следует, что если у персонажей идентичное строение и размер костей, то достаточно просто менять Nanite и Weights текстуры, без длительной записи анимаций. А вот если персонажи разного строения, то без новых положений костей уже не обойтись.

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

Реализация интеграции

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

VAT персонаж это обычный Pawn в котором подключен стандартный компонент FloatingPawnMovement для перемещения по карте. Он довольно дорогой для основного потока, но мне должно хватить. С этим компонентом правда есть еще проблема, он строит маршрут по воздуху, и т.к. у VAT персонажа нет физики, то он начинает летать. Я пока что покрыл это привязкой к точке на навигационной сетке в тике, но это довольно дорого, и в будущем нужно будет придумать что-то получше. Ну и всякий код для поворота персонажа по направлению движения, запуска анимаций и т.п.

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​

А вот пример с тестовой площадки анимаций:

Нужно еще добавить плавности поворотам, поправить некоторые рваности в анимациях и добавить мимику лица, но в целом выглядит неплохо.

Заключение

Я вообще изначально думал, что самой геморойной частью разработки будет именно морская. Ибо наземную то каждая собака уже делала, информации и наработок должно быть вагон. Но видимо я ошибался… Хотя я ведь еще не доделал морскую часть, а там тоже есть свои приколы с оптимизациями. Помните начальные статьи, где я описывал создание парусов, тросов и прочей херни? Так вот, все то неоптимизированный мусор! Придется переделывать архитектуру корабля с 0.

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

Ах да, у серии статей изменился заголовок. Почему химера, я объясню в будущих статьях.

А еще у меня мышка сломалась. То и дело двойной клик делает. Жопа уже сгорела.

Даты релиза демки тут.

Бонус

Если смотреть на VAT меш через предпросмотр, то можно крипоту словить.

Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​
Корсарская химера и чем её готовят. NPC, точки интересов, невероятные приключения с оптимизациями​
5050
14 комментариев

Охренеть. Статья про разработку на гача сайте.
Автор, ты точно сюда хотел выложить?

6
Ответить

А куда я еще должен был это выложить? Это уже 11 статья о разработке на дтф-ке.

4
Ответить

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

2
Ответить

как прочитал что ты запихал для статистов UMS посмеялся
когда прочитал что ты для статистов прикрутил ALS подумал что ты уже ваще кукухой поехал
когда увидел что ты добрался таки и интегрировал VAT успокоился
когда увидел пример с тестовой площадки то понял что разрабатывает технарь, а не художник и анимаций не будет
плюс за старания, коммент за упокой проекта когда технарское закончится и начнётся художественное

1
Ответить

Штош, сочту это за положительный комментарий, наверное)

1
Ответить

Очень интересно следить за твоими потугами.

1
Ответить

Интересно читать. Теперь надо новую мышку покупать, чтоб не ломалась 🤯😳😱

1
Ответить