77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
|  | 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) |