Documentation
1.背包列表小部件.md
2025/12/16预计阅读 6 分钟
创建 MyBackpackWidget.h
属性添加meta=(BindWidget=true)来绑定到蓝图,命名需要保持一致.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MyBackpackComponent.h"
#include "MyBackpackItemWidget.h"
#include "Blueprint/UserWidget.h"
#include "Components/ScrollBox.h"
#include "Components/TextBlock.h"
#include "MyBackpackWidget.generated.h"
/**
*
*/
UCLASS()
class DEMO2_API UMyBackpackWidget : public UUserWidget
{
GENERATED_BODY()
public:
//背包列表小部件
UPROPERTY(BlueprintReadWrite, meta=(BindWidget=true), Category="背包组件")
UScrollBox* BackpackBox;
//背包名字
UPROPERTY(BlueprintReadWrite, meta=(BindWidget=true), Category="背包组件")
UTextBlock* BackpackNameText;
//背包组件
UPROPERTY(BlueprintReadWrite, DisplayName="背包数据", Category="背包数据", meta=(ExposeOnSpawn))
UMyBackpackComponent* BackpackComponent;
//背包小部件的类型,用它来创建对应的小部件
UPROPERTY(BlueprintReadOnly,EditAnywhere, Category = "背包数据",DisplayName="item类型")
UMyBackpackItemWidget* BackpackItemWidgetClass = nullptr;
//构造函数
virtual void NativeConstruct() override;
UMyBackpackWidget(const FObjectInitializer& ObjectInitializer);
//添加
UFUNCTION(Blueprintable)
void BindAddItemFunction(const FMyBackpackData Data);
//删除
UFUNCTION(Blueprintable)
void BindRemoveItemFunction(FMyBackpackData Data);
//清空
UFUNCTION(Blueprintable)
void BindCleanAllFunction();
};
创建 MyBackpackWidget.cpp
使用BackpackComponent->OnItemAdded.AddDynamic(this, &UMyBackpackWidget::BindAddItemFunction);来监听操作事件
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyBackpackWidget.h"
#include "MyBackpackItemWidget.h"
UMyBackpackWidget::UMyBackpackWidget(const FObjectInitializer& ObjectInitializer):
Super(ObjectInitializer),
BackpackBox(nullptr),
BackpackNameText(nullptr),
BackpackComponent(nullptr)
{
}
//初始化显示背包里面的物品.
void UMyBackpackWidget::NativeConstruct()
{
Super::NativeConstruct();
if (!BackpackComponent)
{
UE_LOG(LogTemp, Log, TEXT("背包空指针....进来了"));
GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, "not found backpack data");
}
else
{
const auto Backpack = BackpackComponent->GetBackpack();
if (BackpackNameText)
{
BackpackNameText->SetText(Backpack.Id);
}
UE_LOG(LogTemp, Log, TEXT("背包有多少个物品?:%d"), Backpack.Items.Num());
for (auto Items = Backpack.Items; const auto Item : Items)
{
//创建小部件
if (const auto ChildWidget = CreateWidget<
UMyBackpackItemWidget>(this, UMyBackpackItemWidget::StaticClass()))
{
ChildWidget->ChangeItemData(Item);
BackpackBox->AddChild(ChildWidget); //添加到滚动框
}
}
//添加绑定
BackpackComponent->OnItemAdded.AddDynamic(this, &UMyBackpackWidget::BindAddItemFunction);
BackpackComponent->OnCleanBackpack.AddDynamic(this, &UMyBackpackWidget::BindCleanAllFunction);
BackpackComponent->OnItemRemoved.AddDynamic(this, &UMyBackpackWidget::BindRemoveItemFunction);
}
}
void UMyBackpackWidget::BindAddItemFunction(const FMyBackpackData Data)
{
UE_LOG(LogTemp, Log, TEXT("监听到背包添加事件"));
if (!BackpackBox)
{
GEngine->AddOnScreenDebugMessage(-1, 3, FColor::Cyan,TEXT("backpack box is null"));
}
if (UMyBackpackItemWidget* NewBackpackItemWidgetClass = Cast<UMyBackpackItemWidget>(
CreateWidget(this, BackpackItemWidgetClass->GetClass())))
{
GEngine->AddOnScreenDebugMessage(-1, 3, FColor::Cyan,TEXT("start add widget..."));
NewBackpackItemWidgetClass->ChangeItemData(Data);
BackpackBox->AddChild(NewBackpackItemWidgetClass);
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 3, FColor::Red,TEXT("widget create failed!"));
}
}
void UMyBackpackWidget::BindRemoveItemFunction(FMyBackpackData Data)
{
GEngine->AddOnScreenDebugMessage(-1, 3, FColor::Green,TEXT("remove item!"));
}
void UMyBackpackWidget::BindCleanAllFunction()
{
UE_LOG(LogTemp, Log, TEXT("监听到背包清空事件"));
BackpackBox->ClearChildren();
GEngine->AddOnScreenDebugMessage(-1, 3, FColor::Green,TEXT("clear backpack!"));
}