---@class WB_CustomWeapon_C:UUserWidget ---@field HorizontalBox_WeaponType UHorizontalBox ---@field NewButton_Cancel UNewButton ---@field NewButton_Close UNewButton ---@field NewButton_Select UNewButton ---@field UniformGridPanel_SelectWeapon UUniformGridPanel ---@field VerticalBox_WeaponSocket UVerticalBox --Edit Below-- ---@type WB_CustomWeapon_C local WB_CustomWeapon = { bInitDoOnce = false; WeaponComb = {}; -- {WeaponID1, WeaponID2 SelectSaveWeaponItemCol = 5; WeaponSocketItems = {}; IsChange = false; } function WB_CustomWeapon:Construct() self:LuaInit() end function WB_CustomWeapon:LuaInit() if self.bInitDoOnce then return ; end self.bInitDoOnce = true; UGCLogSystem.Log("[WB_CustomWeapon_LuaInit]") -- 按键初始化 UITool.BindButtonClicked(self.NewButton_Cancel, self.CloseSelf, self) UITool.BindButtonClicked(self.NewButton_Select, self.ClickSelectWeapon, self) --UITool.BindButtonClicked(self.NewButton_Close, self.ClickClose, self) -- 初始化Item self:InitItem() UGCLogSystem.Log("[WB_CustomWeapon_LuaInit] Finish") end function WB_CustomWeapon:OnShowPanel() UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel]") -- 设置配置索引 -- self:SetProgrammeIndex(ProgrammeIndex) if GlobalMiniMode ~= nil and GlobalMiniMode.CurrWeaponItem[LocalPlayerKey] then self:SetSelectWeapon(1, GlobalMiniMode.CurrWeaponItem[LocalPlayerKey], true) else -- 从存档中获取 local LastWeapon = 101001 if ArchiveTable[LocalPlayerKey] then LastWeapon = ArchiveTable[LocalPlayerKey].LastWeapon end self:SetSelectWeapon(1, LastWeapon, true) end UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel] Finish") end function WB_CustomWeapon:InitItem() -- 武器类型中最大可选择的的武器数量 local MaxSelectItemCount = 0 -- 武器类型选择的Item在水平框中的对齐方式 local WeaponTypeSlateChildSize = UE.CreateStruct("SlateChildSize"); WeaponTypeSlateChildSize.SizeRule = ESlateSizeRule.Fill for i, v in pairs(PlayerCustomWeapon) do -- 设置一下最大的选择武器Item数量 MaxSelectItemCount = math.max(MaxSelectItemCount, #v.WeaponIDs) -- 加载图片 for _, WeaponID in pairs(v.WeaponIDs) do local WeaponInfo = UGCItemSystem.GetItemData(WeaponID); if WeaponInfo.ItemWhiteIcon_n then -- 加载剪影 UE.AsyncLoadAsset_New(WeaponInfo.ItemWhiteIcon_n, nil, nil, true) -- 加载实际武器大图 UE.AsyncLoadAsset_New(WeaponInfo.ItemBigIcon_n, nil, nil, true) end end -- 初始化武器类型 local WeaponTypeItem = nil if self.HorizontalBox_WeaponType:GetChildrenCount() < i then WeaponTypeItem = UserWidget.NewWidgetObjectBP(LocalPlayerController, self:GetWeaponTypeItemClass()); self.HorizontalBox_WeaponType:AddChild(WeaponTypeItem) -- 设置对齐方式 local TargetHorizontalBoxSlot = WidgetLayoutLibrary.SlotAsHorizontalBoxSlot(WeaponTypeItem) TargetHorizontalBoxSlot:SetSize(WeaponTypeSlateChildSize) else WeaponTypeItem = self.HorizontalBox_WeaponType:GetChildAt(i - 1) end WeaponTypeItem:SetIndex(i) WeaponTypeItem:BindClickSelect(self.SelectWeaponType, self) end -- 初始化武器槽UI for i = 1, self.VerticalBox_WeaponSocket:GetChildrenCount() do local Item = self.VerticalBox_WeaponSocket:GetChildAt(i - 1) self.WeaponSocketItems[i] = Item Item:SetIndex(i) Item:BindClickSelect(self.SelectWeaponSocket, self) end -- 初始化武器选择Item for i = 1, MaxSelectItemCount do local Item = nil; if self.UniformGridPanel_SelectWeapon:GetChildrenCount() < i then Item = UserWidget.NewWidgetObjectBP(LocalPlayerController, self:GetSelectSaveWeaponItemClass()); self.UniformGridPanel_SelectWeapon:AddChild(Item) local TargetUniformGridSlot = WidgetLayoutLibrary.SlotAsUniformGridSlot(Item) -- 居中 TargetUniformGridSlot:SetVerticalAlignment(EVerticalAlignment.VAlign_Center) TargetUniformGridSlot:SetHorizontalAlignment(EHorizontalAlignment.HAlign_Center) -- 设置索引 TargetUniformGridSlot:SetColumn((i - 1) % self.SelectSaveWeaponItemCol) TargetUniformGridSlot:SetRow((i - 1) // self.SelectSaveWeaponItemCol) else Item = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1) Item:SetVisibility(ESlateVisibility.HitTestInvisible) end Item:SetIndex(i) Item:LuaInit(); Item:BindClickSelect(self.ClickSelectSaveWeapon, self) end UGCLogSystem.Log("[WB_CustomWeapon_InitItem] Finish") end function WB_CustomWeapon:GetSelectSaveWeaponItemClass() if self.SelectSaveWeaponClass == nil then self.SelectSaveWeaponClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/SelectWeapons/SaveCustomWeaponItem/WB_SelectSaveWeapon.WB_SelectSaveWeapon_C')) end return self.SelectSaveWeaponClass end function WB_CustomWeapon:GetWeaponTypeItemClass() if self.WeaponTypeItemClass == nil then self.WeaponTypeItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/SelectWeapons/SaveCustomWeaponItem/WB_WeaponType.WB_WeaponType_C')) end return self.WeaponTypeItemClass end --- 点击选择插槽 function WB_CustomWeapon:SelectWeaponSocket(Index) UGCLogSystem.Log("[WB_CustomWeapon:SelectWeaponSocket] 点击 Index = %s", tostring(Index)); if self.SelectWeaponSocketID ~= Index then self.SelectWeaponSocketID = Index local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID] if WeaponSocketItem then self:SetSelectWeapon(self.SelectWeaponSocketID, WeaponSocketItem:GetWeaponID(), true) end end end --- 点击选择武器类型 function WB_CustomWeapon:SelectWeaponType(Index) if self.WeaponTypeIndex ~= Index then self.WeaponTypeIndex = Index for i = 1, self.HorizontalBox_WeaponType:GetChildrenCount() do local WeaponTypeItem = self.HorizontalBox_WeaponType:GetChildAt(i - 1) WeaponTypeItem:SetSelect(i == self.WeaponTypeIndex) end local CustomWeaponInfo = PlayerCustomWeapon[self.WeaponTypeIndex] local SocketWeaponID = -1 local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID] if WeaponSocketItem then SocketWeaponID = WeaponSocketItem:GetWeaponID() end if CustomWeaponInfo then for i = 1, self.UniformGridPanel_SelectWeapon:GetChildrenCount() do local WeaponID = CustomWeaponInfo.WeaponIDs[i] local WeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1) if WeaponID then WeaponItem:SetWeaponID(WeaponID) WeaponItem:SetSelect(SocketWeaponID == WeaponID) WeaponItem:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else WeaponItem:SetVisibility(ESlateVisibility.Collapsed) end end end end end --- 点击选择武器 function WB_CustomWeapon:ClickSelectSaveWeapon(Index) UGCLogSystem.Log("[WB_CustomWeapon:ClickSelectSaveWeapon] 执行 Index = %s", tostring(Index)) self.IsChange = true self:SelectSaveWeapon(Index) end function WB_CustomWeapon:SelectSaveWeapon(Index) local WeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(Index - 1) if WeaponItem then local WeaponID = WeaponItem:GetWeaponID() for i = 1, self.UniformGridPanel_SelectWeapon:GetChildrenCount() do local TempWeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1) TempWeaponItem:SetSelect(Index == i) end self:SetSelectWeapon(self.SelectWeaponSocketID, WeaponID, false) end end function WB_CustomWeapon:SelectSaveWeaponByItemID(ItemID) for i = 1, UITool.GetChildrenCount(self.UniformGridPanel_SelectWeapon) do local Item = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1); if Item then if Item:GetWeaponID() == ItemID then Item:SetSelect(true); else Item:SetSelect(false); end end end self:SetSelectWeapon(self.SelectWeaponSocketID, ItemID, false) end --- 设置插槽内的武器 ---@param SocketID uint 插槽的索引 只有1和2 ---@param bUpdateSelectWeaponBar bool 是否更新武器选择栏 function WB_CustomWeapon:SetSelectWeapon(SocketID, WeaponID, bUpdateSelectWeaponBar) if bUpdateSelectWeaponBar then self.SelectWeaponSocketID = SocketID for i, v in pairs(self.WeaponSocketItems) do v:SetSelect(i == SocketID) end -- 获取武器ID类型和索引 local CustomWeaponTypeIndex = -1 local CustomWeaponIndex = -1; for WeaponTypeIndex, v in pairs(PlayerCustomWeapon) do -- 加载图片 for WeaponIndex, TempWeaponID in pairs(v.WeaponIDs) do if TempWeaponID == WeaponID then CustomWeaponIndex = WeaponIndex CustomWeaponTypeIndex = WeaponTypeIndex end end if CustomWeaponTypeIndex > 0 then break end end -- 更新选择栏 self:SelectWeaponType(CustomWeaponTypeIndex) self:SelectSaveWeapon(CustomWeaponIndex) else local SocketItem = self.WeaponSocketItems[SocketID] if SocketItem then SocketItem:SetWeaponID(WeaponID) end end end WB_CustomWeapon.LastSelectWeapon = 0; function WB_CustomWeapon:ClickSelectWeapon() local WeaponID = self.WeaponSocketItems[1]:GetWeaponID() if self.LastSelectWeapon ~= WeaponID then GameState:SendMiniGameRPC("PlayerSelectWeapon", LocalPlayerKey, WeaponID); end -- 关闭UI self:CloseSelf() end function WB_CustomWeapon:CloseSelf() WidgetManager:ClosePanel(self.UIType) self.IsChange = false end -- function WB_CustomWeapon:Tick(MyGeometry, InDeltaTime) -- end -- function WB_CustomWeapon:Destruct() -- end return WB_CustomWeapon