---@class WB_SelectMiniGame_C:UUserWidget ---@field Button_SelectMap UButton ---@field HorizontalBox_PlayerReadys UHorizontalBox ---@field TextBlock_Desc UTextBlock ---@field TextBlock_MiniGameName UTextBlock ---@field TextBlock_SelectTime UTextBlock ---@field UniformGridPanel_Items UUniformGridPanel ---@field WidgetSwitcher_IsSelected UWidgetSwitcher --Edit Below-- local WB_SelectMiniGame = { bInitDoOnce = false; ItemsCol = 5; SelectedMaps = {}; bCanClickSelect = true; }; function WB_SelectMiniGame:Construct() WidgetLibrary.BindButtonClicked(self.Button_SelectMap, self.ClickSelect, self) WidgetLibrary.TextBlockBindingPropertyText(self.TextBlock_SelectTime, self.UpdateSelectTime, self) UGCEventSystem.AddListener(EventEnum.SelectMiniGameCallBack, self.SelectMiniGameCallBack, self) UGCEventSystem.AddListener(EventEnum.UpdatePlayerScoreData, self.UpdatePlayerHead, self) UGCEventSystem.AddListener(ArchiveDataConfig.GetParamNotifyEvent(ArchiveDataConfig.EArchiveType.MapStar), self.UpdateStarCount, self) self:InitMiniGameItem() self:UpdatePlayerHead() self:ItemSelectMiniGame(math.max(table.unpack(table.getKeys(MiniGameConfig.MiniGameInfo)))) -- Test -- UGCEventSystem.SetTimerLoop(self, self.UpdateStarCount, 0.5) end function WB_SelectMiniGame:UpdateSelectTime() return tostring(UGCGameSystem.GameState.WaitPlayerJoinTime) end function WB_SelectMiniGame:GetItemClass() if self.ItemClass == nil then self.ItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/StatusUI/MiniGame/MiniGameSelect/WB_MiniGameItem.WB_MiniGameItem_C')) end return self.ItemClass end function WB_SelectMiniGame:InitMiniGameItem() local Index = 0 local MiniGameTypes = table.getKeys(MiniGameConfig.MiniGameInfo) table.sort(MiniGameTypes, function(a, b) return a > b end) UGCLogSystem.LogTree("[WB_SelectMiniGame_InitMiniGameItem] MiniGameTypes", MiniGameTypes) local PlayerStarCount = ArchiveDataConfig.GetPlayerArchiveDataFromType(UGCSystemLibrary.GetLocalPlayerKey(), ArchiveDataConfig.EArchiveType.MapStar) if PlayerStarCount == nil then PlayerStarCount = {} end for _, MiniGameType in pairs(MiniGameTypes) do local ItemInst = UserWidget.NewWidgetObjectBP(UGCSystemLibrary.GetLocalPlayerController(), self:GetItemClass()) self.UniformGridPanel_Items:AddChild(ItemInst) local TargetUniformGridSlot = WidgetLayoutLibrary.SlotAsUniformGridSlot(ItemInst) -- 居中 TargetUniformGridSlot:SetVerticalAlignment(EVerticalAlignment.VAlign_Center) TargetUniformGridSlot:SetHorizontalAlignment(EHorizontalAlignment.HAlign_Center) -- 设置索引 TargetUniformGridSlot:SetColumn(Index % self.ItemsCol) TargetUniformGridSlot:SetRow(math.floor(Index / self.ItemsCol)) -- 初始化 ItemInst:Init(MiniGameType, self.ItemSelectMiniGame, self) ItemInst:UpdateStarCount(PlayerStarCount[MiniGameType]) Index = Index + 1 end end function WB_SelectMiniGame:UpdatePlayerHead() local OnlinePlayerKeys = UGCGameSystem.GameState:GetPlayerPersonalKeys() --table.sort(OnlinePlayerKeys, function(a, b) return a > b end) --for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do -- local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1) -- Item:InitPlayerReady(OnlinePlayerKeys[i]) --end if OnlinePlayerKeys then local NullPlayerKeyItem = {} for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1) Item:ResetIsReady() local PlayerKey = Item:GetPlayerKey() if PlayerKey == nil or not table.hasValue(OnlinePlayerKeys, PlayerKey) then NullPlayerKeyItem[#NullPlayerKeyItem + 1] = Item Item:InitPlayerReady(nil) else table.removeValue(OnlinePlayerKeys, PlayerKey) end end for i, v in pairs(OnlinePlayerKeys) do if NullPlayerKeyItem[i] then NullPlayerKeyItem[i]:InitPlayerReady(v) end end self:UpdateStarCount() end end function WB_SelectMiniGame:ItemSelectMiniGame(InMiniGameType) SoundSystem.PlaySound(SoundSystem.ESound.Click) local MiniGameInfo = MiniGameConfig.MiniGameInfo[InMiniGameType] if MiniGameInfo then self.SelectGameType = InMiniGameType self.TextBlock_Desc:SetText(MiniGameInfo.DescText) for i = 1, self.UniformGridPanel_Items:GetChildrenCount() do local Item = self.UniformGridPanel_Items:GetChildAt(i - 1) Item:SelectType(InMiniGameType) end end end function WB_SelectMiniGame:ClickSelect() if self.bCanClickSelect then self.bCanClickSelect = false UGCEventSystem.SetTimer(self, function() self.bCanClickSelect = true end, 0.5) if not self.IsSelected then if table.hasValue(self.SelectedMaps, self.SelectGameType) then UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.MiniGameIsSelected) else UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "PlayerSelectMiniGame", self.SelectGameType, UGCSystemLibrary.GetLocalPlayerKey()) end end end end function WB_SelectMiniGame:SelectMiniGameCallBack(IsSucceed, InMiniGameType, InPlayerKey) if IsSucceed then self.SelectedMaps[#self.SelectedMaps + 1] = InMiniGameType if InPlayerKey == UGCSystemLibrary.GetLocalPlayerKey() then self.IsSelected = true self.WidgetSwitcher_IsSelected:SetActiveWidgetIndex(1) UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.SelectedMiniGameSucceed) end else SoundSystem.PlaySound(SoundSystem.ESound.Click) UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.MiniGameIsSelected) end end function WB_SelectMiniGame:UpdateStarCount() for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1) local PlayerKey = Item:GetPlayerKey() Item:UpdateStarCount(UGCGameSystem.GameState:GetPlayerStar(PlayerKey)) end local PlayerStarCount = ArchiveDataConfig.GetPlayerArchiveDataFromType(UGCSystemLibrary.GetLocalPlayerKey(), ArchiveDataConfig.EArchiveType.MapStar) UGCLogSystem.LogTree("[WB_SelectMiniGame_UpdateStarCount] PlayerStarCount:", PlayerStarCount) if PlayerStarCount == nil then PlayerStarCount = {} end for i = 1, self.UniformGridPanel_Items:GetChildrenCount() do local Item = self.UniformGridPanel_Items:GetChildAt(i - 1) local MiniGameType = Item:GetMiniGameType() Item:UpdateStarCount(PlayerStarCount[MiniGameType]) end end -- function WB_SelectMiniGame:Tick(MyGeometry, InDeltaTime) -- end -- function WB_SelectMiniGame:Destruct() -- end return WB_SelectMiniGame;