tlov

로그라이크 맵 생성 방식 본문

게임개발

로그라이크 맵 생성 방식

nowitzki 2023. 7. 26. 10:45

로그라이크 장르에서는 모든 요소ㅡ물약, 무기의 스탯, 주문서 등등ㅡ가 랜덤하게 생성되고 정해집니다. 이렇게 랜덤하게 정해지는 요소들 중 로그라이크에서 가장 중요하면서도 기초적인 요소는 바로 '맵'이라고 생각합니다. 아무리 아이템, 물약 등이 랜덤하게 기능한다고 해도 항상 똑같은 맵을 플레이한다면 점점 맵에 익숙해지며 플레이어에게 '성장'하는 느낌을 줄 것입니다. 이는 곧, 로그라이크 장르의 재미를 잃어버리는 것입니다. 그런 의미에서 랜덤한 맵의 생성 방식은 로그라이크 장르에 있어 매우 중요한 주제라고 볼 수 있습니다. 그래서 이번 기회에 로그라이크 맵 생성 방식에 대해 자세히 공부해보고자 이러한 글을 쓰게 되었습니다. 참고로, 저도 이제 막 공부를 시작한 학부생이라서 정확한 정보가 아닐 수 있습니다.

 

먼저, 로그라이크 맵 생성 방식에 공통적으로 나타나는 단어가 있습니다. 바로 '절차적 생성'입니다. 이는 사람이 데이터를 일일히 직접 생성하는 방식이 아니고 컴퓨터에게 특정 알고리즘을 절차적으로 수행하게 하여 자동으로 랜덤한 데이터를 만드는 방식을 말합니다. 절차적 생성은 맵 생성에만 국한되는 단어는 아니고, 아이템, 몬스터 생성 등 여러 요소에도 활용될 수 있습니다. 그래서 보통 맵에 대해서는 '절차적 맵 생성' 이라는 단어를 사용하는 것 같습니다. 어쨌든 중요한 것은 이 과정에서 사용되는 '알고리즘'입니다.

 

한글로 인터넷에 검색해보면 대표적으로 사용되는 알고리즘은 두 가지로 보입니다. 먼저 하나는 BSP Binary Space Partitioning입니다. 이는 이름에서도 알 수 있듯이 재귀적으로 공간을 분할하는 알고리즘입니다. 이 알고리즘을 이용해 맵을 만드는 절차는 다음과 같습니다.

 

  1. 특정 사각형 공간을 두 개로 나누는 것을 n번 재귀하여 트리 형식으로 저장 (가로가 더 크면 세로줄로 나누고, 세로가 더 크면 가로줄로 나눔)
  2. 나뉘어진 각 공간을 초과하지 않는 공간을 하나씩 만듦
  3. leaf 노드를 타고 올라가면서 root노드를 만날때까지 자식 노드끼리 길을 연결 (두 개로 나뉘면서 공간이 만들어진 사각형을 서로 연결해준다.)

 

이러한 과정을 그림으로 나타내면 다음과 같습니다.

 

아이패드로 직접 그림

 

이게 현재 가장 보편적인 방법으로 사용되는 알고리즘인 것 같습니다.

 

두 번째로는 셀룰러 오토마타 Cellular Automata 알고리즘입니다. 이는 픽셀 단위의 세포 Cell들이 자신의 주변 세포의 상태에 따라 자신의 상태를 정하는 방식으로 동작합니다. 보통 자연스러운 동굴과 같은 것을 랜덤하게 만들때 사용됩니다.

 

이 알고리즘의 작동 절차는 다음과 같습니다.

 

  1. 주어진 공간 내에 무작위로 타일을 채움
  2. 각 세포마다 자신을 기준으로 3x3 타일을 만듦
  3. 기준 세포 주위의 세포를 보고 기준 세포를 변화

 

3번 과정에서 주의할 점은 기준 세포를 변화한 것을 이전 맵이 아닌 새로운 맵에 저장해야 한다는 점입니다. 즉, 항상 왼쪽 그림처럼 과정이 진행되어야 한다는 것입니다. 그리고, 테두리에 위치한 타일이라면 3번의 검사 기준을 완화하여 적용하면 됩니다.

 

https://gamedevelopment.tutsplus.com/generate-random-cave-levels-using-cellular-automata--gamedev-9664t

 

 

https://www.roguebasin.com/index.php/Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels

 

'집에갈고양' 개발자 분께서도 이 알고리즘을 응용하여 랜덤한 던전을 생성하셨더군요. 재밌게 했던 게임이 나와서 좀 반가웠습니다.

 

이렇게 대표적인 두 가지 알고리즘들을 공부해봤습니다. 이외에도 터널링 알고리즘, 여러 개의 방을 흩뿌려 길을 연결하는 알고리즘 등 많은 알고리즘들이 있습니다. 근데 이러한 절차적 생성 방식을 이용하여 생성된 맵에는 아주 치명적인 단점이 있습니다. 바로 게임이 단조로워지거나, 플레이 했을 때 재미없는 맵이 생성될 수 있다는 것입니다. 그래서 실무에서는 절차적 방식을 거의 사용하지 않고 맵에 대한 템플릿을 만들고 그 템플릿들을 랜덤으로 보여주는 방법을 이용한다고 합니다. 사용한다고 하더라도 절차적 방식으로 생성된 맵에 레벨 디자이너들이 플레이어들이 재미를 느낄 수 있도록 후처리하여 템플릿을 제작하기 때문에 100% 절차적 방식을 이용해서 만들지는 않는 것 같습니다.