foreword
Test version: UE5
accomplish
Setting: (pseudocode)
class UObject TestA{
};
class UObject TestB
{
protected:
TArray<TestA*> InstanceAs;
};
TestB* InstanceB;
Goal: Get every instance of TestA
accomplish:
//得到TestB的成员反射信息
//也可以使用封装好的函数:(内部也是这样进行遍历)
//FProperty* OuterProperty = FindFieldChecked<FProperty>(InstanceB->GetClass(), "InstanceAs")
for (TFieldIterator<FProperty> it(InstanceB->GetClass()); it; ++it)
{
if (it->GetName() == "InstanceAs")
{
//FArrayProperty是队列类型,如果是Map类型用FMapProperty,以此类推
FArrayProperty* arrayProperty = CastField<FArrayProperty>(*it);
for (int32 dimIndex = 0; dimIndex < arrayProperty->ArrayDim; ++dimIndex)
{
//根据类和实例,得到队列的运行时数据
FScriptArrayHelper_InContainer scriptArrayHelper(arrayProperty, InstanceB, dimIndex);
int32 arrayNum = scriptArrayHelper.Num();
if (FObjectProperty* ObjectProperty = CastField<FObjectProperty>(arrayProperty->Inner))
{
for (int32 dynamicIndex = 0; dynamicIndex < arrayNum; ++dynamicIndex)
{
//得到每个实例的运行时数据
const void* arrayValuePtr = scriptArrayHelper.GetRawPtr(dynamicIndex);
//得到实例
UObject* uobjectInstance = ObjectProperty->GetObjectPropertyValue_InContainer(arrayValuePtr);
//自行处理..
}
}
}
}
}