Gamedev Kira Linch
3 060

Система повреждений: модули, материалы и красивые скриншоты

Реализация системы повреждений в тактическом шутере Blazing Core на UE4 с точки зрения геймдизайна, интеграции и технического арта.

В закладки
Аудио

Привет! Меня зовут Шаповалова Маргарита, я геймдизайнер тактического шутера Blazing Core. Расскажу вам о том, зачем в нашей игре появилась модульная система, как работают повреждения, как они визуально отбиваются для игрока и что там под броней.

Во что играем?

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

Модульная система

Модули – это физические и геймплейные единицы, из которых состоят мехи. Модули делятся на корпусные модули (торс, ноги) и модули вооружения (основное оружие, способности).

Нарезка лёгкого меха Вентума на корпусные модули
Пример модулей вооружения меха Вентума

В модульную систему входят следующие параметры:

  • HP – здоровье меха, своеобразный резервуар с невосполнимой характеристикой.
  • Структура – здоровье модуля, получает урон только когда разбита броня. Разрушается, если параметр ≤ 0.
  • Броня – восстанавливающийся защитный механизм модуля. Если модуль не получает урон в течение некоторого времени, то броня начинает восстанавливаться. Восстановление прекращается, если модуль получает урон. На разрушенных модулях броня не восстанавливается.
Состояния модулей: 1. Получает урон по броне; 2. Восстанавливает броню; 3. Получает урон по структуре; 4. Разрушен

Получается, что играем в следующее: стреляем в выбранный модуль, пытаясь снять броню и нанести урон структуре и HP, ломаем модуль, полностью разбивая его структуру, и продолжаем эффективно вносить урон в HP меха через разбитый модуль. При достижении мехом HP≤ 0 мех погибает. Исходя из вышесказанного, наиболее эффективным действием будет попытка стрелять по одному и тому же модулю, не давать врагу восстанавливать броню и наносить урон в сломанные модули.

Система урона

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

Первый вариант системы урона назывался «Мясная». В ней каждый снаряд имел два типа урона: по броне и по структуре/HP. Урон по структуре и HP наносился в полном объёме сразу же после того, как цифра урона по броне становилась достаточной, чтобы её разрушить. Например, у модуля 50 брони, а у пули 100 урона по броне и 100 по структуре/HP, при попадании в модуль влетит 50 урона по броне, броня будет разбита, и 100 по структуре/HP.

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

Основная суть «Веганской» системы урона заключается в отказе от разделения урона в снаряде на два типа и приход к одному параметру – просто урон.

В новой системе урон приобретает следующие свойства:

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

Упрощенная формула расчета этой системы выглядит так:

dmg done = dmg*(coeff+perks+buffs)

Пример: у модуля 50 брони, а у пули 100 урона по броне и 100 по структуре/HP, при попадании в модуль влетит 50 урона в броню и 50 в структуру/HP.

Теперь мы пользуемся «Веганской» системой урона и чувствуем себя нормально.

Что там под броней?

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

1. Physics assets правой ноги; 2. Physics assets всего меха

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

Модуль с сочетанием разных компонентов и настройкой компонента брони (ArmorComponent)

Модуль – это виртуальный объект со своей логикой и набором параметров: компоненты брони, здоровья, оружия. Если у модуля есть определенный компонент, то этот функционал будет работать. Например, если у какого-то модуля нет компонента структуры, то этот модуль не может получать урон и разрушаться. У нас так реализован неуничтожаемый щит меха Грегора.

Модуль без компонента структуры (StructureComponent)

Также есть компонент оружия (WeaponComponent). Если модуль содержит этот компонент, то значит, что модуль – оружие, и он может стрелять, а его пули могут наносить урон. Ещё есть компонент самовосстанавливающихся зарядов, применяется в минах, а каст-компонент применяется в модулях способностей, в этом компоненте есть кулдаун, время действия и какой-то эффект.

Модуль способности с настройкой каст-компонента (CastComponent)

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

Визуалочка

«Материалы нам нужны, чтобы повыделываться перед игроками» – техартист Дима.

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

Отображение разной степени повреждений в материалах. Пулевые отверстия

