【UE4】클래스로부터 UPROPERTY의 값을 취득하는 방법에 대해서

개요



UPROPERTY를 부여한 변수는 UE의 UProperty 클래스로 정보를 저장합니다.
변수명이나 그 값이 포함되어 있습니다.
요 전날 조사한 메모를 정리해 둡니다.

얻는 방법



UE4에 검색하려는 클래스의 멤버 변수 이름을 전달하여,
그 Uproperty를 얻는 방법이 있으므로 그쪽을 사용합니다.

Foo.cpp
// 取得したいクラスの StaticClass と、
// そのクラスに宣言したUPROPERTY付きの変数名を引数で渡します.
UProperty* Property = FindField<UProperty>( UMyClass::StaticClass(), TEXT("FieldName"));

이 방법으로 모든 멤버 변수를 얻을 수 있습니다.

또, 취득한 UProperty 클래스는 형태 마다 상속된 클래스가 되고 있습니다.
예를 들면

Sample.h

USTRUCT()
struct FStatus
{
:
    UPROPERTY()
    int32 HitPoint;
:
};

UCLASS()
class AHuman : AActor
{
public:
:
    UPROPERTY()
    FStatus* Property;
};

라는 클래스에서 값을 검색한다고 가정합니다.
Human이 가지는 Property 는 struct 의 변수이므로 UStructProperty 클래스가 되어 있습니다.

캐스트하여 해당 유형의 값을 가져올 수 있습니다.
UStructProperty* StructProperty = Cast<UStructProperty>( Property );

// UStructPropertyが持つstruct情報を取得します.
// 構造体が持つメンバー変数 HitPoint が取得できる想定です.
UField* Field = StructProperty->Struct->Children;

클래스가 가지는 UPROPERTY를 모두 취득한다



마지막으로 응용편입니다.
UField 클래스는 멤버 변수 Next에 다음 UField 포인터를 갖습니다.
이를 따라 모든 값을 얻을 수 있습니다.

샘플

// 適当な構造体を表します.
USTRUCT()
struct FMyStruct
{
:
    UROPERTY()
    int32 Value1;

    UPROPERTY()
    int32 Value2;
:
};

// 適当なクラスを表します.
UCLASS()
class UMyClass : UObject
{
:
    UPROPERTY()
    FMyStruct* MyStruct;
:
};

// UMyClass に含まれる変数を取得します.
UProperty* Property = FindField<UProperty>(UMyClass::StaticClass(), TEXT("MyStruct"));

// 構造体UPropertyへキャストします.
UStructProperty* StructProperty = Cast<UStructProperty>( Property );

// その構造体が持つメンバー変数を順番に取得します.
UField Field = StructProperty->Struct->Children;

// Field(MyStruct)が持つメンバー変数を取得します.
while ( Field != nullptr )
{
:
:
    // FMyStruct の Value1、Value2 の順にループします.
:
:
    // 次の要素を受け取ります.
    Field = Field->Next;
}

요약



게임 측의 처리에서는 별로 사용하지 않는다고 생각합니다만,
디버깅 기능으로 사용할 수 있다고 생각합니다
디버깅 기능과 문서를 만들 때 변수 이름을 추출하는 데 사용했습니다.

좋은 웹페이지 즐겨찾기