내일배움캠프/TIL

TIL260604 - Unreal

옆집히드라 2026. 6. 4. 21:53

아이돌 데뷔

1. 핵심 개념


  • TMap<Key, TArray<Value>> 쓰는 법
  • CDO

2. 상세 내용


2.1. TMap<Key, TArray<Value>> 쓰는 법

언리얼 엔진의 리플렉션 시스템(UPROPERTY 매크로)은 중첩된 컨테이너(Nested Containers)를 지원하지 않는다. 내용물의 포인터들이 가비지 컬렉터(GC)에 의해 메모리에서 날아가는 것을 방지하려면 UPROPERTY() 선언이 필수적인데, 이 규칙이 충돌하여 UHT(Unreal Header Tool) 컴파일 에러가 발생함

2.2. CDO(Class Default Object)

 

CDO의 성능상 이점

언리얼 엔진에서UCLASS() 매크로가 붙은 모든 클래스는 메모리 상에 CDO를 생성하고 유지한다.

액터를 스폰할 때마다 생성자를 호출하고 컴포넌트를 새로 조립한다면 성능 저하가 발생하지만, 언리얼에서는 메모리에 이미 생성자를 호출해서 완성된 CDO를 복사하는 방식으로 액터를 생성한다.

또한 언리얼 에디터에서는 맵, 블루프린트를 저장할 때 모든 데이터를 저장하지 않고 CDO에서 변경된 값만을 저장하기 때문에 프로젝트 용량과 메모리 사용량을 아낄 수 있다.

GetDefault<AMonster>()를 사용해서 객체 생성 없이 기본 값 확인이 가능

CDO의 생명 주기

  • 엔진 초기화 단계: 언리얼 에디터를 실행하기 위해 로딩 창이 뜰 때, 엔진은 모든 C++ 코드를 훑어보며 클래스들을 수집합니다.
  • 생성자 일괄 호출: 수집된 모든 클래스의 C++ 생성자를 단 한 번씩만 일괄적으로 쫙 호출합니다. 이때 생성된 결과물이 CDO로 메모리에 고정됩니다.
  • 블루프린트 적용: C++ CDO를 기반으로 블루프린트 CDO가 파생되어 만들어집니다.
  • 게임 플레이 (BeginPlay): 우리가 Play 버튼을 누르면, 이 CDO들을 복사하여 실제 월드에 객체들이 던져지고 그때서야 BeginPlay()가 호출됩니다.

주의점

언리얼에서 CDO는 에디터가 로딩될 때 실행되기 때문에 생성자 시점에서는 게임 월드 자체가 존재하지 않는다. 따라서 생성자 안에서 특정 액터를 찾는다거나, 물리 엔진 조작, 다른 객체 스폰과 같이 월드를 사용하는 작업을 하는 경우 무조건 크래시가 발생한다.

따라서 언리얼에서 동적인 런타임 로직은 생성자가 아닌 BeginPlay()에 넣는게 바람직하다.

3. 질문 및 해결 (Q&A)


4. 관련 문서 (Links)


'내일배움캠프 > TIL' 카테고리의 다른 글

TIL260608 - Unreal  (0) 2026.06.08
TIL260605 - Unreal - GAS1  (1) 2026.06.05
TIL260602 - 개인  (0) 2026.06.02
TIL260601 - CPP - Move Semantic  (0) 2026.06.01
TIL260529  (0) 2026.05.29