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'");
}
}