Example #1
3
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;
	}