언리얼 엔진 5 / Procedural Dungeons ( 절차적 던전 생성 ) 1

절차적 던전이란?

컴퓨터 알고리즘을 이용해 자동으로 생성된 던전을 말합니다. 미리 만들어둔 구조물들이 규칙에 따라서 생성되거나, 랜덤하게 생성되게 할 수 있습니다.

 

참고 영상

https://www.youtube.com/watch?v=4ddbnQIuwAM

 

던전에 사용 될 방 액터 만들기

던전을 생성하기에 앞서 우리는 던전 위에 올려둘 방들이 필요합니다. 

캡슐화를 위해서 가장 기본이 되는 방을 먼저 만들도록 하겠습니다.

 

1. 큐브 메시를 이요해 바닥과 벽을 만듭니다. ( 문이 있어야 할 공간은 비워줍니다. )

 

2. 박스 콜리전을 꺼내서 바닥 큐브보다 조금 더 작은 크기로 겹쳐둡니다.

3. Arrow 컴포넌트를 활용해 던전의 방향을 표시해줍니다. ( 가시성을 위해 )

4. 자식 클래스에서 활용하기 쉽도록 컴포넌트들을 씬 컴포넌트로 모아서 정리해줍니다.

5. 만든 방의 위치는 y축만 0으로 하고  x축 0지점엔 방의 시작지점이 오도록 합니다.

문을 막을 엑터

1. 방의 문크기와 같은 큐브를 만들어 위치를 맞춥니다.

기본 방을 상속받는 자식 방 만들기 ( 실제 던전 생성에 사용될 방 )

자식 클래스에서는 각 문이 있어야 할 위치에 Arrow 컴포넌트를 붙여줍니다. ( 추후 다른 방을 이어 붙이고, 사용하지 않는 문은 막기 위함 )

 

 

전을 생성하는 액터 만들기

필요 변수 및 이벤트

Spawn Start Room

1. 처음 방을 생성 그 방에 문 ( Arrow 컴포넌트 )들을 배열에 저장

씬컴포넌트로 묶어뒀기 때문에 Get 으로 씬컴포넌트를 가지고와서 그 안에 컴포넌트들을 Append함

 

Spawn Next Room

2. 다음 방 생성 저장해둔 Arrow컴포넌트 배열중 ( 기본 방은 3방향 )랜덤으로 가지고 와서 방 생성하기

생성할 방은 배열로 여러개를 저장해뒀다가 그중에 랜덤으로 뽑습니다.

생성한 방은 Latest Room에 넣어줍니다. ( 추후에 Overlap 체크를 위해 )

딜레이를 붙여주는 이유는 방을 생성할때 딜레이가 없을 경우 무한루프가 남

마지막에 붙어있는 이벤트는 방끼리 중복되었는지 체크해서 제거후 생성해주는 역할

 

Add Overlapping

3. 설치된 방에서 박스 콜리전을 가져와 ( 반복문인 이유는 박스 콜리전 개수를 늘릴수도 있기 때문 ) 오버랩되는 컴포넌트를 배열에 추가합니다.

 

Check For Overlap

4. 2번에서 마지막에 붙어있던 이벤트입니다. 여기서는 앞서 만든 오버랩 체크 이벤트를 호출하여 오버랩된 컴포넌트 리스트를 만들고 이 배열이 비어있을 않을 경우에는 설치되면 안되기 때문에 배열을 비워주고 설치한 방을 제거하고 Spawn Next Room이벤트를 다시호출

배열이 비어있을 경우에는 설치되도 괜찮기 때문에 배열을 비워주고 최대 룸 갯수를 -1 출구 Arrow컴포넌트 배열에서 현재 방을 붙인 Arrow컴포넌트를 삭제합니다.

그리고 새로 붙인 방의 Arrow컴포넌트들을 배열에 추가해주고 룸 갯수가 0보다 클 경우에 Spawn Next Room을 호출합니다.룸 갯수가 0이 되었을때는 모든 방설치가 끝난 경우입니다.

 

Close Holse

5. 방 설치가  끝난 경우에는 여기로 넘어오게 되는데 출구 Arrow 컴포넌트 배열들 ( 사용된 출구들은 remove 돼서 남아있는 출구들은 미사용한 경우, 즉 막아야하는 문 ) 에 벽 액터들을 생성해줍니다.

 

Start DungeonTimer, Check For Dungeon Complete

6. 던전이 제대로 설치되지 않는경우 혹은 너무 오래걸리는 경우 레벨을 재시작 해줍니다.

던전이 완료 되면 이벤트를 멈춥니다.

 

begin play

다음과 같이 Event BeginPlay를 연결해주면 됩니다.

1. 시작방 설치 

2. 던전 타이머 시작

3. 방설치

 

roomlist에 사용할 방 액터를 넣습니다.

실행 화면