PART 3 - 강의 1/4

Data Layer 기초

Editor와 Runtime Data Layer의 차이점과 활용

01

Data Layer 개념

콘텐츠를 논리적으로 그룹화

Data Layer는 월드의 액터들을 논리적으로 그룹화하는 시스템입니다. 에디터에서의 작업 효율성과 런타임에서의 동적 콘텐츠 관리를 모두 지원합니다.

구분 Editor Data Layer Runtime Data Layer
용도 에디터에서 콘텐츠 구성 런타임 게임플레이 변형
활성화 에디터 전용 런타임에서 Blueprint/C++로 제어
스트리밍 로드/언로드 없음 동적 로드/언로드
예시 "GreyBox", "Environment" "Quest_01", "NightMode"
02

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
C++ - UDataLayerAsset 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; };
03

Runtime State

Data Layer의 세 가지 런타임 상태

Unloaded

해당 레이어의 액터들이 메모리에서 완전히 언로드된 상태입니다.

Loaded

액터들이 로드되었지만 보이지 않는 상태. 빠른 활성화를 위한 준비 상태입니다.

Activated

액터들이 로드되고 게임에서 보이는 상태입니다.

상태 전환 다이어그램:

    ┌─────────────┐
    │  Unloaded   │ <-- 메모리 해제됨
    └──────┬──────┘
           │ SetDataLayerRuntimeState(Loaded)
           ▼
    ┌─────────────┐
    │   Loaded    │ <-- 로드됨, 숨겨짐
    └──────┬──────┘
           │ SetDataLayerRuntimeState(Activated)
           ▼
    ┌─────────────┐
    │  Activated  │ <-- 로드됨, 보임
    └─────────────┘
Loaded 상태 활용

자주 전환되는 콘텐츠는 Unloaded 대신 Loaded 상태로 유지하면 전환 시 로딩 지연을 피할 수 있습니다. 다만 메모리 사용량이 증가합니다.

04

액터에 Data Layer 할당

에디터에서 액터를 Data Layer에 배치

Editor 1. 액터 선택 2. Details 패널 > World Partition 카테고리 3. Data Layers 프로퍼티에서 할당할 레이어 선택 또는: 1. Window > World Partition > Data Layer Outliner 열기 2. 액터를 원하는 Data Layer로 드래그
C++ // C++에서 Data Layer 할당 (에디터 시점) void AssignActorToDataLayer(AActor* Actor, UDataLayerAsset* DataLayer) { if (Actor && DataLayer) { // 액터의 Data Layers 배열에 추가 // 이 작업은 에디터에서만 가능 #if WITH_EDITOR Actor->AddDataLayer(DataLayer); #endif } }
05

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)
C++ // 부모 레이어 활성화 시 bIsRecursive=true로 자식도 함께 제어 if (UDataLayerManager* Manager = UDataLayerManager::GetDataLayerManager(World)) { Manager->SetDataLayerRuntimeState( ParentDataLayer, EDataLayerRuntimeState::Activated, true // 자식 레이어도 활성화 ); }
SUMMARY

핵심 요약

  • Editor Data Layer는 에디터 구성용, Runtime Data Layer는 게임플레이 변형용
  • Data Layer Asset은 프로젝트 레벨, Instance는 월드별 설정
  • 런타임 상태: Unloaded / Loaded / Activated
  • 액터의 Data Layers 프로퍼티 또는 Data Layer Outliner로 할당
  • 계층 구조로 그룹 제어 가능 (bIsRecursive)
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Editor Data Layer 생성 및 활용

에디터에서 'Gameplay', 'Decoration', 'Debug' Editor Data Layer를 생성하고, 액터를 각 레이어에 할당하세요. 레이어별 표시/숨김 토글로 에디터 작업 효율을 개선하는 워크플로우를 익힙니다.

실습 2: Runtime Data Layer 설정

Runtime Data Layer를 생성하고 InitialRuntimeState를 Unloaded로 설정하세요. 특정 이벤트(트리거 볼륨 진입) 시 C++에서 Data Layer를 Activated 상태로 변경하여 액터들이 로드되는 것을 확인합니다.

심화 과제

하나의 월드에서 '평화 상태'와 '전쟁 상태' 두 가지 Data Layer로 건물/NPC/환경을 분리하고, 게임 진행에 따라 전환하는 시스템을 구현하세요. 전환 시 페이드 효과와 로딩 처리를 포함합니다.