Use blueprint variable in C++

C++¿¡¼­ ¼ø¼ö ºí·çÇÁ¸°Æ® º¯¼ö¸¦ ÀÐ¾î ¿À´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æ º»´Ù.
¾ð¸®¾ó ¹öÀüÀº 4.24.3ÀÌ´Ù.
ºí·çÇÁ¸°Æ®ÀÇ int º¯¼ö¸¦ °¡Á® ¿Ã°ÍÀÌ´Ù.

ºí·çÇÁ¸°Æ®¿¡ ´ÙÀ½°ú °°ÀÌ º¯¼ö¸¦ Ãß°¡ ÇÏ¿´´Ù.
º¯¼ö À̸§ : SplineID
ŸÀÔ : ÀÎƼÀú





LoadBluePrintTest : ºí·çÇÁ¸°Æ®¸¦ ·Îµù
GetBluePrintVariable : ºí·çÇÁ¸°Æ® º¯¼öÀ̸§À» ¹®ÀÚ¿­·Î ÁÖ°í °ªÀ» °¡Á® ¿Â´Ù.

//ºí·çÇÁ¸°Æ®ÀÇ ÀÎƼÀú º¯¼ö¸¦ ¸®ÅÏÇÑ´Ù.
bool GetBluePrintVariable(UObject* Target, FString VariableName, int& OutValue)
{
    UProperty* Prop = Target->GetClass()->FindPropertyByName(*VariableName);
    if (Prop->GetClass() == UIntProperty::StaticClass())
    {
        void* ValueAddr = Prop->ContainerPtrToValuePtr<void>(Target);
        UIntProperty* objectProp = Cast<UIntProperty>(Prop);
       
        OutValue = (int)objectProp->GetSignedIntPropertyValue(ValueAddr); //casting: int64 --> int
        //FString ValueStr = objectProp->GetNumericPropertyValueToString(ValueAddr);
        //int Value = objectProp->GetPropertyValue_InContainer(ValueAddr);  ÀÌ°Ç ÀÌ»óÇÑ°ªÀÌ ³ª¿È
        //UE_LOG(LogTemp, Log, TEXT("Have UObjectProperty: %s, %d!!!"), *(Target->GetName()), Value);

        return true;
    }

    return false;
}

//ºí·çÇÁ¸°Æ®¸¦ ·ÎµùÇؼ­ ºí·çÇÁ¸°Æ®ÀÇ USplineComponent ÄÄÆ÷³ÍÆ®¿¡ Á¢±ÙÇÑ´Ù.
void ASplineTestGameModeBase::LoadBluePrintTest()
{
    TArray<AActor*> ActorList;
    FName Path = TEXT("Blueprint'/Game/blueprint/Spline_BP.Spline_BP_C'");
    UClass* GeneratedBP = Cast<UClass>(StaticLoadObject(UClass::StaticClass(), NULL, *Path.ToString()));

    UGameplayStatics::GetAllActorsOfClass(GetWorld(), GeneratedBP, ActorList);
    for (int n = 0; n < ActorList.Num(); ++n)
    {
        AActor* Actor = ActorList[n];
        USplineComponent* SplineComponent = Actor->FindComponentByClass<USplineComponent>();
        if (SplineComponent)
        {
            int OutValue = 0;
            if(GetBluePrintVariable(Actor, TEXT("SplineID"), OutValue))
                UE_LOG(LogTemp, Log, TEXT("Have SplineComponent!!!"));
        }
    }
}