이전 포스팅에서 공간을 나누어보았다. 이번에는 크게 설명할 게 없다.
목표는 다음과 같다. 분할된 공간 안에 임의의 사이즈의 직사각형 룸을 생성하는 것이다.
이해를 위해 먼저 결과물을 보면 사진과 같다. 미리 분할해놓은 공간 안에 임의의 위치, 임의의 사이즈의 룸을 생성한다.
이 부분은 각자 취향대로 구성할 수 있다. 하지만 나는 다른 사이트를 참고하여 만들었다.
다음과 같은 순서로 진행한다.
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