UObject는 어떻게 리플렉션이 가능한가?
2024년 3월 20일
언리얼의 리플렉션 #
원리 #
언리얼에서 오브젝트의 베이스는 UObject이다. UObject에서 파생된 클래스에 UCLASS 태그(UPROPERTY, UFUNCTION 등)를 달아두면, Unreal Header Tool(EpicGames.UHT.dll)이 언리얼 빌드 파이프라인 중에 실행되며 모든 C++ 헤더를 분석해서 리플렉션 정보를 포함하는 <파일명>.generated.h 파일과 <파일명>.gen.cpp 파일을 intermediate 폴더에 생성한다.
모든 UObject는 리플렉션이 가능하며, 모든 UObject는 generated.h와 gen.cpp를 가지고있다.
generated.h 를 확인해보면 DECLARE_CLASS 매크로를 사용하고 있고, 이 매크로에서 StaticClass를 구현한다.
결국 언리얼의 리플렉션이란 빌드하면서 UHT에 의해 파싱해온 클래스 정보 문자열을 자동으로 클래스에 포함시켜 주기 때문에 동적으로 클래스의 정보를 사용할 수 있게 되는것이다.
사용법 #
매크로 함수를 호출해서 리플렉션에 사용되는 함수들을 추가하거나 정보를 저장할 수 있게 한다. 매크로에 추가적인 속성도 전달할 수 있는데, 에디터 등에서 사용할 수 있는 조건을 거는것이다.
1#include "StrategyTypes.h"
2#include "StrategyChar.generated.h" // UHT가 생성하게 되는 리플렉션 정보가 담긴 헤더
3
4UCLASS(Abstract)
5class AStrategyChar : public ACharacter, public IStrategyTeamInterface
6{
7 // 추가적인 함수나 typedef를 주입해준다.
8 GENERATED_UCLASS_BODY()
9
10 // 블루프린트, 월드의 디테일패널 등 모든곳에서 편집가능하고, Pawn 카테고리에 표시된다.
11 UPROPERTY(EditAnywhere, Category=Pawn)
12 int32 ResourcesToGather;
13
14 UFUNCTION(BlueprintCallable, Category=Attachment)
15 void SetWeaponAttachment(class UStrategyAttachment* Weapon);
16
17protected:
18 UPROPERTY(EditDefaultsOnly, Category=Pawn)
19 UAnimMontage* MeleeAnim;
20
21 UPROPERTY()
22 UStrategyAttachment* ArmorSlot;
23
24 uint8 MyTeamNum;
25}
FMyClass::StaticClass() FMyStruct::StaticStruct(); UClass나 UStrct를 가져올 수 있다.