首页 > 其他分享 >Widget Manager 设计思路学习

Widget Manager 设计思路学习

时间:2024-08-20 15:42:17浏览次数:8  
标签:Widget LoadUI name Manager UI UWidgetManager 思路 RegisterWidget

Widget Manager 设计思路学习

两种类型UI的创建方式

Widget State

Map 存储当前创建的 UI

// 用于存储当前 SourcerType 类的 TextureUI 集合 特定下的TextureUI列表
TMap<ESourceType, TArray<UTextureUI*>> TextureMap;
// 用于存储当前 SourcerType 类的 Widget 
TMap<ESourceType, UWidget*> WidgetMap;
// 根据 String 存储对应的 UserWidget 广泛的其他 UI
TMap<FString, UUserWidget*> UIMap;

通过 SourceType 类型控制当前只能显示的 UI

// 用于存储当前 SourceType 状态
ESourceType WidgetState;
// 属于同一类的 UI 显示,其他类型的 UI 隐藏
bool ChangeWidgetState(ESourceType state);

LoadUI

用于创建、加载、显示对应名字的 UI

template<typename T = UUserWidget>
T* LoadUI(const FString& prefix = "UMG", bool bVis = true) {
	FString name = T::StaticClass()->GetName();
	return Cast<T>(LoadUI(name, prefix, bVis));
}

UUserWidget* UWidgetManager::LoadUI(const FString& name, const FString& prefix, bool bVis) {
    // 如果没有存储,则重新创建并加入
	if (!UIMap.Contains(name)) {
		UClass* cl = LoadClass<UUserWidget>(NULL, *FString::Printf(TEXT("/Game/Blueprints/%s/%s.%s_C"),*prefix, *name, *name));
		UUserWidget* UI = CreateWidget<UUserWidget>(World, cl);
		UI->AddToViewport();
		UIMap.Add(name, UI);
	}
    // 控制是否显示UI
	UUserWidget* widget = UIMap[name];
	ESlateVisibility visibility = widget->GetVisibility();
	ESlateVisibility newVisibility = bVis ? ESlateVisibility::SelfHitTestInvisible : ESlateVisibility::Hidden;
	if (visibility != newVisibility)
		widget->SetVisibility(newVisibility);
	return widget;
}

宏定义

Register Widget

注册组件

#define RegisterWidget(sourceType, widget) \
	FWidgetInfo sourceType ## Info; \
	sourceType ## Info.TextureName = #sourceType; \
	UWidgetManager::Get()->WidgetInfoMap.Add(sourceType, sourceType ## Info); \
	UWidgetManager::Get()->WidgetMap.Add(sourceType, widget);

对初始化时已经在UI上创建过的 Widget ,进行注册,从而记录进 WidgetManager 中,方便管理

	RegisterWidget(ENoneType, ButtonPanel);
	RegisterWidget(Furniture, FurnitureListPanel);
	RegisterWidget(Material, MaterialListUI);
	RegisterWidget(Group, GroupListUI);
	RegisterWidget(RoomObject, RoomObjectListUI);
	RegisterWidget(Replace, ReplaceFurnitureList);
	UWidgetManager::Get()->ChangeWidgetState(ESourceType::ENoneType);

LoadUI

当创建某些 UI 时,运用这种方法

#define GetUI(clas) UWidgetManager::Get()->LoadUI<clas>()
#define GetHiddenUI(clas) UWidgetManager::Get()->LoadUI<clas>("UMG", false)
#define GetClientUI(clas) UWidgetManager::Get()->LoadUI<clas>("Client")

标签:Widget,LoadUI,name,Manager,UI,UWidgetManager,思路,RegisterWidget
From: https://www.cnblogs.com/Dreammoon/p/18369521

相关文章

  • 换个思路搞科研,一年发10篇顶会顶刊
     1、SLAM/3DGS/三维点云/医疗图像/扩散模型/结构光/Transformer/CNN/Mamba/位姿估计顶会论文指导2、基于扩散模型的跨域鲁棒自动驾驶场景理解3、基于环境信息的定位,重建与场景理解4、轻量级高保真GaussianSplatting5、基于大模型与GS的6Dposeestimation6、在挑战性......
  • Message Manager 设计思路学习
    MessageManager设计思路学习设计思路设计项目中不同类之间的消息通信和分发系统时,可以考虑以下思路:定义消息类型:使用枚举或常量定义所有可能的消息类型,这有助于保持系统的可维护性和可扩展性。消息中心:创建一个中央消息管理器或事件总线,它负责接收和分发消息。这个中心应该......
  • Android UsbDeviceManager 代码分析
    USBDeviceManager是一个Android系统中用于管理USB设备的类,它是系统服务之一。其主要功能是控制USB设备的连接和断开,以及管理USB设备的权限和状态。下面是对USBDeviceManager代码的简要分析:USBDeviceManager的构造函数:在USBDeviceManager的构造函数中,它会调用系统服务框架的regis......
  • 【LGR-196-Div.4】洛谷入门赛 #26 题A - H 详细题解--优化思路简洁代码(C++,Python语
    前言:    觉得这个比赛很有意思的,都是暴力题,涉及一些细节,难度比较适合刚学编程语言的,可以很好的锻炼基础还有手速,最后两题也是比较有意思,之后也准备更新atc的比赛题解和洛谷的一些高质量比赛题解(算法网瘾就是想参加各种比赛)   如果觉得有帮助,或者觉得我写的好,......
  • AI 创业及变现新思路:零门槛 AI 绘图,定制 ComfyUI Serverless API 应用
    作者:鸥弋、筱姜2023年下半年,ComfyUI以其快速、流畅的图像生成能力,结合多样的自定义节点,迅速在创作者中流行起来。ComfyUI的亮点就是能够批量化生成图像,一键加载大量工作流,让用户可以轻松实现人像生成、背景替换、风格迁移和图像动画化等功能。越来越多的企业及个人开发者希望......
  • CANoe小白上手思路
    本文申明:2024.8.19无实操截图,皆在提供新建仿真工程思路,按个人需求根据CANoe明显的图标名称进行操作。操作环境:CANoe版本9.0.54,CANcase版本VN1610/30/40。新建工程和配置网络第一步:连上CANcase,打开CANoe,选择可用模板并创建配置新建工程,之后配置波特率。第二步:Mapping配......
  • springboot 缓存-cacheManager
    日常项目中如果对接口响应时间要求较高通常需要结合redis对接口进行缓存处理。1.pom文件中引入redisjar<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><......
  • 数字化转型探索:揭秘检验检测行业转型思路
    最新技术资源(建议收藏)https://www.grapecity.com.cn/resources/行业背景随着科技的不断进步和实验室管理需求的不断发展,传统实验室管理方式面临着许多问题,如采用纸质记录和手工操作、数据易丢失和难以追溯、效率低下、流程复杂以及质量管理不规范等。这些问题已经成为......
  • 2024年高教社杯数学建模国赛B题思路解析+代码+论文
    2024年高教社杯全国大学生数学建模竞赛(以下简称国赛)将于9月5日晚6时正式开始。下文包含:2024国赛思路解析​、国赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮......
  • UsbHostManager解析
    UsbHostManager和UsbDeviceManager的区别在于,UsbDeviceManager是将手机作为一个设备,比如手机连上电脑,使用adb、mtp等;而UsbHostManager,是将手机作为一个host,比如手机连接usb鼠标、usb摄像头等,就会new出一个UsbDevice出来。UsbHostManager初始化UsbHostManager和UsbDeviceManager......