언리얼 프로퍼티 시스템 (리플렉션)
언리얼 프로퍼티 시스템 (리플렉션)
- 프로그램이 실행시간에 자기 자신을 조사하는 기능
- 언리얼 엔진 테크놀로지의 근간
- 에디터의 디테일 패널, 시리얼라이제이션, 가비지 콜렉션, 네트워크 리플리케이션, 블루프린트/C++ 커뮤니케이션 등 다수의 시스템에 탑재
- C++는 어떠한 형태의 리플렉션을 지원하지 않아 언리얼에서 자체적으로 구축
- 리플리케이션 시스템은 옵션
- 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool (UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집함
- 헤더에 리플렉션이 있는 유형으로 마킹을 하려면, 파일 상단에 특수한 include 를 추가해 줘야 함
- UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY() 등을 사용하여 헤더의 다양한 유형과 멤버 변수 주석을 달 수 있음
- 자동으로 리플렉션 시스템을 구성하는 필요한 소스 코드를 생성해 줌
- UPROPERTY()와 같이 선언을 해줘야 가비지 콜렉터와 같은 자동 메모리 관리를 해줌
언리얼 오브젝트의 구성
-
언리얼 오브젝트에는 특별한 프로퍼티와 함수를 지정할 수 있음
- 관리되는 클래스 멤버 변수 : UPROPERTY
- 관리되는 클래스 멤버 함수 : UFUNCTION
- 에디터와 연동되는 메타데이터를 심을 수 있음
-
모든 언리얼 오브젝트는 클래스 정보와 함께 함.
- 클래스를 사용해 자신이 가진 프로퍼티와 함수 정보를 컴파일 타임과 런타임에서 조회 가능
-
이렇게 다양한 기능을 제공하는 언리얼 오베즉트는 NewObject API를 사용해 생성해야 함.

언리얼 오브젝트의 클래스 기본 오브젝트 (CDO)
- 언리얼 클래스 정보에는 클래스 기본 오브젝트가 함께 포함되어 있음.
- 클래스 기본 오브젝트는 줄여서 CDO라고 부름
- CDO는 언리얼 객체가 가진 기본 값을 보관하는 템플릿 객체임.
- 한 클래스로부터 다수의 물체를 생성해 게임 콘텐츠에 배치할 때 일관성 있게 기본 값을 조정하는데 사용
- CDO는 클래스 정보로부터 GetDefaultObject함수를 통해 얻을 수 있음
- UClass 및 CDO는 엔진 초기화 과정에서 생성되므로 콘텐츠 제작에서 안심하고 사용할 수 있음

언리얼 오브젝트 처리
언리얼 오브젝트 처리
- 클래스, 프로퍼티, 함수에 적합한 매크로로 마킹해 주면 UClass, UProperty, UFunction 으로 변하는데 언리얼 엔진이 접근할 수 있어, 다수의 내부적인 처리 기능을 구현할 수 있음
- 자동 프로퍼티 초기화
- UObject 는 생성자 호출 전 초기화시 자동으로 0 으로 초기화
- 레퍼런스 자동 업데이트
- 직렬화(Serialization)
- 언리얼 오브젝트 객체를 우리가 지정된 포맷에 맞게 저장하거나 불러들이는 것을 일괄적으로 진행할 수 있는데 저장되는 정보는 UProperty라는 것으로 명시를 해줘야 이것들만 언리얼 오브젝트에서 빼내서 디스크에 저장하고 불러들일 수 있게 됨
- 프로퍼티 값 업데이트 하기
- CDO를 사용해서 게임 제작 과정에서 하나의 클래스를 게임에 대해 여러 가지를 배치 했을 때 기본 값을 CDO를 통해서 효과적으로 관리 가능
- 에디터 통합
- UProperty와 매크로 안에 메타 데이터를 넣어주면 에디터와 통합되면서 유용한 기능들을 사용할 수 있음
- 리플렉션 시스템을 사용하게 되면 런타임에 정보를 얻을 수 있고 안전하게 형변환이 가능함
- 가비지 컬렉션
- 더 이상 참조되지 않는 언리얼 오브젝트는 시스템이 자동으로 회수해서 소멸
- 네트워크 리플리케이션
- Serialization과 유사한 기능
- 네트워크 통신을 통해서도 UProperty를 자동으로 전송하고 받을 수 있게 되는 시스템이 자동으로 구축되어 있음
실습
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("==================="));
UClass* ClassRuntime = GetClass();
UClass* ClassCompile = UMyGameInstance::StaticClass();
check(ClassRuntime == ClassCompile);
//ensure(ClassRuntime != ClassCompile);
//ensureMsgf(ClassRuntime != ClassCompile, TEXT("일부러 에러를 발생시킨 코드"));
UE_LOG(LogTemp, Log, TEXT("학교를 담당하는 클래스 이름 : %s"), *ClassRuntime->GetName());
UE_LOG(LogTemp, Log, TEXT("==================="));
}
-
check
-
ensure
-
GetClass
- 런타임에 클래스 정보
StaticClass
- 컴파일에 클래스 정보
CDO 기능
정리
- 언리얼 오브젝트에는 항상 클래스 정보를 담은 UClass 객체가 매칭되어 있다.
- UClass로부터 언리얼 오브젝트의 정보를 파악할 수 있다.
- UClass에는 클래스 기본 오브젝트(CDO)가 연결되어 있어 이를 활용해 개발의 생산성을 향상시킬 수 있다.
- 클래스 정보와 CDO는 엔진 초기화 과정에서 생성되므로 게임 개발에서 안전하게 사용 가능
- 헤더 정보를 변경하거나 생성자 정보를 변경하면 에디터를 끄고 컴파일하는것이 안정적이다.