UE4+C++开发-(五十九)-UI管理器第3篇(场景1:在 UMG 界面中调用(如按钮点击))-UI管理器,怎么调用,打开另一个UMG界面?

1、修改一下代码

1.1 XXXPlayerController.h文件

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "UMGManager.h"
#include "XXXPlayerController.generated.h"

UCLASS()
class XXXPROJECT_API AXXXPlayerController : public APlayerController
{
	GENERATED_BODY()

public:
	AXXXPlayerController();

	// 自动加载的UI路径
	UPROPERTY(EditAnywhere, Category = "UI Settings")
		FString AutoLoadWidgetPath;
	// 暴露UMG管理器供外部访问(设为public)
	UPROPERTY()
		UUMGManager* UMGManager;

protected:
	virtual void BeginPlay() override;

public:
	// 打开新UMG界面的方法
	UFUNCTION(BlueprintCallable, Category = "UI Management")
		UUserWidget* OpenNewWidget(const FString& WidgetPath);

	// 切换界面(关闭当前所有界面再打开新界面)
	UFUNCTION(BlueprintCallable, Category = "UI Management")
		UUserWidget* SwitchToWidget(const FString& WidgetPath);
};

1.2 XXXPlayerController.CPP文件

#include "XXXPlayerController.h"
#include "UObject/ConstructorHelpers.h"

AXXXPlayerController::AXXXPlayerController()
{
	PrimaryActorTick.bCanEverTick = false;
	UMGManager = nullptr;
	// 可以在这里设置默认UI路径(可选)
	 AutoLoadWidgetPath = "WidgetBlueprint'/Game/StarterContent/UMG/LoginUI.LoginUI_C'";
}

void AXXXPlayerController::BeginPlay()
{
	Super::BeginPlay();

	// 初始化UMG管理器
	UMGManager = NewObject<UUMGManager>();
	if (UMGManager)
	{
		UMGManager->Initialize(this);

		// 加载初始UI
		if (!AutoLoadWidgetPath.IsEmpty())
		{
			UUserWidget* LoadedWidget = UMGManager->LoadAndShowWidget(AutoLoadWidgetPath);
			if (LoadedWidget)
			{
				UE_LOG(LogTemp, Log, TEXT("初始UI加载成功: %s"), *AutoLoadWidgetPath);
			}
			else
			{
				UE_LOG(LogTemp, Error, TEXT("初始UI加载失败: %s"), *AutoLoadWidgetPath);
			}
		}
		else
		{
			UE_LOG(LogTemp, Warning, TEXT("未设置初始UI路径"));
		}
	}
	else
	{
		//UE_LOG(LogTemp, Error, TEXT("UMG管理器初始化失败"));
	}
}

UUserWidget* AXXXPlayerController::OpenNewWidget(const FString& WidgetPath)
{
	if (!UMGManager)
	{
		UE_LOG(LogTemp, Error, TEXT("UMG管理器未初始化,无法打开新界面"));
		return nullptr;
	}

	if (WidgetPath.IsEmpty())
	{
		UE_LOG(LogTemp, Error, TEXT("WidgetPath为空,无法打开界面"));
		return nullptr;
	}

	return UMGManager->LoadAndShowWidget(WidgetPath);
}

UUserWidget* AXXXPlayerController::SwitchToWidget(const FString& WidgetPath)
{
	if (!UMGManager)
	{
		UE_LOG(LogTemp, Error, TEXT("UMG管理器未初始化,无法切换界面"));
		return nullptr;
	}

	if (WidgetPath.IsEmpty())
	{
		UE_LOG(LogTemp, Error, TEXT("WidgetPath为空,无法切换界面"));
		return nullptr;
	}

	// 先关闭所有现有界面
	UMGManager->HideAllWidgets();

	// 再打开新界面
	return UMGManager->LoadAndShowWidget(WidgetPath);
}

3、.cpp里面调用

void ULoginWidget::OnSettingsButtonClicked()
{
	// 获取玩家控制器
	AXXXPlayerController* PlayerController = Cast<AXXXPlayerController>(
		UGameplayStatics::GetPlayerController(GetWorld(), 0)
		);

	if (PlayerController)
	{
		// 打开设置界面(替换为你的设置界面路径)
		PlayerController->SwitchToWidget("WidgetBlueprint'/Game/StarterContent/UMG/DaoHangUI.DaoHangUI_C'");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值