Data Layer 기초
Editor와 Runtime Data Layer의 차이점과 활용
Data Layer 개념
콘텐츠를 논리적으로 그룹화
Data Layer는 월드의 액터들을 논리적으로 그룹화하는 시스템입니다. 에디터에서의 작업 효율성과 런타임에서의 동적 콘텐츠 관리를 모두 지원합니다.
| 구분 | Editor Data Layer | Runtime Data Layer |
|---|---|---|
| 용도 | 에디터에서 콘텐츠 구성 | 런타임 게임플레이 변형 |
| 활성화 | 에디터 전용 | 런타임에서 Blueprint/C++로 제어 |
| 스트리밍 | 로드/언로드 없음 | 동적 로드/언로드 |
| 예시 | "GreyBox", "Environment" | "Quest_01", "NightMode" |
Data Layer Asset vs Instance
프로젝트 레벨과 월드 레벨 구분
Data Layer Asset
프로젝트 레벨에서 정의. Content Browser에서 생성하며, 여러 월드에서 재사용 가능합니다.
Content Browser > Right-Click
> Miscellaneous
> Data Layer Asset
Data Layer Instance
월드별 데이터. World Data Layers에서 관리하며, 같은 Asset이 월드마다 다른 속성을 가질 수 있습니다.
World Settings
> World Data Layers
> Data Layer Instances
UCLASS()
class ENGINE_API UDataLayerAsset : public UObject
{
GENERATED_BODY()
public:
// 레이어 타입 (Editor 또는 Runtime)
UPROPERTY(EditAnywhere, Category = "Data Layer")
EDataLayerType DataLayerType = EDataLayerType::Editor;
// 초기 런타임 상태
UPROPERTY(EditAnywhere, Category = "Data Layer")
EDataLayerRuntimeState InitialRuntimeState = EDataLayerRuntimeState::Unloaded;
// 디버그 컬러
UPROPERTY(EditAnywhere, Category = "Debug")
FColor DebugColor = FColor::White;
};
Runtime State
Data Layer의 세 가지 런타임 상태
Unloaded
해당 레이어의 액터들이 메모리에서 완전히 언로드된 상태입니다.
Loaded
액터들이 로드되었지만 보이지 않는 상태. 빠른 활성화를 위한 준비 상태입니다.
Activated
액터들이 로드되고 게임에서 보이는 상태입니다.
상태 전환 다이어그램:
┌─────────────┐
│ Unloaded │ <-- 메모리 해제됨
└──────┬──────┘
│ SetDataLayerRuntimeState(Loaded)
▼
┌─────────────┐
│ Loaded │ <-- 로드됨, 숨겨짐
└──────┬──────┘
│ SetDataLayerRuntimeState(Activated)
▼
┌─────────────┐
│ Activated │ <-- 로드됨, 보임
└─────────────┘
자주 전환되는 콘텐츠는 Unloaded 대신 Loaded 상태로 유지하면 전환 시 로딩 지연을 피할 수 있습니다. 다만 메모리 사용량이 증가합니다.
액터에 Data Layer 할당
에디터에서 액터를 Data Layer에 배치
1. 액터 선택
2. Details 패널 > World Partition 카테고리
3. Data Layers 프로퍼티에서 할당할 레이어 선택
또는:
1. Window > World Partition > Data Layer Outliner 열기
2. 액터를 원하는 Data Layer로 드래그
// C++에서 Data Layer 할당 (에디터 시점)
void AssignActorToDataLayer(AActor* Actor, UDataLayerAsset* DataLayer)
{
if (Actor && DataLayer)
{
// 액터의 Data Layers 배열에 추가
// 이 작업은 에디터에서만 가능
#if WITH_EDITOR
Actor->AddDataLayer(DataLayer);
#endif
}
}
Data Layer 계층 구조
부모-자식 관계를 통한 그룹 제어
Data Layer 계층 구조 예시: Quest_MainStory (Parent) ├── Quest_MainStory_Act1 (Child) ├── Quest_MainStory_Act2 (Child) └── Quest_MainStory_Act3 (Child) Environment (Parent) ├── Environment_Day (Child) └── Environment_Night (Child)
// 부모 레이어 활성화 시 bIsRecursive=true로 자식도 함께 제어
if (UDataLayerManager* Manager = UDataLayerManager::GetDataLayerManager(World))
{
Manager->SetDataLayerRuntimeState(
ParentDataLayer,
EDataLayerRuntimeState::Activated,
true // 자식 레이어도 활성화
);
}
핵심 요약
- Editor Data Layer는 에디터 구성용, Runtime Data Layer는 게임플레이 변형용
- Data Layer Asset은 프로젝트 레벨, Instance는 월드별 설정
- 런타임 상태: Unloaded / Loaded / Activated
- 액터의 Data Layers 프로퍼티 또는 Data Layer Outliner로 할당
- 계층 구조로 그룹 제어 가능 (bIsRecursive)
도전 과제
배운 내용을 직접 실습해보세요
에디터에서 'Gameplay', 'Decoration', 'Debug' Editor Data Layer를 생성하고, 액터를 각 레이어에 할당하세요. 레이어별 표시/숨김 토글로 에디터 작업 효율을 개선하는 워크플로우를 익힙니다.
Runtime Data Layer를 생성하고 InitialRuntimeState를 Unloaded로 설정하세요. 특정 이벤트(트리거 볼륨 진입) 시 C++에서 Data Layer를 Activated 상태로 변경하여 액터들이 로드되는 것을 확인합니다.
하나의 월드에서 '평화 상태'와 '전쟁 상태' 두 가지 Data Layer로 건물/NPC/환경을 분리하고, 게임 진행에 따라 전환하는 시스템을 구현하세요. 전환 시 페이드 효과와 로딩 처리를 포함합니다.