로그라이크 게임을 만들기 위해서 랜덤 맵 생성 기능을 만들다가
현재 버전까지 만들어놓고 개발을 중단한 지 수개월이 지났다.
밑에 배경을 깔고, 나무나 바위같은 오브젝트들도 랜덤으로 배치하는 기능까지 추가하고 싶었지만
만들려는 게임의 기획이 또 바뀌면서, 지금까지 한 게 기억 속에서 잊힐 것 같아서
블로그에 내용을 정리라도 하기로 마음 먹었다.
참고로 신입 때 제작했던 포트폴리오에서는 두 가지의 던전 타입을 만들었던 경험이 있다.
위에는 Tiled라는 고전 타일 에디터로 캔버스 위에 바닥 타일과 오브젝트 타일들을 단순하게 그린 방식이고,
아래는 에셋을 구매한 뒤 수정을 한 방식이다. 수정을 하면서 절차적 맵 생성(Procedural Map Generation)을 공부하게 됐다.
에셋은 완벽하게 본인이 처음부터 만든 것처럼 자유자재로 수정하기 어려운 부분이 있다.
내 입맛에 맞는 랜덤 던전은 아래의 조건들이 추가로 필요했다.
- 시작과 끝 지점이 명확할 것
- 타일셋만 갈아 끼우면 스크립트나 씬을 수정하지 않아도 초원 맵, 설원 맵, 사막 맵 등을 만들 수 있어야 함
- 만든 맵 정보를 2차원 배열 정도의 데이터로 저장할 수 있고, 이 데이터만으로 맵을 똑같이 만들 수 있어야 함
(게임 플레이를 하다 재접속했을 때의 처리를 하기 위해, 그리고 내가 2차원 배열 형태의 길 찾기 알고리즘에 익숙해서)
- 맵의 크기, 길의 방향, 룸의 개수, 룸의 크기, 연결 횟수 등을 인스펙터 창이나 설정 파일로 간단하게 조작할 수 있어야 함
이번에 만든 기능은 위의 조건들이 완벽하진 않아도 대부분 구현을 해냈다고 생각한다.
타일을 캔버스에 직접 그린다면, 그림을 보고서 가운데는 A 타일을 쓰고
좌상단 끝 매듭은 C타일, 우하단은 F타일을 배치하면 되지만
캔버스에 타일을 완전한 자동으로 그리는 것이 목표였기 때문에 Tile Drawing은 Rule Tile을 활용했다.
그리고 또 자동으로 타일을 그리기 위해서는 좌표 (7,11)은 캐릭터가 올라갈 수 있는 이어진 땅인지 아닌지에 대한
Input 데이터가 필요한데, 이 랜덤 데이터를 생성하는 부분은
절차적 맵 생성(Procedural Map Generation)과 셀룰러 오토마타(Cellular Automata) 방식을 결합했다.
정확히는 셀룰러 오토마타가 절차적 맵 생성을 구현하는 도구로서 쓰였으며
Procedural Map Generation with(using) Cellular Automata 키워드로 검색하면 나오는 문서들을 많이 참고했다.