언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (63) - 맵 연결 (Level Streaming)

ciel45 2024. 2. 25. 16:21

일전에 게임의 맵으로 쓸 3개의 층을 만들어놓았었다.

https://ciel45.tistory.com/68

 

블루아카이브 TPS게임 개발일지 (50) - 맵 제작

개인적으로 게임 제작 중 제일 어렵다고 느끼는 맵 제작을 슬슬 할 때가 왔다. 최근 약 1~2주 동안은 계속 레벨디자인 작업만 한 것 같다. 발키리 경찰학교를 구현하기 위해서, 블루아카이브의 키

ciel45.tistory.com

 

이제 이 3개의 레벨을 연결해볼 것이다.

 

게임 상에 레벨 3개를 모두 로드해놓으면, 성능 하락이 발생할 수 있다.

따라서 칸나가 현재 위치한 층만 로드되어있도록 할 것이다.

 

언리얼 엔진 5에서는 이것을 Level Streaming이라는 이름으로 이미 제공하고 있다.

 

들어가기에 앞서, Level Streaming을 쓸 때는 동적으로 스트리밍할 레벨 외에 고정으로 박혀있는 Persistent Level이 있어야 한다.

 

여기서는 하늘, 포스트 프로세싱 외 아무 것도 없게 비워둔 ValkyrieBuilding_Main을 Persistent Level로써 사용할 것이다.

 

Levels 창 열기
Add Existing을 통해 만들어놓은 Floor1/2/3을 가져왔다.
가져온 모습.

 

그 다음 Persistent Level에 각 층을 연결하는 계단을 만들어주었다.

동시에 각 층도 계단으로 연결될 수 있도록 손봤다.

2층에서 1층으로 내려가는 계단 작업.

 

여러 레벨을 로드해놓고 작업할 때 현재 액터를 어느 레벨에 배치할지 결정하기 위해서는, 뷰포트의 우측 하단에서 Current Context를 원하는 것으로 설정 해주면 된다.

 

 

 

윈도우의 연필 모양을 눌러 각 레벨의 위치, 회전을 설정해줄 수 있다.

여기서는 구조상 연결을 위해 Floor2를 180도 회전해주었다.

또한 메뉴 중 Streaming Volumes라는 것이 있는데, Place Actors Panel을 열고 Streaming Volume을 배치한 뒤, 저기에 연결하여 해당 볼륨에 플레이어가 들어가면 레벨이 로드되도록 할 수 있다.

 

하지만 여기서는 다른 방법을 사용할 것이다. (바로 밑에 후술)

 

 

이제 이 3개의 층을 로드, 언로드 하도록 할 것이다.

이를 위해서 새로운 블루프린트 BP_MapLoader를 만들었다.

이전 포스팅의 BP_ConversationTrigger와 마찬가지로 BoxCollision 하나만 가지고 있다.

 

좌측 하단 변수들을 보면, LoadLevel과 UnloadLevel을 FName으로 가지고 있으며, 우측 눈 표시를 토글시켜 인스턴스마다 편집 가능하게 하였다.

이벤트 그래프. LoadLevel에 값이 들어있다면 해당 이름의 레벨을 로드한다. Unload도 마찬가지.

주요한 노드는 Load Stream Level / Unload Stream Level이다.

주의해야할 점이, 두 노드는 비동기적으로 수행되기 때문에, Load를 걸어도 바로 맵이 로드되어있는 것은 아니다.

 

만약 동기적으로 맵을 호출하고 싶다면, Should Block on Load를 체크해주면 된다. 다만 이렇게 할 시 맵을 로드하는 동안은 메인스레드가 차단되어 게임이 멈출 것이다.

 

이렇게 만든 BP_MapLoader를 레벨 내 적절한 곳에 위치시켜주고, Load/Unload Level에 올바른 이름을 넣어주었다.

3층에서 2층으로 내려가는 계단이 있는 방에 들어갈 때 2층 로드.
3층에서 2층으로 내려와 통로를 지날 시 3층 언로드.

 

 

 

 

직접 플레이해보면서, 우측 하단 Levels 창을 통해 레벨이 동적으로 로드 / 언로드 되는 것을 글자 색을 통해 확인할 수 있다.