Unity에서 BSP 알고리즘으로 랜덤 던전 맵 만들기
로그라이크 게임에서는 실행할 때마다 다른 던전을 자주 만납니다. 이런 맵은 규칙과 난수를 이용해 자동으로 생성합니다. 이번 글에서는 BSP 알고리즘으로 최소한의 랜덤 던전 프로토타입을 만들어봅니다.
목표
게임을 완성하는 것이 목적은 아닙니다. BSP가 실제로 방과 통로를 만드는 과정을 확인합니다.
생성 데이터를 Tilemap과 분리합니다. 이후 실제 던전으로 확장하기 쉬운 구조를 만듭니다.
결과물
40 × 30 영역을 재귀적으로 여러 공간으로 나눕니다.
각 Leaf 내부에 크기와 위치가 다른 방을 만듭니다.
BSP 트리 관계를 사용해 떨어진 방을 연결합니다.
별도 그래픽 리소스 없이 Scene 뷰에서 결과를 확인합니다.
결과물로 얻을 수 있는 기대
- BSP가 공간을 나누는 과정을 직접 확인할 수 있습니다.
- 방과 통로 데이터를 게임 그래픽과 분리할 수 있습니다.
- 같은 Seed로 특정 던전을 다시 만들 수 있습니다.
- 이후 Tilemap 던전으로 자연스럽게 확장할 수 있습니다.
- 몬스터와 아이템 배치용 방 데이터를 그대로 활용할 수 있습니다.
상세 설명
BSP 알고리즘은 무엇인가?
BSP는 Binary Space Partitioning의 약자입니다. 하나의 공간을 둘로 나누는 작업을 반복합니다.
처음에는 전체 맵 하나만 존재합니다. 이 공간을 두 영역으로 나눕니다.
나눈 영역을 다시 둘로 나눕니다. 일정 깊이에 도달하면 분할을 멈춥니다.
BSP 자체가 방을 만드는 것은 아닙니다. 먼저 방이 들어갈 후보 공간을 나눕니다.
실제 방의 크기와 위치는 각 Leaf 안에서 따로 계산합니다.
프로토타입 구성
복잡한 구조는 사용하지 않습니다. 하나의 생성 스크립트에서 핵심 알고리즘을 확인합니다.
Scene 뷰에서는 색으로 생성 데이터를 구분합니다.
1단계. 공간 나누기
분할 가능한 크기인지 검사합니다
방보다 BSP 영역이 먼저 충분한 크기를 가져야 합니다. 방 주변의 Padding도 확보해야 합니다.
최소 방 크기가 4이고 Padding이 1이라면 최소 Leaf 크기는 6입니다.
두 자식 모두 방을 가져야 합니다. 그래서 최소 Leaf 크기의 두 배가 필요합니다.
긴 방향을 우선해 나눕니다
가로가 길면 세로로 자릅니다. 세로가 길면 가로로 자릅니다.
이 기준은 지나치게 길쭉한 공간이 생기는 현상을 줄입니다.
너무 작은 Leaf를 만들면 방 크기의 랜덤 범위가 잘못될 수 있습니다.
먼저 분할 조건을 제한하면 이 문제를 구조적으로 막을 수 있습니다.
2단계. Leaf 안에 방 만들기
더 이상 나누지 않은 영역을 Leaf라고 부릅니다. 각 Leaf에 실제 방을 하나 만듭니다.
먼저 Padding을 제외한 최대 방 크기를 구합니다. 이후 최소값과 최대값 사이에서 방 크기를 선택합니다.
방 위치도 Leaf 내부에서 랜덤하게 선택합니다. 따라서 방은 BSP 경계를 벗어나지 않습니다.
방 데이터를 렌더링 방식과 분리할 수 있습니다. 나중에 Tilemap에서도 같은 좌표를 사용할 수 있습니다.
3단계. 방과 방 연결하기
방만 만들면 서로 떨어진 섬처럼 남습니다. 따라서 모든 방을 이동 가능한 구조로 연결해야 합니다.
각 BSP 부모는 두 자식에서 대표 방을 하나씩 가져옵니다. 두 방의 중심을 L자 통로로 연결합니다.
통로는 두 방식 중 하나를 무작위로 선택합니다.
- 가로 이동 후 세로 이동
- 세로 이동 후 가로 이동
이 작업을 BSP 부모마다 반복합니다. 최종적으로 모든 영역이 하나의 연결 구조를 가집니다.
Seed를 사용하는 이유
랜덤 던전은 실행할 때마다 다른 결과를 만드는 것이 자연스럽습니다. 개발 중에는 같은 맵을 다시 볼 필요도 있습니다.
같은 설정과 Seed를 사용하면 같은 던전 구조를 다시 얻을 수 있습니다.
- 특정 던전에서 발생한 버그를 재현할 수 있습니다.
- 다른 사용자와 동일한 맵을 공유할 수 있습니다.
- 자동 테스트에서 랜덤 결과를 고정할 수 있습니다.
- 특정 던전을 다시 플레이하도록 만들 수 있습니다.
Unity에서 실행하기
씬을 엽니다
Assets/BSPPrototype/Scenes/BspPrototype.unity를 엽니다.
Gizmos를 켭니다
Scene 뷰 오른쪽 위에서 Gizmos를 활성화합니다.
Generate를 실행합니다
Play를 누르면 맵을 생성합니다. 컴포넌트 메뉴의 Generate에서도 직접 실행할 수 있습니다.
Seed를 변경합니다
Inspector에서 Seed 값을 바꿉니다. 다시 생성하면 다른 던전 구조를 확인할 수 있습니다.
이번 단계에서 일부러 제외한 기능
- Tilemap 바닥과 벽
- 문과 장식 오브젝트
- 플레이어 시작 위치
- 몬스터와 아이템 배치
- A* 경로 탐색
- 방 종류와 특수 룸
- 맵 저장과 불러오기
처음부터 기능을 많이 넣으면 BSP 자체를 검증하기 어렵습니다.
먼저 방과 통로 좌표를 검증합니다. 그 다음 Tilemap과 게임 시스템을 추가하는 편이 안전합니다.
다음 단계
다음 단계에서는 RectInt 방 데이터를 Tilemap에 전달하면 됩니다.
방 영역에는 바닥 타일을 배치합니다. 통로 좌표에도 바닥 타일을 이어서 배치합니다.
마지막으로 바닥 주변을 검사해 벽을 생성하면 실제 던전 형태를 만들 수 있습니다.
이번 프로토타입의 핵심 흐름은 단순합니다.
공간을 나누고, 방을 만들고, 방 사이를 통로로 연결합니다.
Tilemap보다 논리 데이터를 먼저 검증하면 문제를 찾기 쉽습니다.
BSP 구조가 안정적으로 동작하면 실제 게임용 던전으로 확장할 수 있습니다.
전체 코드
'Unity > 정보. 코드들' 카테고리의 다른 글
| Unity 6.6 2D Profiler — Sprite Atlas 테스트 (0) | 2026.09.17 |
|---|---|
| Unity Domain Reload 끄면 왜 static 값이 남을까? (1) | 2026.09.17 |
| 유니티 6.5 - URP 2D Light (0) | 2026.09.10 |
| 애플 개인정보 정책 변경 (0) | 2024.02.26 |
| AssetPostprocessor.OnPostprocessPrefab 프리팹, 생성전, 저장전에 호출되는 함수 (0) | 2021.11.26 |





































