【UE】Component 间 Property 拷贝

【UE】Component 间 Property 拷贝
直接上代码.hpublic:UFUNCTION(BlueprintCallable)staticboolCopyPropertiesBetweenActorComponents(constUActorComponent*SrcComponent,UActorComponent*DstComponent);.cppboolUTestBlueprintFunctionLibrary::CopyPropertiesBetweenActorComponents(constUActorComponent*SrcComponent,UActorComponent*DstComponent){check(SrcComponentDstComponent);if(SrcComponent-GetClass()!DstComponent-GetClass()){UE_LOG(LogEngine,Error,TEXT([CopyPropertiesBetweenActorComponents] Only support copying between components with the same class, skip SrcComponent: %s, DstComponent: %s),*SrcComponent-GetPathName(),*DstComponent-GetPathName());returnfalse;}UClass*SrcClassSrcComponent-GetClass();constUActorComponent*DefaultComponentGetDefaultUActorComponent(SrcClass);// 出作用域后会 ReRegister DstComponentconstboolbWasRegisteredDstComponent-IsRegistered();TUniquePtrFComponentReregisterContextReregisterContext;if(bWasRegistered){ReregisterContextMakeUniqueFComponentReregisterContext(DstComponent);}for(TFieldIteratorFPropertyPropIt(SrcClass,EFieldIteratorFlags::IncludeSuper);PropIt;PropIt){FProperty*SrcProperty*PropIt;constFString PropertyNameSrcProperty-GetName();if(SrcProperty-HasAnyPropertyFlags(CPF_Transient|CPF_DuplicateTransient|CPF_NonPIEDuplicateTransient|CPF_Deprecated|CPF_EditConst)){continue;}if(!SrcProperty-HasAnyPropertyFlags(CPF_Edit)){continue;}constvoid*SrcValuePtrSrcProperty-ContainerPtrToValuePtrvoid(SrcComponent);if(!SrcValuePtr){continue;}FProperty*DstPropertyDstComponent-GetClass()-FindPropertyByName(SrcProperty-GetFName());if(!DstProperty){continue;}void*DstValuePtrDstProperty-ContainerPtrToValuePtrvoid(DstComponent);if(!DstValuePtr){continue;}constvoid*DefaultValuePtrSrcProperty-ContainerPtrToValuePtrvoid(DefaultComponent);if(DefaultValuePtr!SrcProperty-Identical(SrcValuePtr,DefaultValuePtr)){SrcProperty-CopyCompleteValue(DstValuePtr,SrcValuePtr);}}if(!bWasRegistered){if(USceneComponent*DstSceneCastUSceneComponent(DstComponent)){DstScene-UpdateComponentToWorld();}}returntrue;}测试SrcActorDstActorLevel BPRunPress E