Для каждого меха и каждой пушки делается второй UV-сет без перекрытий и повторяющихся деталей, а каждый кусочек развернут отдельно. Все модули вооружения и мехи имеют уникальные текстуры, в которых рисуются отверстия от попаданий. Чтобы отрисовывать каждую пулю в уникальном месте, нужно уникально ее размапить. Пуля становится «кисточкой» и может рисовать по всем поверхностям, оставляя следы.

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

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

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

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

Каждый эффект, который реализуется через эту одну текстуру работает, как «Уровни» (levels) в фотошопе: можно выбрать часть тона, верхний или нижний, сделать узенькую полосочку. Например, создаётся контур из горящей обшивки, потом внутри рисуется текстура внутренностей модуля, на нее отрисовывается тень, чтобы казалось, что она где-то внутри. Потом рисуется накаливание металла внутри с градацией: в зависимости от тона попаданий он начинает раскаляться, а потом обугливается. Это значит, что виртуальная кисточка докрасила до белого.

Это самый дорогой по производительности эффект, так как в нём много текстур.

Материалы повреждения и восстановление брони

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

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

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

Эти материалы реализованы у нас просто. Эффект поврежденного материала запускается после определенного времени (Time Period). Далее он начинает мигать контуром по синусу (Sin), затем умножается на фейд-эффект к краям (MF_DistFresnelFades). После этого добавляется маска лампочек на мехе (Emissive Mask), и всё это еще умножается на цвет из коллекции параметров (MechMaterialState:NoArmor) и множитель яркости (Main_Bright).

Короткий видос для наглядности.

Материал поврежденного модуля

Восстановление брони работает похожим образом. Но есть различие: материал не мигает по синусу, а имеет текстуру, которая растягивается в мировых координатах (Absolute World Position), текстурирование идет по всей сцене, потом растягивается на высоту меха, затем двигаем луч, похожий на заряд. Текстурирование эффекта полоски (Texture Sample) и такого же эффекта свечения комбинируются, затем умножаются на цвет коллекции параметров (MechMaterialState:ArmorRestore), который могут менять геймдизайнеры, и всё везде будет работать.

Пользуйтесь коллекциями параметров ;) Короткое видео.

Материал восстановления брони

И еще немного визуализации (видео здесь)

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

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

