☰

Компонент разрушения (Destructible Component)

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

Характеристики

Это ScriptComponent, который можно применить к любому объекту на сцене, при условии что у этого объекта есть тело коллизии.

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

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

Любой существующий префаб со скриптом DestructibleComponent (осадные башни, ворота, баллисты и т. д.) продолжит работать, даже если вы удалите этот скрипт. Он просто перестанет быть разрушаемым.

У одного объекта может быть несколько скриптов DestructibleComponent. Например, таран разрушаем, но у него также есть отдельные черепичные плитки крыши, которые тоже можно разрушить. Любой урон, применённый к дочернему объекту, также будет применён к родителю (родителям).

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

Пример скрипта осадной башни
DestructionStates — может быть одним или несколькими префабами, разделёнными запятой (“,”).
DestroyedByStoneOnly — True означает, что только снаряды мангонелей или требушетов могут нанести урон этому объекту. False означает, что урон может нанести что угодно.
CanBeDestroyedInititally определяет, может ли этот объект быть уже разрушен при загрузке сцены. Это контролируется с карты кампании на основе процента разрушения от бомбардировок. Обычно это значение равно true только для зубцов стен (wall merlons). Но его также можно использовать для декоративных объектов, чтобы сцена выглядела более разрушенной с самого начала. Объекты для разрушения выбираются случайным образом.
MaxHitPoint — это начальные очки прочности этого объекта. При каждом сбросе миссии текущие очки прочности объекта также будут сброшены до значения MaxHitPoints.
ReferenceEntityTag — это опциональный тег для случаев, когда у префаба DestructionState другой кадр (frame), чем у его родителя, или для копирования состояний анимации. Вы можете добавить дополнительный объект (внутри объекта со скриптом DestructibleComponent) с правильным кадром и присвоить ему тег ссылки, чтобы созданный префаб DestructionState использовал этот кадр. Если ReferenceEntity отсутствует, будет использован кадр объекта со скриптом DestructibleComponent. Ссылочный объект также можно использовать в особых сценариях, например для ворот замка (анимации открытия/закрытия), чтобы получить состояние анимации от ссылочного объекта и применить его к новому заспавненному повреждённому объекту.
OriginalStateTag требуется только тогда, когда у вас несколько DestructionStates. Обычно при разрушении объекта мы скрываем объект, к которому применён скрипт-компонент, и создаём новый объект из DestructionState (без родителя). Но для некоторых объектов (например, ворот) мы не хотим скрывать весь объект целиком, потому что он должен продолжать функционировать как ворота, пока не будет полностью разрушен. Используя OriginalStateTag, мы скроем только тот объект, к которому применён этот тег, а остальная часть иерархии (частицы, точки стояния и т. д.) останется видимой. Любой DestructibleComponent с более чем одним DestructionState будет создавать повреждённые префабы как дочерние объекты.
HeavyHitParticlesTag — это тег, который можно применить к любым дочерним объектам, имеющим систему частиц. Эти частицы сработают один раз, когда за один удар получено определённое количество урона. Эта система частиц обычно является общей для всех состояний разрушения (она не является частью объектов, которые скрываются/создаются).
HeavyHitParticlesThreshold — это минимальный урон, который должен быть получен за один удар, чтобы запустить частицы с тегом HeavyHitParticlesTag.

Эффекты

Как правило, мы стараемся делать создаваемые префабы как можно меньше ради производительности, а также чтобы избежать дублирования объектов. У вас есть доступ к следующим возможностям для добавления эффектов:

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

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

Примеры

Пример 1: Стена с разрушаемыми зубцами

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

Иерархия WallSegment
Вот как выглядит иерархия нашей сцены для одного участка стены. European_castle_wall_a_l3 — это объект со скриптом WallSegment. Ему не важно, есть ли у него разрушаемые дочерние объекты или нет. Каждый зубец — это отдельный дочерний объект со своим собственным скриптом DestructibleComponent. После их разрушения все они создают один и тот же разрушенный префаб. У каждого зубца есть объект debris_holder, который является пустым объектом. Он просто хранит тег ReferenceEntityTag и правильный кадр для создания разрушенного префаба (важно из-за деформации мэша: расположение и поворот могут отличаться от родителя).
Пример скрипта одного зубца
У каждого зубца абсолютно одинаковый скрипт. Все они будут создавать префаб “debris” при разрушении. Мы решили, что они разрушаются после одного удара мангонеля, поэтому у них очень мало очков прочности. DestroyedByStoneOnly заставляет их игнорировать урон от всего остального оружия (стрел, мечей, топоров и т. д.). Из-за CanBeDestroyedInititally у этих зубцов есть шанс быть уже сломанными при входе в миссию. Зубцам нужен объект ReferenceEntity, чтобы определить кадр создания для сломанных префабов.

Исходная точка стены и частей зубцов

Каждый зубец — это уникальный мэш, точка начала координат (origin) которого находится у основания стены (так же, как и у стены).
Все зубцы используют один и тот же разрушенный префаб, у которого есть локальная точка начала координат. У debris_holder есть ReferenceEntityTag.
Каждый дочерний объект префаба debris — это объект с флагом “dynamic” и телом коллизии. При создании он автоматически получит последний импульс, который получил DestructibleComponent при разрушении.

Пример 2: Осадная баррикада

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

Разные стадии разрушения осадной баррикады
В настоящее время разные состояния не имеют особых частиц или динамических объектов, но их легко можно добавить позже. Объекты с флагом тела “dynamic” и системы частиц автоматически срабатывают при создании.

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

Иерархия осадной баррикады на сцене Скрипт-компонент осадной баррикады

siege_barricade_a — это пустой родитель. Он просто хранит скрипт. siege_barricade_a_state1 — это фактический мэш + тело, и у него есть тег “original_state”. Когда баррикада получает достаточно урона, siege_barricade_a_state1 станет невидимым, появится следующий повреждённый префаб и будет добавлен к siege_barricade_a в качестве дочернего объекта. Это важно, потому что DestructibleComponent должен получать информацию об ударах, а сделать это он может только в том случае, если у него самого или у его дочернего объекта есть (видимое) тело коллизии.

последнее состояние (в данном случае state_5) будет создано, когда у объекта 0 здоровья (полностью разрушен). Остальные будут использоваться в промежутке между MaxHitPoints и 0.

При сбросе миссии (здоровье сбрасывается до MaxHitPoint) исходный объект (объект с тегом “original_state”) снова станет видимым.

У каждого префаба DestructionState одинаковая точка начала координат и поворот, поэтому нам не нужно использовать ReferenceEntity.

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