본문 바로가기
Unreal/Manual

Unreal Property System(Reflection)

by Dev_카페인 2023. 11. 2.
반응형

[Unreal] Property System(Reflection)

 

언리얼에서는 리플렉션 시스템을 프로퍼티라고 부른다. 왜냐하면 리플렉션은 그래픽 용어이기도 하기 때문이다. 프로퍼티 시스템에 등록했으면 하는 타입에 매크로를 달아두면 Unreal Header Tool(UHT)가 프로젝트를 컴파일할 때 정보를 수집한다.  예를 들면 다음 코드와 같다.

 

// 리플렉션이 있는 타입은 이 헤더파일을 인클루드해서 UHT에 알린다.
#include "MyObject.generated.h"

// MyObject는 리플렉션 되는 클래스임을 나타낸다.
UCLASS()
class UMyObject : public UObject
{
    // 자동 생성된 코드가 여기에 삽입된다는 마커.
    GENERATED_BODY()
    
    // MyFunc는 리플렉션 되는 멤버 함수임을 나타낸다.
	UFUNCTION()
    void MyFunc(int, double) {}
    
    // MyData는 리플렉션 되는 멤버 변수임을 나타낸다.
    UPROPERTY()
    int32 MyData;
    
    // 리플렉션이 되지 않는 것을 섞어도 된다.
    // 하지만 리플렉션 시스템에 보이지 않으므로 주의해야한다.
    uint8 MyNum;
    // 예를 들면 리플렉션 되지 않는 UObject 포인터를 저장하는 것은 
    // 가비지 컬렉터가 레퍼런스를 확인할 수 없기 때문에 위험하다.
    UObject* MyObjectRef;
}

// MyEnum은 리플렉션 되는 열거형임을 나타낸다.
UENUM()
enum class EMyEnum
{
    ....
};

// MyStruct는 리플렉션 되는 구조체임을 나타낸다.
USTRUCT()
struct FMyStruct
{
    GENERATED_BODY()
    
    UPROPERTY()
    int32 MyData;
    
    // 구조체의 멤버함수는 UFUNCTION으로 지정할 수 없다!
    // UFUNCTION()
    void MyFunc(double) {}
}

 

 

 

[Unreal Engine] 리플렉션(프로퍼티)과 가비지 컬렉션

리플렉션 위키피디아에서는 다음과 같이 설명하고 있다. Reflection is the ability of a process to examine, introspect, and modify its own structure and behavior. 런타임에 객체의 타입을 보는 Type Introspection을 포함해

upbo.tistory.com

정리가 잘 되어 있는 블로그 입니다.

 

generated.h와 UCLASS(), GENERATED_BODY()는 한 쌍으로 동작한다.

UCLASS()는 BP에서 이 클래스를 사용할 수 있게 해주는 역할
generated.h는 GENERATED_BODY()에 대한 헤더 GENERATED_BODY()는 생성자와 관련되어 있기도하다.

UCLASS에서 Blueprintable이나 BlueprintType을 지정하면 블루프린트 자체에서 사용할 수 있게 된다.

UCLASS()와 GENERATED_BODY() 사이에는 코드가 들어가면 안된다.
GENERATED_BODY()가 define에 의해서 코드를 만들어 주는데, 코드를 집어넣게되면 생성한 코드와 섞여 오류를 발생시킨다.

반응형