UObject 는 클래스의 일종이며, 언리얼 엔진의 모든 객체가 상속하는 Base Class 입니다. 정확히는, UObject 는 클래스 중에서도 "Base class of for all objects in Unreal Engine" 이라고 정의 되어 있는 클래스 입니다. 이 클래스를 상속받는 모든 클래스는 언리얼 엔진의 객체가 될 수 있습니다. 이러한 클래스들은 UObject 를 상속받는 체계를 따라 객체들이 구성되며, 언리얼 엔진에서 필요한 여러 기능과 특성을 가지고 있는 Object 입니다. 이러한 클래스 구조로 인해 모든 언리얼 오브젝트, C++ 로 작성된 클래스든 블루프린트든, UObject 클래스의 파생클래스로 구현됩니다. 언리얼 엔진에서 객체를 생성하고 관리하기 위한 기반이 되는 클래스라고 할 수 있습니다.
UClass 는 언리얼 엔진의 클래스 시스템에서 사용되는 메타클래스(meta-class) 입니다. 메타클래스는 클래스의 클래스이며, 클래스 자체를 나타내는 메타정보를 갖고 있습니다. 이것은 어떤 클래스의 특성과 행동을 정의하고, 그 클래스의 인스턴스를 생성하고 조작하는데 사용되는 중요한 개념입니다. UClass 는 메모리에 할당된 객체가 아닌 클래스의 일종으로 존재합니다. UClass 는 클래스의 여러가지 정보를 기술하는 역할을 하며, 이 정보는 클래스의 인스턴스를 생성하고 동작을 정의하는데 사용됩니다. UClass 는 컴파일 타임에서 클래스의 정보를 표현하기 위해 사용되며, 런타임 중에는 정보를 이용하여 실제로 객체를 생성하거나 조작합니다. UClass 는 클래스의 템플릿이며, 해당 클래스의 인스턴스를 사용되는 정보를 포함합니다. 템플릿 클래스는 클래스의 템플릿이 되어서 다양한 형태의 클래스 인스턴스를 생성할 수 있는 구조 입니다. UClass 도 이와 유사한 개념으로, 언리얼 엔진의 모든 클래스의 기반이 되며 클래스의 메타정보를 나타냅니다. 이를 통해 메모리에 할당된 객체가 아니라 클래스 자체의 특성(클래스의 정보)을 나타내는 것으로 이해해야 합니다. UClass 는 주로 언리얼엔진의 리플렉션 시스템과 관련이 있습니다. UClass 는 언리얼 엔진의 모든 클래스의 기반이 되며, 해당 클래스의 속성, 메서드, 상속구조, 블루프린트 등의 정보를 나타냅니다. 그리고 UClass 를 통해 C++ 과 Blueprint 는 상호작용을 할 수 있게 됩니다. ( UClass 를 사이에 두고 간접적으로) UClass 는 C++ 클래스의 경우 클래스 자체를 나타내는 메타 클래스이고, Blueprint 클래스의 경우 해당 C++ 클래스의 CDO 를 나타내는 역할도 합니다. UClass를 통해 다양한 메타 정보에 접근 할 수 있으며, 리플렉션을 통해 UClass 를 이용하여 클래스의 속성이나 매서드를 검색하거나 수정하고, 블루프린트 클래스의 경우 CDO 를 생성하거나 조작할 수 있습니다. (즉 Reflection System 이 있다고 하더라도, C++ 이 Blueprint 에 직접 접근하는 것이 아니라. UClass 를 통해 간접적으로 접근할 수 있는것이다.)
C++ 클래스는 블루프린트의 정보를 담은 UClass 에 접근할 수 있지만, 반대로 블루프린트 클래스는 해당 C++ 클래스의 모든 내용을 알 수는 없습니다. UClass 는 메타 클래스로서, 클래스의 여러 정보를 나타냅니다. 따라서 C++ Class 에서는 UClass 를 통해 해당 클래스의 정보를 접근,조작,인스턴스화 할 수 있습니다. 하지만 Blueprint 는 C++ 클래스의 로직을 상속하고 확장하는 역할을 합니다. Blueprint 클래스는 비주얼 스크립팅 시스템을 통해 로직을 구성하며, c++ 클래스의 내용 중 일부만 사용할 수 있습니다. C++ 클래스의 모든 내용을 Blueprint 가 인식 하거나 활용할 수 있는 것은 아닙니다. 즉, C++ 클래스는 UClass 를 통해 Blueprint 클래스의 메타정보에 접근할 수 있지만, 블루프린트 클래스는 C++ 클래스의 일부만을 활용할 수 있습니다.
언리얼 엔진에서 클래스는 C++ 코드로 작성될 수도 있고, 블루프린트로 작성될 수 있습니다. C++ 코드로 작성된 클래스는 런타임에 컴파일 되고 UClass 로 변환됩니다. C++ 코드에 작성된 언리얼오브젝트 클래스 코드는 런타임 중에 UClass 를 생성하고, UClass 는 해당 클래스의 메타정보와 기본속성 값을 가지게 됩니다. UClass 는 블루프린트 클래스의 기반이 됩니다. 블루프린트 클래스는 C++ 클래스의 확장이며, 블루프린트 또한 런타임에 UClass 로 변환됩니다. 블루프린트 클래스는 C++ 클래스의 기능을 확장하거나 수정하면서, 비주얼 스크립팅을 가능하게 합니다. 이때 C++ 클래스의 CDO 를 기반으로 하며, 이렇게 생성된 블루프린트 클래스 역시 UClass 형태로 존재합니다. 요약하자면 언리얼 오브젝트 클래스와 블루프린트 클래스는 모두 런타임에 UClass 로 변환되며, C++ 클래스와 블루프린트 클래스 모두 UClass 의 형태로 존재하여, 객체의 동작을 정의하고 제어합니다.
C++ 에서의 UClass 에 대한 내용은 .h , .cpp 로서 파일로 저장이 된다. C++ 코드가 빌드되어 dll 이 되고, dll 을 탑재하여 언리얼 엔진이 실행되면 Runtime 상태이다. 그리고 이 Runtime 에서의 언리얼 엔진 에디터에서 작성된 UClass 에 대한 내용, 즉 블루프린트 클래스는 Serialization 을 통해 .uasset 형식의 파일로 저장되며, 이파일은 해당 블루프린트 클래스의 내용과 설정을 포함합니다. 런타임 중에는 .uasset 파일을 읽어들여 UClass 를 생성하고 이를 사용하여 블루프린트 클래스의 동작을 수행할 수 있습니다.
이와같은 과정을 통해 블루프린트 클래스는 .uasset 파일을 통해 런타임에서 동적으로 생성되고, 해당 클래스의 기능을 활용할 수 있게 됩니다.
언리얼 클래스 정보에는, 클래스 기본 오브젝트 (Class Default Object) 가 함께 포함되어 있습니다.
클래스 기본 오브젝트 는 줄여서 CDO 라고 부릅니다.
CDO 는 해당 클래스의 블루프린트 인스턴스들을 생성할 때 기본적으로 참조되는 템플릿 역할을 합니다. CDO 는 런타임중에 해당 클래스의 기본 속성 값을 가지고 있으며, 해당 클래스의 모든 인스턴스가 이 값을 상속합니다. 따라서 CDO 는 런타임에 블루프린트 클래스의 정보를 대표하게 됩니다. 리플렉션 시스템을 사용하여, CDO 에 접근하고 조작할 수 있으며, 이를 통해 클래스의 기본속성 값을 변경하거나, 확인하거나, 클래스의 블루린트 인스턴스 생성할때 참조할 수 있는 기본값을 설정할 수 있습니다. 요약하면, CDO 는 블루프린트 클래스의 런타임 정보를 나타내며, 리플렉션 시스템을 통해 이 정보에 접근하여 클래스의 기본 속성 값을 다룰 수 있습니다.
LoadClass 와 IsChildOf 를 통해 어떤 클래스의 파생클래스인지 특정할 수 있습니다.
UClass* AnyActorClass;
AnyActorClass = LoadClass<AMyClass>(NULL, *MyClassName, NULL, LOAD_None, NULL);
if(!AnyActorClass->IsChildOf(APawn::StaticClass()))
{
AnyActorClass = nullptr;
}