Создание системы hitbox/hurtbox для 2D-файтинга
Ощущение боя в файтинге сводится к множеству тщательных, непритягательных деталей столкновений — именно здесь реально живёт большая часть этих деталей.
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 нет, уязвимость), каждые из которых требуют отдельной обработки.