local Hud = {} local ESlateVisibility = import("ESlateVisibility") local WidgetBlueprintLibrary = import("WidgetBlueprintLibrary") local GameplayStatics = import("GameplayStatics") local BusyActorManagerSubSystem = import("BusyActorManagerSubSystem") local function ProcessSuspendShowRequests(hud) for _, request in pairs(hud.suspend_show_requests) do hud:CreateAndShowWidget(request[1], request[2]) end end function Hud:ctor() self.layer = nil self.suspend_show_requests = {} self.widget_pool = {} end function Hud:ReceiveBeginPlay() print("Hud:ReceiveBeginPlay") if self.layer == nil then self.layer = self:GetOrCreateWidget("UILayer") end if self.layer ~= nil then self.layer:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.layer:AddToViewport(0) self:CreateAndShowWidget("MainUI", {}) ProcessSuspendShowRequests(self) end end function Hud:ReceiveEndPlay() print("Hud:ReceiveEndPlay") end function Hud:GetOrCreateWidget(widget_name) local exist_widget = self.widget_pool[widget_name] if exist_widget ~= nil and exist_widget.bSingletonInstance then return exist_widget end local cls = self.UIClassMapping:Get(widget_name) local pc = GameplayStatics.GetPlayerController(self, 0) local widget = WidgetBlueprintLibrary.Create(self, cls, pc) self.widget_pool[widget_name] = widget return widget -- TODO 这里如果非单例widget,会被覆盖 end function Hud:GetFirstCachedWidget(widget_name) return self.widget_pool[widget_name] end function Hud:CreateAndShowWidget(widget_name, args) if not self.layer then table.insert(self.suspend_show_requests, {widget_name, args}) return end local widget = self:GetOrCreateWidget(widget_name) if not widget then return end self.layer:ShowWidget(widget, args) end function Hud:CloseWidget(widget) self.layer:CloseWidget(widget) end function Hud:HideWidgetByName(widget_name) self.layer:HideWidget(self.widget_pool[widget_name]) end return Class(nil, nil, Hud)