⚡이 문서는 이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 강의를 바탕으로 작성되었습니다.
언리얼 프로퍼티 시스템(리플렉션)
런타임중에 오브젝트의 함수, 프로퍼티 정보를 얻을 수 있는 기능
- 리플렉션이 그래픽에서 말하는 '반사'의 의미도 있기 때문에 구분을 위해 프로퍼티라고 부름
- 언리얼 엔진의 근간을 이룬다고 되어있음
- C++ 일반 오브젝트는 리플렉션을 제공하지 않음. 언리얼에서만 가능한 기능임.
- 리플렉션을 사용하기 위해서는 "generated.h"로 끝나는 특수한 헤더 파일을 포함시켜야 한다. 해당 파일은 언리얼 엔진에서 자동으로 생성한다.
언리얼 오브젝트 구성
언리얼 오브젝트는 특별한 프로퍼티와 함수를 지정할 수 있다.
- UPROPERTY : 관리되는 클래스 멤버 변수
- UFUNCTION : 관리되는 클래스 멤버 함수
클래스 기본 오브젝트
언리얼 객체가 가진 기본 값을 보관하는 템플릿 객체다.
- 한 클래스에서 다수의 물체를 생성해 게임 컨텐츠에 배치할 때 기본값을 일관되게 조정하는데 유용하게 사용된다.
- 클래스 정보로부터 GetDefaultObject() 함수를 통해 얻을 수 있다.

CDO의 생성 시점
CDO 기본값을 변경하는 시점에 BP를 걸고 CDO가 언제 생성되는지를 확인하고자 한다. 에디터를 종료 후 프로그램을 재시작한다.

에디터가 실행 준비가 75%가량 된 상태에서 BP에 코드가 걸린다.


이를 통해 CDO 생성은 언리얼 엔진 초기화중에 된다는 것을 알 수 있다.
예제 코드
MyGameInstance.h 코드
SchoolName 위에 UPROPERTY() 매크로가 존재하기 때문에 UE 프로퍼티 시스템을 통해 관리되는 멤버 변수다.
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "MyGameInstance.generated.h"
/**
*
*/
UCLASS()
class OBJECTREFLECTION_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
UMyGameInstance();
virtual void Init() override;
private:
UPROPERTY()
FString SchoolName;
};
MyGameInstance.cpp 코드
- GetClass(), StaticClass() 함수를 사용해 클래스의 정보를 가져온다.
- 두 함수를 이용해 가져오는 객체는 동일하기 때문에 check를 사용해서 검증을 한다.
- ClassRunTime에서 GetName()을 통해 클래스 이름 정보를 가져온다.
#include "MyGameInstance.h"
UMyGameInstance::UMyGameInstance()
{
}
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("==========================================="));
// ClassRuntime과 ClassCompile은 동일한 객체를 가리킴
UClass* ClassRuntime = GetClass();
UClass* ClassCompile = UMyGameInstance::StaticClass();
check(ClassRuntime == ClassCompile);
UE_LOG(LogTemp, Log, TEXT("학교를 담당하는 클래스 이름 : %s"), *ClassRuntime->GetName());
UE_LOG(LogTemp, Log, TEXT("==========================================="));
}
위의 코드를 실행한 결과
정상적으로 클래스 이름이 출력된다.
이와 같이 리플렉션을 통해 런타임 중에 클래스의 정보를 가져올 수 있다.

check를 false로 두고 실행하면 어떻게 될까?
check를 false로 수행하도록 한 후 실행해보았다.
UClass* ClassRuntime = GetClass();
UClass* ClassCompile = UMyGameInstance::StaticClass();
check(ClassRuntime != ClassCompile);
- 언리얼엔진 에디터에 오류가 발생하면서 종료된다.
- Assertion failed가 발생하여 종료되었음을 알 수 있다.
- (참고) 이와 같은 상황에서 에디터가 종료되는 것이 번거롭다면 check 대신 ensure를 사용하면 에디터가 종료되지 않고 Output Log에서 에러 메시지 확인이 가능하다.

프로퍼티 시스템을 이용한 멤버 변수 값 출력
- 생성자에서 SchoolName에 기본값을 설정한다. 그리고 Init() 함수에서 SchoolName을 재정의하도록 한다.
- (참고) 언리얼 에디터에서 생성자의 기본값 변경은 잘 반영되지 못할때가 있다. 이럴 경우 헤더 파일을 변경할 때와 마찬가지로 에디터를 종료 후 재시작해야 된다.
- 로그로 기본값과 재설정 값을 확인한다. 기본값을 확인할때는 GetDefaultObject() 메소드를 사용하여 CDO에 접근하여 SchoolName 값을 가져오도록 한다.
#include "MyGameInstance.h"
UMyGameInstance::UMyGameInstance()
{
SchoolName = TEXT("기본학교");
}
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("==========================================="));
// ClassRuntime과 ClassCompile은 동일한 객체를 가리킴
UClass* ClassRuntime = GetClass();
UClass* ClassCompile = UMyGameInstance::StaticClass();
ensure(ClassRuntime == ClassCompile);
UE_LOG(LogTemp, Log, TEXT("학교를 담당하는 클래스 이름 : %s"), *ClassRuntime->GetName());
SchoolName = TEXT("언리얼학교");
UE_LOG(LogTemp, Log, TEXT("학교 이름 : %s"), *SchoolName);
UE_LOG(LogTemp, Log, TEXT("디폴트 학교 이름 : %s"), *GetClass()->GetDefaultObject<UMyGameInstance>()->SchoolName);
UE_LOG(LogTemp, Log, TEXT("==========================================="));
}
설정한 학교 이름과 디폴트 학교 이름이 정상적으로 출력된다.

'Unreal Engine 학습' 카테고리의 다른 글
| [UE5] Unreal Object 리플렉션 시스템 - 2 (0) | 2023.09.22 |
|---|---|
| [UE5] 언리얼 엔진 헤더 파일 #include시 주의사항 (0) | 2023.09.18 |
| [UE5] Unreal Object 기초 (0) | 2023.09.17 |
| [UE5] 문자열 - FName, FText (0) | 2023.09.17 |
| [UE5] 문자열 - FString (0) | 2023.09.17 |