개요
레벨 스트리밍은 레벨 디자인을 할 때 전체 레벨을 하나의 레벨로 구성하지 않고, 여러 레벨(서브 레벨)로 나눠서 구성하는 방식이다.
|문서|를 보면 상세하게 설명되어 있다.
언리얼 엔진 5.0 이상 버전에서는 월드 파티션(World Partition)이 사용된다.
하지만, 레벨 스트리밍을 지원하지 않는 것은 아니다. (서로 장단점이 있음)
레벨 스트리밍이나 월드 파티션이나 사용 개요는 월드를 더 작은 청크로 쪼개어, 월드에서 실제 나의 플레이 관련 부분만 리소스를 차지하여 최적화하기 위함이다.
레벨 스트리밍은 Levels 창에서 관리와 동시에 사용한다.


퍼시스턴트 레벨
퍼시스턴트 레벨(Persistent Level)은 일종의 마스터 레벨로서, 어떤 레벨을 스트리밍 할지 제어하는 데 주로 사용되는 레벨이다.
노드(Node) 구조로 보면, Root Node에 해당한다.
Basic으로 새 레벨을 만들어 보면, 기본적으로 퍼시스턴트 레벨로 설정되어 있다.
자기 자신은 항상 퍼시스턴트 레벨이다.


스트리밍 레벨
Basic으로 다른 레벨을 하나 더 생성한다. (Level_01)
Level_01 또한, 자신은 퍼시스턴트 레벨이다.


MainLevel의 Levels 창에서, Levels -> Add Existing... 을 통해 Level_01을 추가한다.
이는, 현재 퍼시스턴트 레벨에 다른 스트리밍 할 레벨을 서브 레벨로 추가하는 기능이다.

이러면, MainLevel 안에 2개의 레벨이 같이 공존하게 된다.
여기서, 기존 레벨인 MainLevel이 퍼시스턴트 레벨이고, Level_01은 서브 레벨 즉, 스트리밍 레벨이 된다.

위와 같이, MainLevel에 Level_01을 서브 레벨로 추가한 상태이다.
뷰포트의 노란 글씨 경고는 현재 여러 레벨에서 라이팅이 중복으로 계산되고 있다는 경고이다.

Outliner를 확인해 보면, 똑같은 액터들이 전부 2개씩 있는 것을 확인할 수 있다.
Outliner에서는 레벨 간의 구분 없이, 모든 레벨의 액터가 하나의 Outliner로 관리된다.
따라서 해당 레벨에 배치된 액터들은 해당 레벨 이름의 폴더로 관리하는 것이 좋다.

라이팅은 MainLevel에서 해주니, Level_01에서는 레벨 이름의 폴더를 하나 만들고, Floor 액터만 남긴다.

그리고 MainLevel의 Floor와 겹치지 않도록, x축으로 이동시켜 준다.
(Level_01은 라이트가 없어서 Unlit 모드로 했음)

이제 MainLevel로 가보면, 깔끔하게 정리된 것을 확인할 수 있다.

하지만, 게임을 플레이해 보면, 스트리밍 레벨의 액터가 보이지 않는다.

실제 레벨 디자인 작업은 모두 보이는 상태에서 하고, 실제 게임을 플레이할 때는 직접 레벨을 스트리밍 해줘야 레벨을 불러올 수 있다.
스트리밍 레벨은 블루프린트, C++, 레벨 스트리밍 볼륨을 통해 스트리밍할 수 있다.
아니면 그냥 항상 로드되도록 해줄 수도 있긴 하다.
스트리밍 레벨을 우클릭해서 Change Streaming Method 방식을 Always Loaded로 변경한다.
근데 이러면 레벨 스트리밍을 사용하는 이유가 없긴 하다.


블루프린트
간단하게 Trigger Volume을 통해, 레벨 스트리밍을 해보자.
MainLevel에 Trigger Volume을 설치한다.

레벨 블루프린트에서 Trigget Volume의 Begin Overlap 이벤트를 통해, Level_01을 Load Stream Level 함수를 통해 스트리밍한다.

Trigger Volume과 오버랩되자, Level_01 레벨을 스트리밍 한다.

레벨 스트리밍 볼륨
예시를 위해, Level_01의 액터를 다음과 같이 추가했다.

Level Streaming Volume 컴포넌트를 레벨에 배치한다.

Level 창에 Summons level details 창을 연다.

Level_01 레벨에 Streaming Volums에 방금 배치한 레벨 스트리밍 볼륨을 할당한다.

카메라가 레벨 스트리밍 볼륨 내에 들어오면, 해당 볼륨을 사용하는 스트리밍 레벨들을 스트리밍 한다.
신경 써야 할 점은 카메라가 볼륨 내에 들어오는 것이 기준이기 때문에, 볼륨 영역을 넉넉하게 잡아야 한다.

'📘Unreal Engine > 📝Unreal Engine' 카테고리의 다른 글
| [Unreal Engine] 동적 NavMesh 생성 (NavigationInvoker) (0) | 2025.09.18 |
|---|---|
| [Unreal Engine] 간단한 정찰 AI 만들기 (0) | 2025.09.10 |
| [Unreal Engine] 클라이언트에서 애니메이션 끊김 현상 (0) | 2025.03.11 |
| [Unreal Engine] 런타임 머티리얼 파라미터 값 변경하기 (0) | 2025.03.07 |
| [Unreal Engine] 바닥 재질별 다른 발소리 내기 (0) | 2025.02.05 |