一个结构体中存在一个Val变量,Val变量的类型是FVector4,想从c++层面去遍历获得Val的值
上图是很早之前的一个Property 继承关系图。
当然,在4.25UProperty 被FProperty 夺笋。
好处呢,见下:
没有继承UObject后的开销 提高了引擎启动时间 提高GC处理时间明显 内存使用量的减少 打包后包体体积减少
自定义结构体的遍历
USTRUCT(BlueprintType, meta=(HiddenByDefault))
struct FPostProcessSettings
{
PRAGMA_ENABLE_DEPRECATION_WARNINGS
GENERATED_USTRUCT_BODY()
...
}
FPostProcessSettings 是引擎提供的后处理的可配置参数的结构体变量
如果想修改
FPostProcessSettings* PostProcessSettings_P = &(this->Settings);
获取Contrast
FStructProperty* StructProperty=FindFieldChecked<FStructProperty>
(PostProcessSettings_P->StaticStruct(),FName("ColorContrast"));
如果采取直接遍历StructProperty 的如下方式,读取的值为0
if (StructProperty)
{
for (TFieldIterator<FProperty> PropIt(StructProperty->GetClass()); PropIt; ++PropIt)
{
FProperty* Property = *PropIt;
FFloatProperty* tempProperty = CastFieldChecked<FFloatProperty>(Property);
float temp1 = tempProperty->GetPropertyValue_InContainer(StructProperty);
UE_LOG(LogTemp,Warning,TEXT("%.2f"),temp1);
}
}
FProperty 没有FVector4Property
FVecyot4的定义如下 本质上仍然是一个结构体
遍历方式如下
if (StructProperty)
{
FVector4* v = StructProperty->ContainerPtrToValuePtr<FVector4>(PostProcessSettings_P);
v->X =2 ;
v->Y= 2;
v->Z= 1.2f;
UE_LOG(LogTemp,Warning,TEXT("%.2f,%.2f,%.2f,%.2f"),v->X,v->Y,v->Z,v->W);
}
参看 UE4 从UProperty到FProperty Unreal Property System (Reflection)
|