CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·방탄소년당 ·일본산당 ·MaClien ·개발한당 ·자전거당 ·안드로메당 ·키보드당 ·패스오브엑자일당 ·나스당 ·클다방 ·이륜차당 ·AI당 ·퐁당퐁당 ·디아블로당 ·소시당 ·배드민턴당 ·테스트당 ·PC튜닝한당 ·총쏜당 ·달린당 ·미끄러진당 ·야구당 ·뚝딱뚝당 ·ADHD당 ·냐옹이당 ·꼬들한당 ·콘솔한당 ·IoT당 ·활자중독당 ·리눅서당 ·날아간당 ·3D메이킹 ·X세대당 ·AI그림당 ·사과시계당 ·육아당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·볼링친당 ·캠핑간당 ·문명하셨당 ·클래시앙 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·패셔니앙 ·물고기당 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·젬워한당 ·걸그룹당 ·안경쓴당 ·골프당 ·차턴당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·영화본당 ·MTG한당 ·소리당 ·노키앙 ·적는당 ·방송한당 ·바다건너당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·라즈베리파이당 ·품앱이당 ·리듬탄당 ·노젓는당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·축구당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·테니스친당 ·빨콩이당 ·공대시계당 ·여행을떠난당 ·터치패드당 ·트윗당 ·가상화폐당 ·창업한당 ·VR당 ·시계찬당 ·WebOs당 ·소셜게임한당 ·위스키당 ·와인마신당 ·WOW당 ·윈폰이당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

개발한당

강좌와팁 자동 던전 생성 알고리즘 17

23
2021-06-04 18:08:31 121.♡.149.101
노쇠한엔지니어

안녕하세요. 아직 이름이 없는 인디 게임을 혼자 만들고 있는 개발자입니다. 최근에 몇몇 기술적 내용들을 글로 정리하고 있는데 이곳에도 공유드립니다. 여기엔 게임을 만드는 분들은 얼마 없는것 같지만 도움이 될 분들이 있으셨음 좋겠네요. 


내용은 자동 던전 생성에 관련된 내용입니다. 



-----

게임 P3(코드네임, 아직 이름 없음)는 로그라이크 던전 크롤러 장르의 게임입니다. 장르의 특성상 던전은 매 플레이마다 매번 새로 만들어져야 합니다. 프리셋을 많이 만드는 방법도 있겠지만, 사람이 편집하는 수고를 덜게 자동으로 던전을 생성하는 방법을 구현하고자 합니다. 던전 자동 생성은 게임 제작 분야에서 오랫동안 노력해왔던 주제로 다양한 방법이 있습니다. P3의 던전은 주로 동굴 형태입니다. 이 포스트에서는 동굴 형태의 던전을 괜찮은 퀄리티로 자동 생성하는 방법에 대해 이야기 해보겠습니다.


키 아이디어

동굴은 방(Room)과 복도(Corridor)의 조합으로 표현될 수 있습니다. 복잡한 형태의 동굴도 여러개의 방과 방사이를 잇는 복도의 집합으로 모델링 될 수 있습니다. 따라서 다음과 같이 두단계의 아주 단순한 방식으로 동굴을 만들어 낼 수 있습니다.

  1. 랜덤한 위치의 방을 생성
  2. 방과 방을 복도로 연결

랜덤 방의 생성

방과 방은 너무 멀지 않아야 하고 영역이 겹치면 안됩니다. 여러가지 솔루션들이 있겠지만 저는 나선을 따라 방을 배치하는 단순한 방법을 이용했습니다. 중점에서 거리 r 만큼 되는 점을 선택합니다. 중점에서 이 점까지 이어지는 vector를 v라고 하겠습니다. v를 조금씩 회전시키면서 새로운 방을 생성합니다. v가 회전될때마다 r을 조금씩 늘립니다.

  1. 나선을 따라 여분을 포함한 K개의 방을 생성
  2. 그중 N개의 방만을 랜덤하게 선택

나선이 중요한 것은 아닙니다. 공간상에 방들을 적절히 배치할수 있는 다른 방법을 사용하셔도 됩니다.


방과 방을 연결 #1

이제 어떤 방과 어떤 방을 이어줘야 할지 정해야 할 단계 입니다. 

  1. 모든 방을 메시화 해줍니다. 방의 중앙의 점들로 Delaunay triangulation 알고리즘을 적용하면 모든 방을 아래와 같은 메시로 이어줄 수 있습니다. 이 알고리즘은 구현이 복잡해서 직접 구현하는 것 보다는 github에서 구현된 코드를 찾는것을 추천드립니다.
  2. 모든 방이 연결되면 재미가 없습니다. 필요 없는 연결은 제거합니다. MST(Minimum Spanning Tree) 를 이용하면 모든 방을 지나는 최소 비용(가장 짧은)의 연결 을 만들 수 있습니다.
  3. 하지만 MST만을 이용하면 맵에 루프가 없기 때문에 맵이 단조로워 져서 약간의 선을 더 이어서 루프가 있게 만들어 줍니다. 


아래의 푸른색 선이 연결된 방과 방의 정보입니다. 



방과 방을 연결 #2

위에서 어떤 방과 어떤 방을 이어야 하는지 까지 정했습니다. 이 단계에서는 실제로 방과 방을 잇습니다.  

  1. 동굴의 방들이 정사각형이라면 자연스럽지가 않기 때문에 각 방에 약간의 노이즈들을 추가합니다. 
  2. 방과 방은 A* 알고리즘을 이용해서 path를 구합니다. 
  3. 연결된 path에 약간의 노이즈를 추가해서 복도를 구성합니다. 


