首页 > 编程语言 >UE5中简易的UI管理框架(c++版,UE5.1)

UE5中简易的UI管理框架(c++版,UE5.1)

时间:2024-03-22 13:58:24浏览次数:28  
标签:panelName UE5.1 void c++ panelStack UI UIManager AUIManager

需求说明:

在UE项目开发中,当UI界面较多的时候,就需要有一个管理功能出现,负责UI的生成、销毁、禁用等功能。

基于此需求,采用栈先进后出的数据接口,编写了一个简易的UI管理框架。

功能说明:

1.支持UI的自动创建

2.支持UI的按开启顺序关闭

3.支持一件关闭所有UI

4.支持开启当前UI后,禁用上一个UI的操作

5.管理类继承自AActor类,所以支持在面板配置UI信息

接口说明:

1.OpenUI:通过传入自定义的UI名来生成UI,如果hideLastUI为true,则隐藏上一个UI,否则,上一个UI继续显示

void OpenUI(const FString panelName,const bool hideLastUI );

2.CloseUI:关闭当前UI

void CloseUI();

3.CloseAllUI:关闭生成的所有UI

void CloseAllUI();

源码:

UIManager.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "UIManager.generated.h"

UCLASS()
class THIRDPERSONCPP_API AUIManager : public AActor
{
	GENERATED_BODY()
	
public:
	/// <summary>
	/// panelname,panel reference
	/// </summary>
	UPROPERTY(EditAnywhere, Category = "UIManager")
	TMap<FString, TSubclassOf<UUserWidget>> panelInfos;


	/// <summary>
	/// panelname, panel renference path
	/// </summary>
	UPROPERTY(EditAnywhere, Category = "UIManager")
	TMap<FString, FString> panelInfos2;

	TArray<UUserWidget*> panelStack;


public:	
	// Sets default values for this actor's properties
	AUIManager();
	UFUNCTION(BlueprintCallable, Category = "UIManager")
	void OpenUI(const FString panelName,const bool hideLastUI );
	UFUNCTION(BlueprintCallable, Category = "UIManager")
	void CloseUI();
	UFUNCTION(BlueprintCallable, Category = "UIManager")
	void CloseAllUI();



protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

UIManager.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "UIManager.h"
#include "Blueprint/UserWidget.h"
#include "MyBlueprintFunctionLibrary.h"
// Sets default values
AUIManager::AUIManager()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

void AUIManager::OpenUI(const FString panelName,const bool hideLastUI = true)
{
	
	if (panelInfos.Contains(panelName) == false) return;
	
	TSubclassOf<UUserWidget> t =panelInfos[panelName];
	if (t == false)
	{
		UE_LOG(LogTemp, Error, TEXT("Can't  find UI refence, please check"));
		return;
	}



	//如果是第一次
	if (panelStack.Num() == 0)
	{
		//GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT("A : %f"), AA));
		// //UE_LOG(LogTemp, Warning, TEXT("ThreadName::::::::::::%s"), *ThreadName);
		//直接生成,入栈
		//根据对象生成
		UUserWidget* temp = CreateWidget<UUserWidget>(GetWorld(), *panelInfos[panelName]);
		//根据路径生成
		//TSubclassOf<UUserWidget> clss = LoadClass<UUserWidget>(this, *panelInfos2[panelName]);
		//UUserWidget* umg = CreateWidget<UUserWidget>(GetWorld(), clss);
		temp->AddToViewport();
		panelStack.Push(temp);
		return;
	}

	UUserWidget* last = panelStack[panelStack.Num() - 1];
	if (hideLastUI)
	{
		last->SetVisibility(ESlateVisibility::Hidden);
	}
	last->SetIsEnabled(false);

	UUserWidget* temp = CreateWidget<UUserWidget>(GetWorld(), *panelInfos[panelName]);
	temp->AddToViewport();
	panelStack.Push(temp);

}

void AUIManager::CloseUI()
{
	if (panelStack.Num() == 0)return;
	UUserWidget* umg = panelStack.Pop();
	umg->RemoveFromViewport();

	if (panelStack.Num() == 0)return;
	UUserWidget* newUMG = panelStack[panelStack.Num() - 1];
	newUMG->SetVisibility(ESlateVisibility::Visible);
	newUMG->SetIsEnabled(true);

}

void AUIManager::CloseAllUI()
{
	while (panelStack.Num() > 0)
	{
		UUserWidget* umg = panelStack.Pop();
		umg->RemoveFromViewport();
	}
}

// Called when the game starts or when spawned
void AUIManager::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AUIManager::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

使用教程:

1.新建UIManager c++类(参照上述代码)
2.基于UIManager类新建蓝图对象

    

3.将A_UIManager蓝图对象拖放到关卡中

4.配置UI信息

在Panel Infos中添加ui信息,key是你自定义的UI名,value是这个UI的对象

5.蓝图调用

在任意位置都可以调用,打开UI时,通过传入你配置的UI名,和设置是否隐藏上一个打开的UI即可

关闭单个UI时,无需传参,直接关闭即可

关闭所有UI时,无需传参,直接关闭即可

标签:panelName,UE5.1,void,c++,panelStack,UI,UIManager,AUIManager
From: https://blog.csdn.net/u010804261/article/details/136929680

相关文章

