본문으로 바로가기

Unreal Engine Class Default Object (CDO)

category UnrealEngine/Impl 2023. 9. 16. 20:16

앞선 UHT 설명에서, 하나의 언리얼 오브젝트가 만들어지기 위해서 실제 컴파일전에 UHT에 의해 헤더 파일을 분석하는 과정이 선행되면, 이 과정이 완료되면 언리얼 오브젝트 정보를 담은 메타 파일이 생성된다고 설명했다.

 

이 메타 정보는 언리얼 엔진이 지정한 UClass라는 특별한 클래스를 통해 보관된다. UClass는 언리얼 오브젝트에 대한 클래스 계층 구조 정보와 멤버 변수, 함수에 대한 정보를 모두 기록하고 있다.

 

컴파일 단계에서 언리얼 오브젝트마다 UClass가 생성된다면, 실행 초기의 런타임 과정에서 언리얼 오브젝트마다 클래스 정보와 함께 언리얼 오브젝트의 인스턴스가 생성된다. 이 특별한 인스턴스는 언리얼 오브젝트의 기본 세팅을 지정하는데 사용되는데, 이를 클래스 기본 객체 ( Class Default Object ) 라고 한다.

 

언리얼 엔진에서 CDO를 만드는 이유는 언리얼 오브젝트를 생성할 때마다 매번 초기화 시키지 않고, 미리 기본 인스턴스를 만들어둬 해당 인스턴스를 복제하는 방식으로 메커니즘이 구성되어 있기 때문이다.

-> 즉 런타임에 100개의 오브젝트를 하나씩 만들어내는 것보다, 미리 큰 기본 객체 덩어리를 복제한 후에 속성 값만 변경하는 방법이 더 효과적이다.

 

정리하자면, 하나의 언리얼 오브젝트가 초기화 될 때 두개의 인스턴스가 항상 생성된다.

 

이러한 언리얼 오브젝트는 언리얼 엔진에서 항상 모듈 단위로 관리된다. 언리얼 에디터를 띄우면 초기화라는 문구 옆에 %가 증가하는 것을 볼 수 있는데, 대부분의 과정이 에디터에 사용할 모듈을 로딩하는데 사용된다. 모듈간의 의존성에 따라 모듈이 로딩하는 순서가 정해지며, 모듈이 로딩될 때마다 모듈에 속한 언리얼 오브젝트가 모두 초기화 된다.

언리얼 오브젝트 클래스에서 생성자는 특별한 역할을 가진다.

언리얼 오브젝트의 생성자는 인스턴스를 초기화해 Class Default Object를 제작하기 위한 목적으로 사용된다.

이 생성자 코드는 초기화에서만 실행되고, 실제 게임 플레이에서 생성자 코드는 사용할 일이 없다.

(즉, 생성자는 초기화때만 실행되고 게임 플레이에 사용할 초기화 함수는 Init이나 BeginPlay를 사용한다.)

 

모듈 내 언리얼 오브젝트의 로딩은 다음과 같은 순서로 진행된다.

 

생성자에 브레이크 포인트를 걸고, 디버그로 언리얼 에디터를 키면, 에디터 로딩이 완료되기 전에 브레이크 포인트가 걸린다.

 

 

Ref : https://blog.naver.com/destiny9720/220934112532