UE4:反射系统获取UPROPERTY

读取方法

读取UPROPERTY标记的UObject类类型的属性

UE4提供一个迭代器进行字段遍历

TFieldIterator<T>

for (TFieldIterator<UProperty> i ( GetClass() ); i; ++i)

{

// 进行相关操作

UProperty* prop=*i; //i指向一个UProperty

}

获得了UProperty,如果需要进一步访问该属性的Name和Value

Name = prop.GetName();

UProperty* Property  FString PropertyName  *Propertylterator;  Property- >GetName ( )

获取属性的值则需要ContainerPtrToValuePtr

该函数有很多重载

https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/FProperty/ContainerPtrToValuePtr/index.html

如果是要获取一个UObject类类型的一个Uproperty的值,则

假设该对象为Object,该Uproperty为Property,对应类型为float

float* sourceAddr = Proerty->ContainerPtrToValuePtr<float>(Object);

就可以得到对应的value

也可以考虑封装成模板

template <typename ValueType>  EVa1ueType GetPropertyVa1ue(UProperty* Property, void* Object)  ValueType* SourceAddr = Property- ;  if (SourceAddr)  return *SourceAddr;  return *SourceAddr;

类型判断

如果不清楚UProperty对应的类型,可以使用Cast进行判断

template <typename To, typename From>  3FORCEINLINE To* src)  return TCastImp1<From, To>: : DoCast(Src) ;

比如

img

如果该Property是bool类型,那么返回值是true

在使用时需要注意想要获取的目标Property的指针非空,不然会直接触发异常中断,UE4直接崩掉。

Author: 木尘痕
Link: https://muchenhen.com/2020/08/23/UE4-%E5%8F%8D%E5%B0%84%E7%B3%BB%E7%BB%9F%E8%8E%B7%E5%8F%96UPROPERTY-lvning-xgame/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.