#UE4 #gamedev #опыт #геймдизайн

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Kira Linch", "author_type": "self", "tags": ["ue4","gamedev","\u043e\u043f\u044b\u0442","\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 23, "likes": 57, "favorites": 53, "is_advertisement": false, "subsite_label": "gamedev", "id": 30287, "is_wide": false, "is_ugc": true, "date": "Mon, 29 Oct 2018 11:00:11 +0300" }
{ "id": 30287, "author_id": 50024, "diff_limit": 1000, "urls": {"diff":"\/comments\/30287\/get","add":"\/comments\/30287\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/30287"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954 }

23 комментария 23 комм.

Популярные

По порядку

Написать комментарий...
2

Эх, я вот не знаю. Да, это все конечно интересно. Но игра с мехами, которые лазером не могут прожечь насквозь, нет отрезания конечностей, а просто меняется текстура. Ну правда, это довольно глупо.
Температура лазера может нагреть вещество до 10 миллионов градусов (вот пруф http://www.membrana.ru/particle/12570), вы правда думаете, что даже на самом крутом сплаве просто слезет один слой? Там после одного касания будет дыра насквозь. Здесь есть вариант использовать только какие-нибудь щиты или отражатели. Из этого ведь можно креативно выкрутиться.
Плюс тут такой нюанс, сами по себе мехи не интересны. Даже если он побывал в сотнях боёв. Интересен сам пилот, или персонажи, которые сидят в мехах, как Overwatch например. Или каждый мех управляется какой-нибудь креативной механикой. Как сплав 2-пилотов из Тихоокеанского Рубежа или чокнутый ИИ, который постоянно меняет личности, а с ними и боевые режимы.

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

Ответить
2

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

Не надо путать логичность, и реалистичность в играх - это две разные вещи.

Ответить
0

Немного не понимаю что вы конкретно говорите про рэб, лазер уже используется в полевых условиях (https://regnum.ru/news/2314334.html). Никаких проблем для его применения нет. Я правда говорил о более далеком будущем, где излучатели будут явно сильнее, это лишь вопрос времени. И да, вы же знаете, что если у фотона не будет препятствий, то он может двигаться бесконечно долго? По идее можно просто пустить первый луч, который будет поглощен атмосферой, и с задержкой в милисекунды второй, который уже не будет ничем остановлен.
Если вы хотите сказать что-то по делу, то приводите конкретную статью с объяснением. Я бы мог рассказать вам, что даже магия в фэнтези исполняет роль науки, но не хочу. Какая бы игра не была, она начинает рассыпаться если у нее нет твердого фундамента, хотя бы околонаучного.
Остальное уже на совести разработчика конечно.

Ответить
1

Про то что я описал Вы сами статью и кинули)) вариант рэб описан перед лазером, и лазерм по сути в указанной вами ссылке так же является рэб, он нарушают работу активных систем рэб выводя их оптику из строя.
И да, именно так лазеры уже очень давно используются, а вот чтобы выжигать металл - это просто по затратам энергии не имеет никакого смысла ни сейчас ни думаю в будущем. Даже если надо нагреть - какой нибудь напалм будет на 2 порядка дешевле и эффективней.

Ответить
1

не давать врагу восстанавливать броню и наносить урон в сломанные модули.

Может вам это покажется смешным, но знаете где я это видел? В UFC. По сути так же стараешься дамажить в одну часть тела.

Ответить
3

этой системе 200 лет в обед, пример - mechwarrior 3 99 года рождения

Ответить
1

Всё новое...

Ответить
0

Battletech'у из которого творцы сабжа перерисовали базовую механику уже как 34 года

Ответить
0

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

Ответить
1

спасибо, было интересно почитать про реализацию механики на UE4

Ответить
0

А что там реализовывать? Кидаешь трейс в мех, спавнишь эффект попадания, перекрашиваешь ближайший вертекс/вертексы в определённый цвет (в зависимости от того какая маска у материала) и вот тебе эффект потёртости/пробития и т.д. Элементам брони можно задавать опасити чтобы они исчезали (или отключать коллизию и выставлять hidden) после разрушения или детачить от скелетал меша чтобы они отлетали.
Основная сложность тут сделать многослоный материал который бы хорошо смотрелся, но это уже больше дизайнерский вопрос, нежели к движку.

Ответить
0

просто мне было интересно посмотреть как это работает на UE4 ибо подобное из боле-менее современного (ну несколько сложнее так как там вскрывается другой уровень модели в местах попадания) я видел только на CE с описанием реализации, а так как, ничего сложного наверное нет и как я уже писал это было еще в 99 году в MW3 где да же в местах попадания показывались другие материалы для показа сорванных кусков брони, ну насколько это было возможно для того года

Ответить
0

Каждый отдельный модуль - это отдельный Actor?
Как там перфоманс живёт?

Ответить
0

Скорей всего отдельный mesh.

Ответить
0

Может существует отдельный менеджер для актора, котороый всё это регулирует. Плюс часть логики реализована через компоненты.

Ответить
0

Прекрасно живет

Ответить
0

Честно говоря довольно примитивно. Ну т.е это конечно не греховно для игры, но как-то очень уныло на этапе чтения. Все равно что описывать с упоением возможность ставить хедшоты в "Контре".

Тут в WarThunder при каждом попадании снаряда в танк целая история рассказывается - какой осколок куда улетел и кого убил.

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

Ответить
0

Я думал статья про технологию разрезания роботов из metal gear rising: revengeance будет, а тут просто текстура меняется...

Ответить
0

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

Ответить
0

Так а что с геймплеем-то стало? Лучше/хуже?

Ответить
0

"Haters gonna hate". Не слушайте их, интересная статья, хорошая игровая механика и мы узнали про вашу игру.
По теме - для своей игры я выбрал "мясной" вариант т.к. есть смена оружия и это позволяет разнообразить динамику боя, разные враги == разное оружие.

Ответить
0

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

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
В лутбоксы начали включать багфиксы
Подписаться на push-уведомления