static void AddNamedValuesFromObject(const UObject* Ob, TArray<FEnvNamedValue>& NamedValues, TArray<FName>& RequiredParams) { if (Ob == NULL) { return; } for (UProperty* TestProperty = Ob->GetClass()->PropertyLink; TestProperty; TestProperty = TestProperty->PropertyLinkNext) { UStructProperty* TestStruct = Cast<UStructProperty>(TestProperty); if (TestStruct == NULL) { continue; } FString TypeDesc = TestStruct->GetCPPType(NULL, CPPF_None); if (TypeDesc.Contains(GET_STRUCT_NAME_CHECKED(FEnvIntParam))) { const FEnvIntParam* PropertyValue = TestStruct->ContainerPtrToValuePtr<FEnvIntParam>(Ob); AddNamedValue(PropertyValue->ParamName, EEnvQueryParam::Int, *((float*)&PropertyValue->Value), NamedValues, RequiredParams); } else if (TypeDesc.Contains(GET_STRUCT_NAME_CHECKED(FEnvFloatParam))) { const FEnvFloatParam* PropertyValue = TestStruct->ContainerPtrToValuePtr<FEnvFloatParam>(Ob); AddNamedValue(PropertyValue->ParamName, EEnvQueryParam::Float, PropertyValue->Value, NamedValues, RequiredParams); } else if (TypeDesc.Contains(GET_STRUCT_NAME_CHECKED(FEnvBoolParam))) { const FEnvBoolParam* PropertyValue = TestStruct->ContainerPtrToValuePtr<FEnvBoolParam>(Ob); AddNamedValue(PropertyValue->ParamName, EEnvQueryParam::Bool, PropertyValue->Value ? 1.0f : -1.0f, NamedValues, RequiredParams); } } }
void FEnvQueryParamSetupCustomization::CacheMyValues() { ValueProp = PropertyHandle->GetChildHandle(TEXT("Value")); NameProp = PropertyHandle->GetChildHandle(TEXT("ParamName")); FString TypeText, ExtendedTypeText; TypeText = PropertyHandle->GetProperty()->GetCPPType(&ExtendedTypeText, CPPF_None); if (TypeText.Contains(GET_STRUCT_NAME_CHECKED(FEnvIntParam))) { ParamType = EEnvQueryParam::Int; } else if (TypeText.Contains(GET_STRUCT_NAME_CHECKED(FEnvBoolParam))) { ParamType = EEnvQueryParam::Bool; } else { ParamType = EEnvQueryParam::Float; } FName NamedProperty; FPropertyAccess::Result PropResult = NameProp->GetValue(NamedProperty); bIsNamed = (PropResult == FPropertyAccess::Success && NamedProperty != NAME_None); LastPropName = bIsNamed ? NamedProperty : FName(TEXT("unknown")); }
FString DescribeProperty(const UProperty* Prop, const uint8* PropertyAddr) { FString ExportedStringValue; const UStructProperty* StructProp = Cast<const UStructProperty>(Prop); const UFloatProperty* FloatProp = Cast<const UFloatProperty>(Prop); if (StructProp && StructProp->GetCPPType(NULL, CPPF_None).Contains(GET_STRUCT_NAME_CHECKED(FBlackboardKeySelector))) { // special case for blackboard key selectors const FBlackboardKeySelector* PropertyValue = (const FBlackboardKeySelector*)PropertyAddr; ExportedStringValue = PropertyValue->SelectedKeyName.ToString(); } else if (FloatProp) { // special case for floats to remove unnecessary zeros const float FloatValue = FloatProp->GetPropertyValue(PropertyAddr); ExportedStringValue = FString::SanitizeFloat(FloatValue); } else { Prop->ExportTextItem(ExportedStringValue, PropertyAddr, NULL, NULL, 0, NULL); } const bool bIsBool = Prop->IsA(UBoolProperty::StaticClass()); return FString::Printf(TEXT("%s: %s"), *FName::NameToDisplayString(Prop->GetName(), bIsBool), *ExportedStringValue); }
void CollectBlackboardSelectors(const UObject* Ob, const UClass* StopAtClass, TArray<FName>& KeyNames) { for (UProperty* TestProperty = Ob->GetClass()->PropertyLink; TestProperty; TestProperty = TestProperty->PropertyLinkNext) { // stop when reaching base class if (TestProperty->GetOuter() == StopAtClass) { break; } // skip properties without any setup data if (TestProperty->HasAnyPropertyFlags(CPF_Transient) || TestProperty->HasAnyPropertyFlags(CPF_DisableEditOnInstance)) { continue; } const UStructProperty* StructProp = Cast<const UStructProperty>(TestProperty); if (StructProp && StructProp->GetCPPType(NULL, CPPF_None).Contains(GET_STRUCT_NAME_CHECKED(FBlackboardKeySelector))) { const FBlackboardKeySelector* PropData = TestProperty->ContainerPtrToValuePtr<FBlackboardKeySelector>(Ob); KeyNames.AddUnique(PropData->SelectedKeyName); } } }
bool CanUsePropertyType(const UProperty* TestProperty) { if (TestProperty->IsA(UNumericProperty::StaticClass()) || TestProperty->IsA(UBoolProperty::StaticClass()) || TestProperty->IsA(UNameProperty::StaticClass())) { return true; } const UStructProperty* StructProp = Cast<const UStructProperty>(TestProperty); if (StructProp) { FString CPPType = StructProp->GetCPPType(NULL, CPPF_None); if (CPPType.Contains(GET_STRUCT_NAME_CHECKED(FVector)) || CPPType.Contains(GET_STRUCT_NAME_CHECKED(FRotator))) { return true; } } return false; }