Widget Manager 设计思路学习

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")
posted @   Dream_moon  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示