IO — Ivan Labs

Создание системы hitbox/hurtbox для 2D-файтинга

3 мин чтения
UnityГеймдев

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

Hitbox и hurtbox — раздельные формы, намеренно

Hurtbox представляет, где персонаж может быть поражён; hitbox представляет, где атака может нанести урон. Это намеренно разные, независимо размеченные формы — никогда не один и тот же коллайдер, играющий обе роли.

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

Атакам нужно покадровое состояние hitbox, а не один коллайдер

У реальной атаки есть отдельные фазы:

  • Разгон (Startup) — анимация замаха, hitbox ещё не активен (это то, что делает приёмы наказуемыми, если они видны заранее и заблокированы/уклонены).
  • Активная фаза (Active) — конкретные кадры, где hitbox реально включён и может зарегистрировать удар.
  • Восстановление (Recovery) — после того, как hitbox выключается, прежде чем персонаж снова сможет действовать — именно это эксплуатирует «наказание за промах атаки».
public class AttackHitbox : MonoBehaviour {
    public int startupFrames = 4;
    public int activeFrames = 3;
    public int recoveryFrames = 8;
    private int currentFrame = 0;
    private Collider2D hitboxCollider;
 
    void FixedUpdate() {
        currentFrame++;
        bool isActive = currentFrame > startupFrames &&
                         currentFrame <= startupFrames + activeFrames;
        hitboxCollider.enabled = isActive;
    }
}

Это намеренно управляется счётчиком кадров, а не тем, «сейчас ли играет анимация» в свободном смысле — файтингам нужна точная, воспроизводимая фрейм-дата, поскольку игроки будут (и должны иметь возможность) изучать и полагаться на точный тайминг.

Фиксированный шаг времени важен здесь больше, чем в большинстве жанров

Файтинги необычно чувствительны к согласованности тайминга — использование FixedUpdate в Unity (согласованный шаг физики) для состояния hitbox, а не Update с переменной частотой, сохраняет фрейм-дату реально согласованной независимо от частоты кадров рендеринга. Приём с «4 кадрами разгона» должен означать одну и ту же реальную длительность каждый раз, на каждой машине, а не варьироваться в зависимости от производительности рендеринга.

Упрощённый поток состояний

ФазаСостояние hitboxСостояние игрока
РазгонНеактивенПривязан к приёму, новый ввод ещё недоступен
АктивнаяВключён, может попастьПривязан, hitbox активен
ВосстановлениеСнова неактивенУязвим, наказуем при блоке/уклонении

Почему такой уровень внимания важен

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

О более широком решении по движку для SAMT: All Stars см. наше сравнение Unity и Godot.

Частые вопросы

В чём разница между hitbox и hurtbox?

Hitbox — это область, которая может наносить урон (прикреплена к атакующему приёму); hurtbox — область, которая может получать урон (прикреплена к телу персонажа). Удар регистрируется, когда активный hitbox пересекается с hurtbox противника — это намеренно раздельные формы, а не один коллайдер.

Почему бы просто не использовать границы спрайта персонажа как hitbox?

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

Что такое «активные кадры» в терминах файтингов?

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

Нужна помощь с этим?

Свяжитесь со мной, и я помогу разобраться.

Связаться со мной

Похожие статьи

Поделиться:X / TwitterLinkedIn