Ue5C++加载UI

 ue5加载ui和ue4略有不同,创建UIApI->CreateWidget有一些改动。

template <typename WidgetT = UUserWidget, typename OwnerT = UObject>
WidgetT* CreateWidget(OwnerT* OwningObject, TSubclassOf<UUserWidget> UserWidgetClass = WidgetT::StaticClass(), FName WidgetName = NAME_None)
{
	static_assert(TIsDerivedFrom<WidgetT, UUserWidget>::IsDerived, "CreateWidget can only be used to create UserWidget instances. If creating a UWidget, use WidgetTree::ConstructWidget.");
	
	static_assert(TIsDerivedFrom<OwnerT, UWidget>::IsDerived
		|| TIsDerivedFrom<OwnerT, UWidgetTree>::IsDerived
		|| TIsDerivedFrom<OwnerT, APlayerController>::IsDerived
		|| TIsDerivedFrom<OwnerT, UGameInstance>::IsDerived
		|| TIsDerivedFrom<OwnerT, UWorld>::IsDerived, "The given OwningObject is not of a supported type for use with CreateWidget.");

	SCOPE_CYCLE_COUNTER(STAT_CreateWidget);

	if (OwningObject)
	{
		return Cast<WidgetT>(UUserWidget::CreateWidgetInstance(*OwningObject, UserWidgetClass, WidgetName));
	}
	return nullptr;
}

两个模板参数需要传UUserWidgetUI类型和归属者类型,同时static_assert会判定两个模板类型是否符合规则。在ue4的时候归属者传this就可以了,这个有区别于ue4;

{
    auto uw= CreateWidget<UUserWidget,UWorld>(GetWorld(),hud); //hud是TSubclassOf<UUserWidget>类型
	if(uw)
	{
		uw->AddToViewport();
		uw->SetVisibility(ESlateVisibility::Visible);
	}
}

 添加umg需要的模块后使用这块代码就可以加载UI.

移除UI(2022/12/22新增)

void Ahha::UIRemove(UUserWidget* ui)
{
   ui->RemoveFromViewport();
}

 

posted @ 2022-12-15 10:01  过往云烟吧  阅读(875)  评论(0)    收藏  举报