You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:01