  • C++ Stacks(堆栈) 和 Queues(队列)的基本用法
    一、栈1.栈的定义        栈(stack)是限定仅在表的一端进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶(stacktop),另一端称为栈底(stackbottom),不含任何数据元素的栈称为空栈。        如图1-1所示,栈中有三个元素,插入元素(也称为入栈、进栈、压......
  • 【RedHat】重启服务器进入了emergency mode紧急状态——UUID不匹配
    启动redhat系统时出现emergencymode,处于紧急模式。并提示可以在登录root用户输入root用户密码后,通过journalctl-xb查看系统日志;systemctlreboot重启系统;systemctldefault或者exit进入默认模式。进入紧急模式的通常原因有两种:一种是/etc/fstab文件开机自动挂载的......
  • 九宫幻方(DFS实现)c++
    题目描述题目分析要完成这个问题,我们需要做这几步1.用1~9的数字替换掉输入中的0,且幻方中不能出现重复元素2.替换完成后,要判断是否为幻方判断是否为幻方boolcheck()//检查是否为幻方{ intsum=a[1][1]+a[2][2]+a[3][3];//左对角线的和 if(sum!=a[1][3]+a[2][2]+a[......
  • Ubuntu2204 GUI root用户无法登录的处理方法
    Ubuntu2204GUIroot用户无法登录的处理方法背景今天上午同事cloneubuntu2204之后想通过GUI登录修改IP以及进行一些安全设置发现root用户登录输入密码后就会返回登录界面.会进入一个无线死循环的额状态.这里记录一下进行地址设置和解决root登录的问题.解决IP地址的设......
  • 界面组件Telerik UI for Winforms 2024 Q1新版亮点 - 全新的Win 11主题
    TelerikUIforWinForms拥有适用WindowsForms的110多个令人惊叹的UI控件,所有的UIforWinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。本文将介绍界面组件TelerikUIforWinforms在今年第一个重大版本2024Q1......
  • SQLiteC/C++接口详细介绍sqlite3_stmt类(一)
    返回目录:SQLite—免费开源数据库系列文章目录   上一篇:SQLiteC/C++接口详细介绍sqlite3_stmt类简介下一篇:SQLiteC/C++接口详细介绍sqlite3_stmt类(二)​序言:本文开始了SQLite的第二个类的详细介绍了,有兴趣的朋友可以关注更新一下。 1、sqlite3_prepare_v2()`sqlite3......
  • Android11.0 SystemUI 下拉通知栏去掉左右滑动通知菜单功能
    1.前言在11.0的系统rom产品定制化开发中,在systemui模块中关于下拉状态栏这块也是非常重要的部分,最近在关于systemui下拉通知栏的每条通知部分要求去掉通知栏通知的长按事件,不需要长按功能,所以就需要分析下关于长按事件是在哪里注册的,然后去掉就可以了,接下来分析实现相关功能......
  • burpsuit插件Turbo Intruder:突破速率限制详解
    一、插件介绍Turbo Intruder是一个BurpSuite扩展插件,用于发送大量HTTP请求并分析结果,可拥抱十亿请求攻击。它旨在处理那些需要异常速度、持续时间或复杂性的攻击来补充Burp Intruder。二、插件原理使用第一次请求的时候就建立好连接,后续获取资源都是通过这条连接来获取资......
  • C++对象切片探秘:派生类对象如何被‘切割’?
     概述:C++中的对象切片指通过将派生类对象赋值给基类对象,导致派生部分被“切掉”,只保留基类部分。这可能发生在值传递、赋值等操作中。对象切片的基础功能示例展示了派生类对象赋值给基类对象时的现象,而高级功能示例则展示了通过基类指针实现派生类对象的访问和多态。对象切片......
  • C++序列点解析:确保代码行为可控的关键步骤
     概述:在C++中,序列点是表达式中确保求值顺序的点。其缺失可能导致未定义行为。基础功能示例演示了自增运算符的序列点,而高级功能示例展示了函数调用的序列点,有助于避免不确定行为。在编写代码时遵循序列点规则是确保程序行为可预测的关键。在C++中,序列点是在表达式中保证求值......