본문 바로가기
카테고리 없음

[Unity]BSP(Binary Space Partitioning)를 이용한 던전 룸 생성 - 02

by 개발펭귄 2023. 7. 13.

이전 포스팅에서 공간을 나누어보았다. 이번에는 크게 설명할 게 없다.

 

목표는 다음과 같다. 분할된 공간 안에 임의의 사이즈의 직사각형 룸을 생성하는 것이다.

이해를 위해 먼저 결과물을 보면 사진과 같다. 미리 분할해놓은 공간 안에 임의의 위치, 임의의 사이즈의 룸을 생성한다.

이 부분은 각자 취향대로 구성할 수 있다. 하지만 나는 다른 사이트를 참고하여 만들었다.

 

다음과 같은 순서로 진행한다.

1. 공간의 중심좌표에서 랜덤하게 이동한 새로운 좌표를 구해준다.

2. 랜덤하게 길이, 높이를 빼주어 룸을 구성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void InitRoomSizeBySpace(int minPadding, int maxPadding)
    {
        int deltaX = UnityEngine.Random.Range(minPadding, Mathf.FloorToInt(_spaceSize.width / (float)maxPadding));
        int deltaY = UnityEngine.Random.Range(minPadding, Mathf.FloorToInt(_spaceSize.height / (float)maxPadding));
        int x = _spaceSize.x + deltaX;
        int y = _spaceSize.y + deltaY;
        int w = _spaceSize.width - deltaX;      //이동한 좌표만큼 빼줘서 길이를 맞춰준다.
        int h = _spaceSize.height - deltaY;
 
        w -= UnityEngine.Random.Range(minPadding, w / maxPadding);
        h -= UnityEngine.Random.Range(minPadding, h / maxPadding);
 
        //홀,짝수 길이 보정
        int roomWidth = (w % 2 == 0) ? w - 1 : w;
        int roomHeight = (h % 2 == 0) ? h - 1 : h;
 
        _roomSize = new RectInt(x, y, roomWidth, roomHeight);
    }
cs

간단하게 코드설명을 하면 3,4번 줄에서 새로운 중심좌표를 구하기 위해 더해줄 랜덤한 좌표 deltaX,Y를 구한다. 이 때, 최소 패딩값을 두어 "최소한 이만큼은 떨어뜨려 놓자~" 하는 값을 넣으면 더 보기 좋게 나온다.

 

구한 랜덤값 delta를 기존 x,y좌표에 더해 중심을 이동시킨다. 그리고 이동시킨만큼 길이,높이에 delta를 빼주어 길이를 유지시켜준다.

 

Math.FloorToInt() 의 경우 입력받은 값보다 작거나 같은 가장 큰 Integer 값을 리턴한다.

예)

10.0f  => 10

10.2f => 10

-10.2f => -11

 

14, 15번 줄은 나중에 벽을 세우기 위해 사이즈를 보정한 값인데 지금은 무시해도 좋다.

 

최종값으로 17번줄에 새롭게 설정한 중심좌표x,y와 길이,높이를 넣어주어 초기화한다.

 

 

참고사이트: Dungeon generation using BSP trees | eskerda.com

작업물 깃허브: https://github.com/AntarticPenguin/DungeonRogueLike