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