static UProperty *GetPropertyByName( UClass *InClass, const FName &Name ) { if ( InClass == NULL ) return NULL; UProperty *Property = GetPropertyByNameRecurse( InClass, Name.ToString() ); if ( Property != NULL ) { return Property; } AActor *AsActor = Cast<AActor>(InClass->ClassDefaultObject); if ( AsActor != NULL ) { FString ComponentPropertyName = Name.ToString(); int32 SplitIndex = 0; if ( ComponentPropertyName.FindChar( '.', SplitIndex ) ) { //FString ComponentName = ComponentPropertyName.LeftChop(SplitIndex); ComponentPropertyName = ComponentPropertyName.RightChop(SplitIndex+1); TInlineComponentArray<UActorComponent*> ActorComponents; AsActor->GetComponents(ActorComponents); for ( auto ComponentIt = ActorComponents.CreateIterator(); ComponentIt; ++ComponentIt ) { UActorComponent *Component = *ComponentIt; check( Component != NULL ); /* if ( Component->GetName() != ComponentName ) { continue; } */ Property = GetPropertyByNameRecurse( Component->GetClass(), ComponentPropertyName ); if ( Property != NULL ) { return Property; } } } } return NULL; }
static UProperty *GetPropertyByNameRecurse( UStruct *InStruct, const FString &TokenString, void ** hContainerPtr, int32 &OutArrayIndex ) { FString FirstToken; FString RemainingTokens; int32 SplitIndex; if ( TokenString.FindChar( '.', SplitIndex ) ) { FirstToken = TokenString.LeftChop( TokenString.Len()-SplitIndex ); RemainingTokens = TokenString.RightChop(SplitIndex+1); } else { FirstToken = TokenString; RemainingTokens = FString(TEXT("")); } //get the array index if there is any int32 ArrayIndex = 0; if ( FirstToken.FindChar( '[', SplitIndex ) ) { FString ArrayIndexString = FirstToken.RightChop( SplitIndex+1 ); ArrayIndexString = ArrayIndexString.LeftChop( 1 ); FDefaultValueHelper::ParseInt( ArrayIndexString, ArrayIndex ); FirstToken = FirstToken.LeftChop( FirstToken.Len()-SplitIndex ); } for (TFieldIterator<UProperty> PropertyIt(InStruct, EFieldIteratorFlags::IncludeSuper); PropertyIt; ++PropertyIt) { UProperty* Property = *PropertyIt; FName PropertyName = Property->GetFName(); if ( FirstToken == PropertyName.ToString() ) { if ( RemainingTokens.Len() == 0 ) { check( *hContainerPtr != NULL ); OutArrayIndex = ArrayIndex; return Property; } else { UStructProperty *StructProp = Cast<UStructProperty>(Property); if ( StructProp ) { check( *hContainerPtr != NULL ); *hContainerPtr = Property->ContainerPtrToValuePtr<void>( *hContainerPtr, ArrayIndex ); return GetPropertyByNameRecurse( StructProp->Struct, RemainingTokens, hContainerPtr, OutArrayIndex ); } } } } return NULL; }
static UProperty *GetPropertyByName( UObject *Target, UStruct *InStruct, const FString &PropertyName, void ** hContainerPtr, int32 &OutArrayIndex ) { UProperty *Prop = GetPropertyByNameRecurse( Target->GetClass(), PropertyName, hContainerPtr, OutArrayIndex ); if ( Prop == NULL ) { AActor *AsActor = Cast<AActor>(Target); if ( AsActor != NULL ) { FString ComponentPropertyName = PropertyName; int32 SplitIndex = 0; if ( ComponentPropertyName.FindChar( '.', SplitIndex ) ) { //FString ComponentName = ComponentPropertyName.LeftChop(SplitIndex); ComponentPropertyName = ComponentPropertyName.RightChop(SplitIndex+1); TArray<UActorComponent*> ActorComponents; AsActor->GetComponents(ActorComponents); for ( TArray<UActorComponent*>::TIterator ComponentIt(ActorComponents); ComponentIt && !Prop; ++ComponentIt ) { UActorComponent *Component = *ComponentIt; check( Component != NULL ); /* if ( Component->GetName() != ComponentName ) { continue; } */ *hContainerPtr = Component; Prop = GetPropertyByNameRecurse( Component->GetClass(), ComponentPropertyName, hContainerPtr, OutArrayIndex ); } } } } return Prop; }
static UProperty *GetPropertyByNameRecurse( UStruct *InStruct, const FString &TokenString ) { FString FirstToken; FString RemainingTokens; int32 SplitIndex; if ( TokenString.FindChar( '.', SplitIndex ) ) { FirstToken = TokenString.LeftChop( TokenString.Len()-SplitIndex ); RemainingTokens = TokenString.RightChop(SplitIndex+1); } else { FirstToken = TokenString; RemainingTokens = FString(TEXT("")); } if ( FirstToken.FindChar( '[', SplitIndex ) ) { FirstToken = FirstToken.LeftChop( FirstToken.Len()-SplitIndex ); } for (TFieldIterator<UProperty> PropertyIt(InStruct, EFieldIteratorFlags::IncludeSuper); PropertyIt; ++PropertyIt) { UProperty* Property = *PropertyIt; FName PropertyName = Property->GetFName(); if ( FirstToken == PropertyName.ToString() ) { if ( RemainingTokens.Len() == 0 ) { return Property; } else { UStructProperty *StructProp = Cast<UStructProperty>(Property); if ( StructProp ) { return GetPropertyByNameRecurse( StructProp->Struct, RemainingTokens ); } } } } return NULL; }