
最近因为一些需求,想要访问一下UE4放在Protected或者Private里的属性,或者需要在C++里获取蓝图里创建的变量。于是研究了一下通过UProperty获取和设置成员变量。
首先,获取一个Class里的所有Uproperty,以及读出其值的方式UE4源码里有很多,随便找了一段贴在下面。

通过TFieldIterator 获取某一个Class里所有的UProperty的迭代器,这里的UProperty就是类的某个成员变量的反射信息,然后经过循环遍历所有的UProperty的迭代器,根据其存储的变量反射信息找到指定的变量。上图里是筛选出结构体变量,常用比较多的可以通过名字 It->GetName(FString &)做筛选。然后使用 UProperty的ContainerPtrToValuePtr(UObject* ContainerPtr,..)来获取指定对象的成员变量。
要是用这种方式获取并修改变量得要知道2个信息。
1.UClass
2.UClass创建出来的类对象
以此引申出UE4里各种情况下获取UClass的方式(欢迎大佬补充)
1.已获得类实例对象,并且获取的成员变量就是当前指针类型:
如 UObject* Ptr = NewObject<UObject>();你要获取的变量就是UObject上的,且你的对象是UObject的子类。那么直接UObject::StaticClass()获取UClass,或者Ptr ->StaticClass()获取Uclass,集齐两个要数,开始循环吧。
2.已获得类实例对象,但是获取的成员变量不是当前指针类型:
如 UObject* Ptr = GetWorld()->SpawnActor<AActor>();你要获取的变量是Actor上的,但是你的对象是被UObject* 引用的。那么请用Ptr ->GetClass()获取Uclass。或许有人说这个直接用AActor:::StaticClass()不就好了么。但是有时候这个变量是在蓝图创建的,要获取蓝图实例对象上蓝图里创建的某个变量,那么就只有这样获取了。
3.已获取的是UBlueprint的对象,要获取并修改这个蓝图资源上的某个变量。
这种情况常发生在需要修改蓝图资源的情况。这时我们是既不知道UClass,也不知道UClass创建出来的类对象。
要获取UClass:
UBlueprint的基类有一个GeneratedClass变量就是其UClass
要获取对象:
UE4编辑器在初始化时会给每一个UClass创建一个DefaultObject,通过UClass的对象获取,其实DefaultObject也就是蓝图资源所对应的对象,修改了其变量值,就是修改了蓝图资源上对应变量的值。当然要真正的修改资源上的数据,需要在修改后保存资源。后面会贴上保存资源的方式。
如此一来就集齐了两个要数,可以开始循环。
PS:在第三种情况下不能用ContainerPtrToValuePtr获取指定对象的成员变量,需要用
ContainerPtrToValuePtrForDefaults函数获取。
此处为简易粗暴的保存蓝图资源方式
