UE reflection obtains the Array data of the instance

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);

					//自行处理..
				}
			}
		}
	}
}

Guess you like

Origin blog.csdn.net/sinat_34870723/article/details/128850755