캐릭터가 벽에 막히고, 총알이 적에게 맞고, 아이템 위에 서면 줍는 것 — 이 모든 것은 "두 물체가 겹쳤는가"를 판정하는 충돌 검사에서 시작합니다. 엔진이 물리 기능을 제공하더라도, 히트박스를 어떻게 잡느냐에 따라 게임의 손맛이 크게 달라지기 때문에 기본 원리는 알아둘 필요가 있습니다. 이 가이드는 2D에서 가장 널리 쓰이는 AABB 방식과 히트박스 설계 기준을 정리합니다.
AABB: 축에 정렬된 사각형
AABB(Axis-Aligned Bounding Box)는 회전하지 않는 직사각형으로 물체를 감싸고, 두 사각형이 겹치는지만 검사하는 방식입니다. 검사 로직이 매우 단순합니다. 두 사각형이 가로로도 겹치고 세로로도 겹치면 충돌한 것이고, 한 축이라도 떨어져 있으면 충돌이 아닙니다. 계산이 가볍고 예측 가능해서 플랫포머·탑다운·슈팅 등 대부분의 2D 장르에서 기본으로 쓰입니다.
스프라이트와 히트박스를 분리하라
그림(스프라이트)과 충돌 영역(히트박스)은 별개로 관리하는 것이 정석입니다. 보이는 그림에는 머리카락, 무기, 이펙트가 튀어나와 있지만, 피격 판정은 캐릭터 몸통만 기준으로 삼는 편이 공정하게 느껴집니다. 반대로 플레이어의 공격 판정(어택박스)은 살짝 넉넉하게 잡아 "닿을 듯 말 듯한" 공격이 맞도록 하면 손맛이 좋아집니다. 즉 받는 판정은 작게, 주는 판정은 크게가 기본 감각입니다.
충돌 후 처리: 겹침을 되돌리기
충돌을 감지한 다음에는 겹친 만큼 물체를 밀어내야 합니다. AABB에서는 x축 침투 깊이와 y축 침투 깊이를 비교해, 더 얕게 겹친 축으로만 밀어내는 방법이 흔합니다. 이렇게 하면 벽을 따라 걸을 때 캐릭터가 위아래로 튕기지 않고 자연스럽게 미끄러집니다. 이동을 x축과 y축으로 나눠 각각 검사하고 보정하면 구현이 더 단순해집니다.
빠른 물체의 터널링 문제
총알처럼 한 프레임에 많이 움직이는 물체는, 프레임 A에서는 벽 앞에 있고 프레임 B에서는 벽 뒤에 있어서 "겹친 순간"이 아예 없을 수 있습니다. 이를 터널링이라고 합니다. 해결 방법은 이동 경로를 선분으로 보고 그 선분이 벽과 만나는지 검사하는 스윕/레이캐스트 방식, 또는 한 프레임의 이동을 여러 작은 스텝으로 쪼개 매 스텝마다 검사하는 방식입니다. 대부분의 엔진은 "continuous collision detection" 옵션으로 이 기능을 제공합니다.
실전 체크리스트
- 1. 사각형/원으로 근사픽셀 퍼펙트는 거의 필요 없습니다. AABB나 원부터 시작하세요.
- 2. 스프라이트 ≠ 히트박스그림과 판정 영역을 따로 관리하세요.
- 3. 받는 판정 작게, 주는 판정 크게피격은 몸통만, 공격은 살짝 넉넉하게.
- 4. 빠른 물체는 스윕 검사총알·대시처럼 빠른 이동은 경로 기반으로 검사하세요.
엔진 선택에 따라 물리·충돌 기능의 완성도가 다릅니다. 아직 엔진을 고르지 않았다면 게임 엔진 선택 가이드를 먼저 참고하세요.
자주 묻는 질문
픽셀 단위로 정확하게 충돌을 검사해야 하나요?
대부분의 2D 게임은 픽셀 퍼펙트 충돌이 필요 없습니다. 사각형(AABB)이나 원으로 근사해도 플레이 감각에는 차이가 거의 없고 성능은 훨씬 좋습니다. 픽셀 단위 검사는 정말 필요한 특수한 경우에만 씁니다.
히트박스를 스프라이트와 똑같이 맞추면 안 되나요?
스프라이트 전체 크기로 히트박스를 잡으면 머리카락이나 망토 끝에 맞아도 피격 판정이 나서 억울하게 느껴집니다. 보통 캐릭터의 몸통 중심만 감싸는, 스프라이트보다 살짝 작은 히트박스를 씁니다.
빠른 총알이 벽을 통과해요.
한 프레임에 이동 거리가 물체 두께보다 크면 겹치는 순간을 건너뛰는 터널링입니다. 이동 경로를 선분으로 보고 검사하는 스윕(sweep)/레이캐스트 방식이나, 한 프레임 이동을 여러 번으로 쪼개는 방식으로 해결합니다.