본문 바로가기
언리얼5 & C++

언리얼5 C++ | 서브 레벨 스트리밍, 맵 로드 하기

by 17번 일개미 2024. 2. 16.
728x90

서브 레벨 스트리밍


언리얼에서 Level 은 유니티의 Scene 과 유사한 개념이다.

 

유니티에서도 Scene 을 Additional 모드로 로드가 가능하듯이

언리얼에서도 Level 을 Streaming 상태로 로드가 가능하다.

 

즉, 아트작업자가 A라는 Level을 만들고, 해당 Level 에서 조명, 맵, 등등을 세팅하고

세팅된 A 를 사용하게 될 B 라는 실제 빌드용 Level 에서

Streaming Level 로 A를 등록해두면

A 가 현재 B Level 에 겹쳐서 로드된다.

 

아트 작업자는 A 레벨에서 작업을 하고

코드 작업자는 B 레벨에서 코드를 작성하면

작업 간에 충돌이 없을 뿐 더러, 에디터에서도 상시로 A + B 형태로 존재도 가능하다.

 

사실 근본적인 기술의 용도는

https://docs.unrealengine.com/4.26/ko/BuildingWorlds/LevelStreaming/Overview/

 

레벨 스트리밍 개요

스트리밍 레벨의 로드는 레벨 스트리밍 볼륨 또는 블루프린트나 C++ 를 통한 프로그래밍 방식으로 처리할 수 있습니다.

docs.unrealengine.com

여기에서 자세히 볼 수 있다.

 

플레이어 거리에 따라 광활한 맵의 정밀도나 시야범위를 조절하기 위해 로드/언로드를 하기 위함이 주 목적이다.

 


그럼 어떻게 하느냐?

 

 

예시로 아무 씬을 잡아보겠다.

 

 

상단 Window 메뉴에서 Levels 를 찾는다.

 

열면 대충 이렇게 나오는데, Persistent Level 이 현재 열려있는 메인 레벨을 의미한다.

여기서 아래 버튼을 누르면,

 

 

Content Browser 에서 존재하는 레벨을 가져올 수 있다.

 

 

예시로 다른 레벨을 가져온다.

 

 

그럼 바로 현재 레벨에 내가 불러온 레벨이 같이 로드되지만, 메인 레벨은 유지된다.

 

이 상태에서는 플레이해보면 불러왔던 인터뷰 레벨은 다시 날아간다.

 

여기까지 한 과정이 저 레벨 윈도우에서 현재 레벨에서 Streaming 해서 사용할 레벨은 ~~ 이야. 라고 등록해준 것이다.

여기까지만 해도 실제 작업 시 원하는 레벨 끼리 겹쳐 볼 수 있으므로 매우 좋다.

 

이제 코드에서 로드는 어떻게 하나?

OpenSubLevel 이라는 함수를 정의했다. 엔진의 UGameplayStatics::LoadStreamLevel 을 단순하게 Wrap 한 구조다.

Wrap 이 필요없다면 그냥 직접 호출하면 된다.

void MyGameInstance::OpenSubLevel(const FString& LevelName, bool bAfterVisible, bool bIsSync, FLatentActionInfo Action)
{
	UGameplayStatics::LoadStreamLevel(GetWorld(), *LevelName, bAfterVisible, bIsSync, Action);
}

 

등록된 레벨만 로드가 가능하니, 로드가 안된다면 에디터에서 확인이 필요하다.

728x90