Unreal Blueprint:如何从Actor数组提取按钮到指定按钮数组?

问题描述
我拥有一个名为AcadamyFloor1ButtonActors的Actor数组,每个Actor中都包含一个带有按钮的Widget。我希望提取这些按钮并将其添加到另一个名为AcadamyFloor1ButtonArray的数组中。每个Actor内的Widget名称均不相同,且所有按钮的名称也都不重复,请问该如何实现?
解决方案
蓝图实现步骤
- 先清空
AcadamyFloor1ButtonArray数组,避免残留旧数据 - 使用
For Each Loop遍历AcadamyFloor1ButtonActors里的每一个Actor- 对当前Actor调用
Get All Widget Components节点,取返回数组的第一个元素(每个Actor只对应一个Widget) - 通过该Widget组件的
Get User Widget Object节点获取Widget实例 - 对Widget实例调用
Get All Children Widgets节点,遍历所有子控件- 添加类型判断,确认当前子控件属于
Button类(或你项目的自定义按钮子类) - 符合条件的话,调用
Add Item将按钮加入AcadamyFloor1ButtonArray
- 添加类型判断,确认当前子控件属于
- 对当前Actor调用
C++实现示例
#include "Components/WidgetComponent.h" #include "Blueprint/UserWidget.h" #include "Components/Button.h" void CollectFloorButtons() { AcadamyFloor1ButtonArray.Empty(); for (AActor* Actor : AcadamyFloor1ButtonActors) { if (!Actor) continue; TArray<UWidgetComponent*> WidgetComps; Actor->GetComponents<UWidgetComponent>(WidgetComps); for (UWidgetComponent* WidgetComp : WidgetComps) { if (!WidgetComp) continue; UUserWidget* Widget = WidgetComp->GetUserWidgetObject(); if (!Widget) continue; TArray<UWidget*> AllChildren; Widget->GetAllChildrenWidgets(AllChildren); for (UWidget* ChildWidget : AllChildren) { UButton* TargetButton = Cast<UButton>(ChildWidget); if (TargetButton && !AcadamyFloor1ButtonArray.Contains(TargetButton)) { AcadamyFloor1ButtonArray.Add(TargetButton); } } } } }
注意事项
- 全程要做空指针判断,防止运行时崩溃
- 如果用的是自定义按钮子类,把代码里的
UButton替换成你的自定义类即可 - 虽然按钮名称不重复,添加时做
Contains判断能避免意外重复
内容的提问来源于stack exchange,提问作者Savad
相关产品推荐
相关产品推荐

