CDO 란?

Class Default Object 의 약자이며, 본질적으로 기본 템플릿 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않는다. CDO는 일반적으로 읽기 전용으로 간주된다.

언리얼 엔진에서 UClass 매크로는 UObject 에게 자신이 언리얼에서 기반으로 삼은 유형에 대해 설명해주는 UClass 레퍼런스를 넘겨준다.

각각의 UClass들은 CDO라고 불리는 오브젝트를 하나씩 유지한다.

CDO 그 자체의 개념은 특정 CDO 클래스를 기반으로 하는 특정 오브젝트 인스턴스들에 대한 어머니라고 보면 될 것 같다.

UClass는 GetClass() 함수를 사용하여 언제든 접근 가능하다.

UClass 속에는 클래스를 정의하는 프로퍼티와 함수 세트들이 들어있다. 이것들은 Native 코드에서 사용할 수 있는 일반 C++ 함수와 변수지만, 오브젝트 시스템 안에서의 동작을 제어하는 언리얼 전용 메타 데이터가 붙어있다.

위 사진속 각각의 클래스들은 CDO 들이다. 새로운 Actor나 Object에 대한 템플릿을 정의한다. 저 클래스하나하나로 뻗어나오는 여러 인스턴스들로 게임은 구동된다.

UObject 생성자의 포맷

UObject 생성자의 가장 기본적인 형태는 아래 설명과 같다.

UTESTObject::UTESTObject()
{
    // 여기서 CDO 프로퍼티를 초기화한다.
}

UTESTObject::UTESTObject(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
    // FObjectInitializer를 통해 여기서 CDO 프로퍼티를 초기화한다.
}

사실 위의 두 코드중 어느 것도 실제로 초기화 작업을 하지는 않는다. 엔진에서 이미 모든 칸을 0, NULL, 기본 생성자가 구현해둔 값으로 채워놨을 것이기 때문이다.

생성자에서 작성된 초기화 코드는 CDO에 적용될 것이고, 이어서 CreateNewObject나 SpawnActor 같은 엔진 내 적절히 생성된 새로운 오브젝트 인스턴스에 복사될 것이다.

생성자에 전달되는 FObjectInitializer 매개변수는, const 마킹이 되어있음에도 불구하고, 내장된 mutable 함수를 통해서 프로퍼티와 서브오브젝트를 덮어쓰도록 설정할 수 있다. 그로 인해서 생성되는 UObject는 이러한 변경사항에 영향을 받을 것이며, 이를 사용해서 등록된 프로퍼티나 컴포넌트의 값을 변경할 수 있다.

UTESTObject::UTESTObject()
{
    // 여기서 CDO 프로퍼티를 초기화한다.
    SomeProperty = 23;
}

위와 같이 SomeProperty에 대한 기본 생성자 코드가 존재할 경우 앞으로 새로 생기는 모든 UTESTObject의 인스턴스들은 SomeProperty가 23으로 초기화되어 나오게 된다.