Hitbox with DNFTransform
#️⃣ 들어가며
카메라를 회전하지 않고 2.5D 좌표계를 구현하는 과정에서, 기본적으로 제공되는 Unity의 Collider 시스템으로는 불필요한 충돌 연산으로 인해 게임 로직에 불편함을 초래했다. 이번 글에서는 Unity의 충돌 시스템이 2.5D에 적합하지 않은 이유와, 불필요한 충돌을 방지하고자 커스텀 Hitbox 시스템을 설계하고, 이를 Scene UI와 Inspector 창에서 직관적으로 조절할 수 있는 Unity 에디터 툴을 개발한 과정에 대해 정리했다.
1️⃣ 기존 Collider 시스템의 한계
❗ 복수 평면(XY, XZ) 충돌 처리가 필요한 2.5D 구조
2.5D 게임에서는 이동, 점프, 스킬 발동 등이 모두 XY 또는 XZ 평면에 따라 다르게 동작한다. MakeDNF 프로젝트는 Unity의 2D 플랫폼을 사용하기에, 2.5D 좌표계를 구현하기 위해선 하나의 오브젝트에 총 두 개의 Collider 컴포넌트를 부착해야 한다. 기껏 DNFTransform 컴포넌트를 개선하면서 필요한 오브젝트의 수를 줄였으나, 다시 오브젝트의 수를 늘리는 상황이 발생한 것이다.
❗ 같은 평면 내부에서도 불필요한 충돌 이벤트 발생
그래도 두 개의 오브젝트를 추가해서 구현할 수는 있다. 이후 XY 평면과 XZ 평면을 가리키는 Collider 컴포넌트의 충돌 이벤트는 Tag를 통해서 충돌 연산을 수행하지 않도록 설정할 수 있다. 하지만, 같은 평면(XY 또는 XZ)에 있는 Collider 컴포넌트끼리는 물리적으로 충돌하지 않아야 하더라도 OnTriggerEnter2D 등의 이벤트가 호출되며 이로 인해 추가적인 문제점이 발생한다.
- 실제로 충돌하지 않은 오브젝트 간에도 충돌 이벤트 발생
- 불필요한 충돌을 예외 처리하기 위한 추가 로직 필요
- 오브젝트 수가 많아지면 성능 및 관리 측면에서 부담 가중
📸 예시 상황
아래의 이미지는 실제 게임 상황에서 발생한 예시이다.
- 파란색 박스 : 캐릭터 오브젝트의 XY 평면 2D Collider
- 초록색 박스 : 파이어볼 오브젝트의 XY 평면 2D Collider
두 오브젝트는 Z 축 기준으로 보면 명확히 다른 깊이(Z 값 차이)에 위치해 있다. 즉, 두 오브젝트는 충돌하지 않았기 때문에 충돌 검사 로직을 수행할 필요가 없다. 그럼에도 불구하고, Unity 2D 물리 엔진에선 두 Collider 컴포넌트가 충돌했다고 인지하기에, 불필요한 충돌 이벤트가 발생하게 된다.
2️⃣ 해결책 : 커스텀 Hitbox 시스템 도입
위 문제를 해결하기 위해, 충돌 처리를 Unity의 Collider 컴포넌트가 아닌 게임 로직 레벨에서 직접 구현하는 커스텀 Hitbox 시스템을 설계했다.
✅ 설계 요소
요소 | 설명 |
Size | Hitbox의 가로, 세로, 깊이 (Z 축은 Hitbox의 모양이 원형일 경우 무시됨) |
Offset | 오브젝트의 기준 위치로부터 Hitbox의 상대 좌표 |
Pivot | Scale 연산의 기준점 (0 ~ 1 범위) |
이 세 가지 요소를 기반으로, 오브젝트는 각자 충돌 영역을 계산하고, 게임 로직 내에서 이를 기준으로 충돌 여부를 판단한다.
3️⃣ 손쉬운 설정을 위해! Hitbox Editor Tool
다만 직접 구현한 Hitbox는 Unity의 Collider 컴포넌트와 달리 Scene에서 시각적으로 확인할 수 없다는 단점이 있었다. 이를 보완하고자, Hitbox의 위치와 크기를 실시간으로 시각화하고 조절할 수 있는 Editor Tool을 제작했다. 또한, 모드 전환을 위한 단축키 입력 기능을 통해 사용성이 개선되도록 구현했다.
🎛️ 편집 모드 단축키
단축키 | 기능 |
F1 | NONE 모드 (비활성화) |
F2 | SIZE 모드 (히트 박스 크기 조절) |
F3 | OFFSET 모드 (히트 박스 위치 조절) |
F4 | PIVOT 모드 (히트 박스 Scale 연산을 위한 기준점 조절) |
Left Ctrl | 수정할 평면 전환 (XZ $\leftrightarrow$ XY) |
👁️ 시각화 기능
- Gizmos를 이용해 실시간으로 Hitbox를 시각화
- 선택된 오브젝트에 대해 화살표 헨들(Handle)을 통해 직관적으로 조절 가능
- 좌표계에 맞게 평면 전환이 가능하여 XY/XZ 혼합 개발에 유리
💬 회고
처음 충돌 시스템을 구현할 때는 Unity의 2D Collider 시스템을 활용해 간단하게 처리할 수 있을 것이라 생각했다. 그러나 XY와 XZ 평면이 혼재된 2.5D 구조에서는 충돌 이벤트가 불필요하게 발생하는 문제가 있었고, 이를 해결하기 위한 예외 처리 로직이 점차 구조를 복잡하게 만들었다.
해당 문제를 해결하기 위해 구조를 다시 분석했고, 물리 엔진에 의존하기보다 충돌 판정을 직접 제어하는 커스텀 Hitbox 시스템이 더 적합하다는 결론에 도달했다. 그러나 직접 구현한 Hitbox는 Scene에서 확인이 불가능해 설정 과정이 불편했고, 이를 보완하기 위해 에디터 툴을 개발하게 되었다.
이번 경험을 통해 Unity가 제공하는 물리 시스템이 항상 최적의 해답은 아니라는 점을 체감할 수 있었다. 특히 2.5D처럼 복합적인 좌표계를 사용하는 게임 구조에서는, 구조적인 한계를 명확히 인식하고 그에 맞는 커스텀 설계로 문제를 해결하는 접근이 중요하다는 점을 배웠다. 또한 에디터 툴을 직접 제작하면서 개발 과정에서의 반복 작업을 얼마나 효율적으로 줄일 수 있는지 체감했고, 이러한 도구 개발이 유지보수성과 개발 생산성에 미치는 긍정적인 영향도 확인할 수 있었다.