
타격 판정 기획: 스킬 영역(AoE) 레이캐스트 히트박스와 피격박스의 명확한 판정 분리
게임 개발에서 타격 정확도와 판정 성능을 확보하기 위해 공격 히트박스와 피격박스를 엄격히 분리하고 광역 스킬(AoE)과 레이캐스트를 연동하는 판정 기획 구상을 다룹니다.
히트박스(Hitbox)와 피격박스(Hurtbox)의 역할 분리
액션 게임이나 RPG를 개발할 때 판정 시스템의 명확성은 액션의 쾌감과 게임 플레이의 공정성을 결정짓는 핵심 요인입니다. 공격 판정을 설계할 때 흔히 범하는 실수 중 하나는 캐릭터의 단일 콜라이더(Collider)를 공격과 피격 용도로 겸용하는 것입니다. 이 경우 공격 프레임 동안 콜라이더의 크기를 조절하거나 속성을 변경하는 방식이 사용되기도 하지만 이는 동시 다발적인 판정 충돌이나 자가 피격(Self-damage) 문제 등 심각한 부작용을 초래하기 쉽습니다.
이를 해결하기 위한 정석적인 기획 구조는 공격 전용 판정인 히트박스(Hitbox)와 피격 전용 판정인 피격박스(Hurtbox)를 기하학적으로나 물리 레이어적으로 완벽히 분리하는 것입니다.
- 히트박스 (Hitbox): 무기 끝, 투사체, 스킬 효과 범위 등 공격 주체가 데미지를 주기 위해 특정 순간에 생성하는 영역입니다.
- 피격박스 (Hurtbox): 캐릭터의 피격 가능 부위를 감싸고 있으며 상시 또는 무적 상태를 제외한 프레임 동안 활성화되는 피해 수신 영역입니다.
물리 엔진 설정에서 히트박스 레이어는 오직 피격박스 레이어하고만 충돌 반응(Overlap/Trigger Event)을 일으키도록 마스크를 설정합니다. 이렇게 레이어를 세분화하면 지형지물 콜라이더나 공격 주체끼리의 불필요한 연산 비용을 획기적으로 줄일 수 있습니다.

광역 스킬(AoE)의 범위 판정 수식
원형이나 부채꼴 모양의 광역 스킬(Area of Effect)을 처리할 때 단순 물리 콜라이더의 반응에만 의존하면 프레임 드랍이나 빠른 개체 이동 시 타격이 누락되는 문제가 발생할 수 있습니다. 따라서 기획 단계에서 수식을 통한 지오메트리 영역 검증 기법을 조합하는 것이 안정적입니다.
부채꼴 형태의 스킬 범위를 판정할 때는 중심점으로부터 타겟까지의 거리와 캐릭터 정면 바라보기 벡터와의 사잇각을 사용합니다. 스킬 발동 위치를 , 타겟의 피격박스 위치를 , 캐릭터 정면 방향 유닛 벡터를 , 부채꼴 반경을 , 전방 사잇각을 라 할 때 거리 검사는 다음과 같습니다.
이어 타겟 방향으로의 단위 벡터 와의 내적을 이용하여 각도 조건 만족 여부를 검증합니다.
이 두 조건을 동시에 만족하는 피격박스 개체만을 1차 타격 후보군으로 선별합니다.
장애물 차단을 고려한 레이캐스트(Raycast) 보완
지오메트리 수식이나 물리 Overlap 검사만으로는 얇은 벽 너머에 있는 적까지 타격되는 일명 ‘벽 뚫기’ 문제가 발생합니다. 직관적이고 납득 가능한 판정을 완성하려면 1차 추출된 타격 대상들에 대해 레이캐스트 검사를 추가로 수행하여 시야 및 지형 장애물 차단(Occlusion) 여부를 확인해야 합니다.
graph TD
A[스킬 발동 시점] --> B[AoE 영역 내 Hurtbox 탐색]
B --> C{Target Hurtbox 존재?}
C -- 없음 --> D[판정 종료]
C -- 있음 --> E[발동 위치에서 Hurtbox 중심으로 Raycast 발사]
E --> F{중간 장애물 차단 여부?}
F -- 장애물 있음 --> G[타격 무효 처리 Occluded]
F -- 장애물 없음 --> H[데미지 및 상태 변화 적용]
1차 검출된 피격박스의 중심점 혹은 주요 피벗 위치를 향해 레이캐스트를 발사했을 때 피격박스에 도달하기 전 엄폐물(Obstacle) 레이어와 먼저 충돌한다면 해당 타격은 무효 처리됩니다.

실전 구현을 위한 C# 코드 구조
유니티(Unity) 환경을 기준으로 광역 히트박스 검출 및 레이캐스트 Occlusion 확인을 일괄 처리하는 C# 코드 예시입니다.
using UnityEngine;
using System.Collections.Generic;
public class SkillHitboxEvaluator : MonoBehaviour
{
[SerializeField] private LayerMask hurtboxLayer;
[SerializeField] private LayerMask obstacleLayer;
public List<Collider> EvaluateConeAoE(Vector3 origin, Vector3 forward, float radius, float angleDegree)
{
List<Collider> validTargets = new List<Collider>();
Collider[] overlapColliders = Physics.OverlapSphere(origin, radius, hurtboxLayer);
float cosHalfAngle = Mathf.Cos((angleDegree * 0.5f) * Mathf.Deg2Rad);
foreach (var col in overlapColliders)
{
Vector3 targetPos = col.bounds.center;
Vector3 dirToTarget = (targetPos - origin);
float distance = dirToTarget.magnitude;
if (distance <= 0.001f) continue;
dirToTarget /= distance;
// 1. 각도 검사
if (Vector3.Dot(forward, dirToTarget) >= cosHalfAngle)
{
// 2. 레이캐스트 장애물 검사
if (!Physics.Raycast(origin, dirToTarget, distance, obstacleLayer))
{
validTargets.Add(col);
}
}
}
return validTargets;
}
}
이와 같이 1차 범위 검사와 2차 레이캐스트 시선 검사를 결합하면 복잡한 액션 게임에서도 연산 효율성을 유지하면서 정밀한 판정 시스템을 구현할 수 있습니다.
정리
스킬 및 공격 판정 시스템 설계 시 히트박스와 피격박스의 물리 레이어를 명확히 구분하는 것은 안정적인 기초 구조를 다지는 첫걸음입니다. 여기에 단순 콜라이더 연산에 의존하지 않고 각도 및 거리 수식 검사와 장애물 차단을 체크하는 레이캐스트 검증을 결합하면 플레이어가 납득할 수 있는 정밀한 타격 시스템을 구축할 수 있습니다.


