跳到主内容
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!"));
}

返回顶部