← Stanislav Deffiro
Case 02 · Commercial work

First-Person Shooter

Коммерческий заказ. Клиент дал свое оружие и часть анимаций, а от меня требовалось сделать стрельбу ощутимой и собрать красивую локацию для ее теста.

Engine UE5 · Blueprints
Genre First-Person Shooter
Role Заказ — gunplay & level
Duration 2 weeks

↑ включите звук

01 /Overview & Core Loop

Это был заказ от клиента. У него уже были свои модели оружия и часть анимаций, но стрельба ощущалась пустой. Моя задача: доработать механику стрельбы и сделать локацию, на которой эту стрельбу приятно тестировать. Именно эту локацию видно в первом видео.

Core loop: осмотреться -> занять позицию -> короткая очередь по цели -> вернуть прицел после отдачи -> перезарядка в укрытии -> смена позиции. 

Уже в процессе выяснилось, что ассеты клиента плохо оптимизированы, поэтому вместе с механикой я переписал часть логики и 3д-моделей - и та же самая сцена стала работать на 80% быстрее (с точки зрения прироста FPS - c 50 до 90), чем была до меня.

02 /Design

что просил клиент и что я с этим сделал
Problem

Стрельба не ощущалась

Solution

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

Problem

Попадания не читались

Solution

Добавил хит-маркер для прицела, разные звуки попадания по объектам, разрушение мишеней через Chaos Destruction и декали под дырки от пуль.

Problem

Ассеты клиента тормозили сцену

Solution

Я упростил BP-связи, убрал лишние вычисления из тика и оптимизировал 3д-модели - без потери качества картинки. Та же сцена, что была у клиента до меня, стала работать на 80% быстрее.

↑ включите звук

03 /Engineering

архитектура оружия в движке

Оружие как данные

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

Выстрел считается трассировкой от камеры с дополнительной проверкой от дула, чтобы пули не проходили через край укрытия. Состояния оружия разложены по автомату: Idle / Firing / Reloading / Equipping - так нажатия не накладываются друг на друга.

BP_WeaponBase DataTable Line Trace Enhanced Input

Камера и руки

Анимации клиента я оставил как базу, а покачивание и отдачу камеры вывел отдельно от них - числами и кривыми. Так можно менять ощущение оружия, не переделывая сами анимации.

Камера возвращается в исходную точку пружиной, но только на ту часть отдачи, которую игрок не убрал сам. Иначе прицел «уезжает» и стрельба перестает быть навыком.

Additive layers Camera Shake Procedural sway

Внутри проекта

BP-схемы и настройки · клик — увеличить
EventGraph персонажа: Possessed, Tick Local, обновление вида от первого лица
EventGraph · BP_IG_Character

Граф персонажа, разложенный по событиям

Граф я разобрал по событиям: Possessed, BeginPlay, Tick, обновление вида от первого лица - каждое в своей рамке. Тяжелую логику убрал в collapsed-графы.. Event Tick Local отделен от общего тика: покадровая работа идет только у локального игрока. Это и была одна из причин, почему сцена стала быстрее.

AnimGraph ABP_IG_Character: аддитивные слои и Transform Bone для отдачи
AnimGraph · ABP_IG_Character

Отдача и покачивание — поверх анимаций

Базовая поза идет через слот монтажей, а сверху Apply Mesh Space Additive добавляет покачивание для прицеливания, бега и приседа - каждый режим своим автоматом. Отдача приходит числами в Transform (Modify) Bone на кости оружия, а руки уже подтягиваются за ней по IK. Так ощущение стрельбы настраивается кривыми, а анимации клиента остаются нетронутыми.

Нажмите в любом месте, чтобы закрыть

04 /Gallery

короткие петли механик · без звука
loop
loop
loop
loop

05 /What I learned

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