2017-08-01 92 views
1

部件我只是想找到連接到藍圖組件..查找連接到UBlueprint

現在,我有一個公開的藍圖來設置UProperty ..

UPROPERTY(EditAnywhere, BluePrintReadWrite, Category = "Associated Character") 
UBlueprint*         BMoveBlueprint; 

然後我收到此屬性設置時的事件..

void UTaskComponent::PostEditChangeChainProperty(FPropertyChangedChainEvent& PropertyChangedEvent) { 


    Super::PostEditChangeProperty(PropertyChangedEvent); 

    //Get the name of the property that was changed 
    FName PropertyName = (PropertyChangedEvent.Property != nullptr) ? PropertyChangedEvent.Property->GetFName() : NAME_None; 

    UE_LOG(LogTemp, Warning, TEXT("Property changed: %s"), *PropertyName.ToString()); 

    if (PropertyName == GET_MEMBER_NAME_CHECKED(UTaskComponent, BMoveBlueprint)) { 

     UBMoveComponent *BMoveComponent = (UBMoveComponent *) BMoveBlueprint->FindTemplateByName("BMove"); 

    } 
} 

我只想找到附加到藍圖的組件。這似乎並不奏效。

請指教。

回答

1

您可以使用FindComponentByClassUE Docs):

if (PropertyName == GET_MEMBER_NAME_CHECKED(UTaskComponent, BMoveBlueprint)) 
{ 
    auto comp = Cast<UBMoveComponent*>(BMoveBlueprint->FindComponentByClass(UBMoveComponent::StaticClass()); 
    if(comp) 
    { 
     //TODO (we have valid component, do something) 
    } 
} 

可以使用Cast<>甚至NULL輸入,所以它是安全的,做這種方式。

如果你有一些組件的多個實例,您可以使用下列內容:

TArray<UBMoveComponent*> comps; 

GetComponents(comps); 
if(comps.Num() > 0) 
{ 
    UBMoveComponent* FoundComp = comps[0]; 
     //do stuff with FoundComp 
} 

(代碼是基於羅摩的代碼UE Answers)。

+0

UBlueprint沒有FindComponentByClass方法。 = [。我試圖找到類似的東西......但我想知道這是否是一個明智的做法,因爲藍圖本身沒有編譯,也沒有實例化成員(?)我真正感興趣的是獲得拖到現場的藍圖。我認爲在這種情況下,藍圖是與其所有成員一起編制的,如果我能夠處理它,將爲我提供最好的服務。 – terminix00

+0

有什麼具體的原因,爲什麼'AActor * BMoveBlueprint;'對你來說不夠好?因爲如果您只想獲得對組件的引用,則不需要'UBlueprint'。此外,我認爲,您可以稍後將* blueprint-based * actor投射到'UBlueprint *'。 –