--- title: UE5 Lyra学习笔记(6)—CommonUI date: 2024-03-22 15:03:59 excerpt: tags: rating: ⭐ --- # 前言 - 全局管理类 - [[#UGameUIManagerSubsystem]] - [[#UGameUIPolicy]] - UPrimaryGameLayout - Widgets 使用[[#GameplayAbility]]检测玩家输入并且开启UI。 # UGameUIManagerSubsystem 父类为:UGameInstanceSubsystem,主要的功能是管理CurrentPolicy(UGameUIPolicy)。 # UGameUIPolicy # GameplayAbility Lyra使用2个位于Plugins/ShooterCore/Content/Input/Abilites/ - GAB_ShowWidget_WhenInputPressed - GAB_ShowWidget_WhileInputHeld GAB_ShowWidget_WhenInputPressed:![[GAB_ShowWidget_WhenInputPressed.png|800]] GAB_ShowWidget_WhileInputHeld,略微复杂一些会多一些:![[GAB_ShowWidget_WhileInputHeld.png|1200]] ## GameplayTasks - UCancellableAsyncAction - [[#UAsyncAction_PushContentToLayerForPlayer]] 核心函数逻辑如下,主要调用UPrimaryGameLayout::PushWidgetToLayerStackAsync() ```c++ void UAsyncAction_PushContentToLayerForPlayer::Activate() { if (UPrimaryGameLayout* RootLayout = UPrimaryGameLayout::GetPrimaryGameLayout(OwningPlayerPtr.Get())) { TWeakObjectPtr WeakThis = this; StreamingHandle = RootLayout->PushWidgetToLayerStackAsync(LayerName, bSuspendInputUntilComplete, WidgetClass, [this, WeakThis](EAsyncWidgetLayerState State, UCommonActivatableWidget* Widget) { if (WeakThis.IsValid()) { switch (State) { case EAsyncWidgetLayerState::Initialize: BeforePush.Broadcast(Widget); break; case EAsyncWidgetLayerState::AfterPush: AfterPush.Broadcast(Widget); SetReadyToDestroy(); break; case EAsyncWidgetLayerState::Canceled: SetReadyToDestroy(); break; } } SetReadyToDestroy(); }); } else { SetReadyToDestroy(); } } ```