CDO란
Class Default Object의 약자이다.
기본 템플릿 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않는다고한다...
이게 무슨말인고 하면은 c++클래스 생성자에서 멤버 변수의 값을 초기화를 하면은 변경되지 않는다는 말 같다(내생각엔..)
UClass 매크로는 UObject에게 자신이 언리얼에서 기반으로 삼은 유형에 대해 설명해주는 UClass레퍼런스를 넘겨준다.
각각의 UClass들은 CDO라고 불리는 오브젝트를 하나씩 유지한다.
UClass속에는 클래스를 정의하는 Property, 와 함수 세트들이 들어있다.
이것들은 Native코드에서 사용할 수 있는 일반 C++ 함수와 변수지만, 오브젝트 시스템 안에서의 동작을 제어하는 언리얼 전용 메타 데이터가 들어가 붙어있다.
사실 위의 두 코드중 어느 것도 실제로 초기화 작업을 하지는 않는다. 엔진에서 이미 모든 칸을 0, NULL, 기본 생성자가 구현해둔 값으로 채워놨을 것이기 때문이다.
생성자에서 작성된 초기화 코드는 CDO에 적용될 것이고, 이어서 CreateNewObject나 SpawnActor 같은 엔진 내 적절히 생성된 새로운 오브젝트 인스턴스에 복사될 것이다.
라고한다!
언리얼에서는 UPROPERTY()같은 메크로 붙은애들 알아서 초기화를 해주기 때문이다.
int32, float같은 값들은 0으로 알아서 셋팅을 함.
생성자에 전달되는 FObjectInitializer 매개변수는, const 마킹이 되어있음에도 불구하고, 내장된 mutable 함수를 통해서 프로퍼티와 서브오브젝트를 덮어쓰도록 설정할 수 있다. 그로 인해서 생성되는 UObject는 이러한 변경사항에 영향을 받을 것이며, 이를 사용해서 등록된 프로퍼티나 컴포넌트의 값을 변경할 수 있다.
UE에 CDO라는 개념이 있는데 음.. 조금 막연한 개념같기도하다...
그냥 언리얼 엔진에게 지금 프로젝트에 어떤 클래스가 있는지를 UClass매크로로 정보를 다 알려주고
이 UClass 매크로가 붙은 클래스가 CDO라고 하는거같다.
이 글을 적는 이유가 BST를 만들다가 생성자 부분에서 StaticClasss()를 호출 하는 부분 때문에 글을 적으면서 정리를 하는데
위의 블로그에서 CDO를 알아야 한다고해서 나름 정리를 하다가 이제 다시 StaticClass를 살펴 볼려고한다.
위의 내용은 모두 언리얼 공식 생성자 초기화 에서 확인할 수 있다.
(위의 링크 정독 계속하면 될듯하다)
한 줄 요악 : StaticClass 는 컴파일 타임에서 UClass 타입의 정보를 얻어오는 것이며, GetClass 는 런타임에서 실제 객체의 클래스를 조회할때 사용된다.
라고한다.
지금 BST를 만들면서 위에 코드 부분이였는데
클래스 레퍼런스 부분에서 아래와 같이
여러가지 경우에 그냥 USomeClass::StaticClass() 를 사용해서 복잡한 ClassFinder 는 한꺼번에 건너뛸 수 있습니다. 예를 들어 대부분의 상황에서 아래 메서드를 사용할 수 있습니다:
위의 복잡한 코드 대신에
NavMeshClass = UNavigationMeshBase::StaticClass();
이런식으로 한방에 할 수 있다는 말인거같다.