부드럽게 만들기

너무 복잡한 부분들을 부드럽게 할 차례 입니다. Cellular Automata 알고리즘을 이용합니다. 이 알고리즘은 마치 대패질을 하는 것과 비슷하게 동작합니다. 튀어나오고 각진 부분을 없애 버립니다. 4~5번 반복적으로 알고리즘을 적용시켜서 각진 부분을 제거합니다. 아래 파란색 부분이 이 알고리즘에 의해 Smoothing 된 부분입니다. 


페인팅

다 되었습니다. 이제 생성된 맵을 타일들로 잘 칠해주고 오브젝트들을 배치하는 일만 남았습니다. 이 부분은 생성과는 상관 없는 부분이라 설명을 생략하겠습니다. 아래는 P3에서 타일 페인팅과 오브젝트 배치가 끝난 후의 모습입니다.


결론

지금까지 동굴을 자동으로 생성하는 방법에 대해 알아봤습니다. 이 방식은 플레이마다 매번 다른 맵을 자연스럽게 만들 수 있다는 것이 장점입니다. 다만 구현에 다소 난이도가 있는 것이 단점입니다. 도움이 되었길 바랍니다. 



---


간혹 기술적인 문서들 정리할 때마다 공유 드리겠습니다~

언제 출시할지 기약없지만(이 속도로 가능하긴 할지..) 만들고 있는 게임(https://concode-studio.itch.io/p3)도 관심 부탁드릴께요.

감사합니다. 



출처 : https://concode-studio.itch.io/p3/devlog/260310/cave-dungeon-generation
노쇠한엔지니어 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [17]
공동명의
IP 211.♡.156.179
06-04 2021-06-04 18:14:55
·
좋은 내용 감사합니다.
딸자랑마스터
IP 59.♡.176.160
06-04 2021-06-04 18:19:24
·
잘 봤습니다 배우고 갑니다~
달려라쑈바
IP 14.♡.67.157
06-04 2021-06-04 18:53:21
·
좋은 내용 감사합니다. 스크랩 해갈께요
노쇠한엔지니어
IP 121.♡.149.101
06-04 2021-06-04 20:46:18
·
@달려라쑈바님 넹 감사합니다~
롤케익
IP 222.♡.192.15
06-04 2021-06-04 20:51:07
·
역시 알고리즘이 중요하군요.
화이팅입니다.
노쇠한엔지니어
IP 121.♡.149.101
06-04 2021-06-04 23:18:02
·
@롤케익님 감사합니다~ 게임쪽이 비교적 좀더 쓸일이 있는것 같습니다.
닭나루
IP 58.♡.97.79
06-05 2021-06-05 03:31:13
·
Cellular automata 사용한 부분이 인상적이네요. 인접한 4개가 살아있으면 새로 생기고, 죽는 세포는 없는 규칙인가요?
노쇠한엔지니어
IP 121.♡.149.101
06-05 2021-06-05 08:55:14 / 수정일: 2021-06-05 08:57:26
·
@닭나루님 네 맞습니다! 정확히는 5개 이상이면 새로 생기는 규칙입니다. 빈곳을 기준으로 생각하면 뾰족한 부분(주변에 살이있는 셀이 많은부분)이 깎이게 됩니다.
BlaCk
IP 172.♡.32.12
06-05 2021-06-05 17:15:31
·
게임쪽 아닌데 스샷까지 넣어 풀어서 써주셔서 이해가 잘되네요. 겜 개발하시는 분들은 유용할듯요.
노쇠한엔지니어
IP 121.♡.149.101
06-05 2021-06-05 20:33:12
·
@BlaCk님 감사합니다~
RaphKay
IP 118.♡.128.241
06-05 2021-06-05 22:05:41
·
저는 예전에 게임 만들때 특정 matrix 를 만들고 각 모서리 마다 node 를 연결 할 수 있게 만든다음 ...
엉뚱하게 pixel matrix 처럼 네모들 ( 8x8 같은, 방이 되는 조건 ) 을 rand() 로 그리고, 그 사이마다 line 을 그린다음 blur kernel 로 대충 뭉개서 빠른 방 생성을 한거 같은데, 이거랑 비슷한거 같기도 하네요 !
노쇠한엔지니어
IP 121.♡.149.101
06-06 2021-06-06 11:12:27
·
@견족자K님 부드럽게 하는데 blur kernel 을 이용하는 방법도 있겠네요
신의한수
IP 182.♡.139.90
06-06 2021-06-06 10:28:15
·
멋집니다!
노쇠한엔지니어
IP 121.♡.149.101
06-06 2021-06-06 11:20:34
·
@신의한수님 감사합니다~
트롤나그네
IP 71.♡.1.241
06-06 2021-06-06 15:28:29
·
우왕 자주 올려주세요~~ 저는 겜이랑 연관이 전혀 없어서 이런거 보면 재밌네요 ㅎㅎ
노쇠한엔지니어
IP 121.♡.149.101
06-06 2021-06-06 19:33:00
·
@트롤나그네님 종종 기술적인것들 정리할때마다 공유드릴께요~~
노쇠한엔지니어
IP 121.♡.149.101
06-13 2021-06-13 08:39:17
·
결과가 궁금하신 분들은 여기서 테스트도 가능해요~
https://concode-studio.itch.io/the-way-home
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.