언리얼 엔진에서 Open Level과 Load Level은 레벨 전환 및 로드 시 사용되는 주요 기능입니다.
두 기능은 레벨을 로드하거나 전환하는 방식에서 큰 차이가 있으며, 이를 올바르게 이해하고 사용해야 개발 중 발생할 수 있는 문제를 예방할 수 있습니다.
Open Level
기능
Open Level은 현재 로드된 레벨을 완전히 언로드 하고, 지정된 새로운 레벨을 로드합니다. 이를 통해 현재 월드의 상태를 초기화하고 새롭게 시작할 수 있습니다.
특징
- 완전한 레벨 전환: 기존 레벨의 모든 액터와 데이터가 언로드됩니다.
- 새 레벨 로드: 지정된 레벨이 독립적으로 로드됩니다.
- 초기화 보장: 모든 시스템(Game Mode, NavMesh, 환경 설정 등)이 새로 초기화됩니다.
- BeginPlay 호출: 새로 로드된 레벨의 모든 액터의 BeginPlay 이벤트가 호출됩니다.
장점
- 내비게이션 데이터, 게임 모드, 환경 설정이 초기화되므로 안정적인 상태로 새 레벨을 시작할 수 있습니다.
- 복잡한 레벨 상태를 유지할 필요 없이 새 게임 상태로 전환이 가능합니다.
단점
- 기존 레벨의 데이터를 유지할 수 없습니다. 필요한 데이터는 별도로 저장하거나 Game Instance를 사용해야 합니다.
- 레벨 전환 시 약간의 로드 시간 증가가 발생할 수 있습니다.
Load Level (Level Streaming)
기능
Load Level은 현재 레벨 상태를 유지하면서 다른 레벨을 추가적으로 로드합니다. 이는 주로 레벨 스트리밍 방식으로 사용되며, 기존 레벨과 병합된 상태로 동작합니다.
특징
- 서브 레벨처럼 작동: 새로운 레벨은 기존 Persistent Level에 병합됩니다.
- BeginPlay 미호출: 이미 로드된 레벨의 액터들은 BeginPlay 이벤트가 호출되지 않습니다.
- 상태 유지: 기존 레벨의 상태를 유지한 채 새로운 레벨을 로드할 수 있습니다.
장점
- 여러 레벨을 동시에 병합하거나 나눠서 사용할 수 있어 대규모 맵 제작에 유용합니다.
- 기존 레벨의 상태를 유지하며 필요한 부분만 로드할 수 있습니다.
단점
- 새로 로드된 레벨의 설정은 기존 Persistent Level에 의존하므로 독립적인 환경 설정이 어렵습니다.
- 네비게이션 데이터나 게임 모드와 같은 공통 시스템에서 충돌이 발생할 수 있습니다.
Open Level vs Load Level 차이점
동작 방식 | 기존 레벨 언로드 후 새로운 레벨 로드 | 기존 레벨 유지하며 새 레벨 추가 로드 |
초기화 여부 | 네비게이션, 게임 모드, 환경 설정 모두 초기화 | 기존 레벨 환경 설정 유지 |
BeginPlay 호출 여부 | 호출됨 | 호출되지 않음 |
독립적 레벨 사용 가능 여부 | 가능 | 제한적 (Persistent Level에 의존) |
사용 목적 | 완전한 새 게임 시작, 독립적인 레벨 전환 | 레벨 병합, 대규모 맵 제작, 서브 레벨 로드 |
추천 사용 시점
Open Level | 독립적인 레벨 전환이 필요하거나 네비게이션/환경 설정을 새로 초기화해야 할 때. |
Load Level | 서브 레벨처럼 레벨을 병합하거나, 대규모 맵에서 특정 레벨의 일부만 로드하려 할 때. |
사용 예시
1. A레벨에서 B레벨을 Load Level로 로드한 경우
- Persistent Level은 A레벨이 유지됨.
- B레벨은 A레벨의 서브 레벨처럼 추가로 로드됨.
- B레벨에 있는 액터는 A레벨의 월드에 속하게 되고, A레벨의 설정(내비게이션 데이터, 게임 모드 등)을 따르게 돼.
특징
- A레벨이 중심이며, B레벨은 부속 레벨처럼 동작.
- B레벨의 BeginPlay는 호출되지 않음(이미 로드된 상태로 간주).
- B레벨의 설정(내비게이션, 환경 등)이 제대로 독립적으로 작동하지 않을 수 있음.
2. A레벨에서 B레벨을 Open Level로 로드한 경우
- Persistent Level이 B레벨로 변경됨.
- A레벨의 모든 데이터와 액터는 언로드 되고, B레벨만 로드됨.
- 새로운 내비게이션 데이터, 게임 모드, 환경 설정이 B레벨 기준으로 초기화됨.
특징
- B레벨이 완전히 새로운 월드로 동작.
- B레벨의 BeginPlay가 호출됨.
- A레벨에서 유지되던 데이터는 필요하면 Game Instance 또는 세이브 시스템을 통해 따로 관리해야 함.
결론
언리얼 엔진에서 Open Level과 Load Level은 각기 다른 상황에 적합한 기능입니다.
게임의 구조와 요구사항에 맞게 적절히 선택하는 것이 중요하며, 특히 네비게이션 데이터, 게임 모드와 같은 시스템의 초기화 여부를 고려해야 안정적인 동작을 보장할 수 있습니다.