这个功能主要有2个技术点,第一:如何根据输入的控件类型返回对应控件类型的数组;第二:如何获取到对应类型的所有数组 第一点由UFUNCTION中的声明实现, meta=(WorldContext="WorldContextObject", DeterminesOutputType="WidgetClass", DynamicOutputParam="OutWights") DeterminesOutputType为返回值定义的类型,DynamicOutputParam为返回的参数,函数的声明如下: UFUNCTION(BlueprintCallable, Category="Actor", meta=(WorldContext="WorldContextObject", DeterminesOutputType="WidgetClass", DynamicOutputParam="OutWights")) static void GetAllChildrenWidgetOfClass(const UObject* WorldContextObject, const UPanelWidget* ParentPanel, const TSubclassOf<UUserWidget> WidgetClass, TArray<UUserWidget*>& OutWights);
第二点在函数的定义中,先获取PanelWidget中所有的子控件,然后根据子控件的类是否继承自指定类型,如果是,添加到输出数组中,如果不是,且子控件也是UPanelWidget类型,则递归调用该函数即可 void UAuraAbilitySystemLibrary::GetAllChildrenWidgetOfClass(const UObject* WorldContextObject, const UPanelWidget* ParentWidget, const TSubclassOf<UUserWidget> WidgetClass, TArray<UUserWidget*>& OutWights) { if(WidgetClass) { TArray<UWidget*> ChildrenWidget = ParentWidget->GetAllChildren(); for (UWidget* Widget : ChildrenWidget) { if(Widget->GetClass()->IsChildOf(WidgetClass)) { OutWights.Add(Cast<UUserWidget>(Widget)); } else if(const UPanelWidget* PanelWidgetTemp = Cast<UPanelWidget>(Widget)) { GetAllChildrenWidgetOfClass(WorldContextObject, PanelWidgetTemp, WidgetClass, OutWights); } } } }