local type = type local CONDITION_COLOR = { [true] = CS.UnityEngine.Color.black, [false] = CS.UnityEngine.Color.red, } --=============== --XRewardType <=> 道具数据类型 --=============== local RewardTypeToTemplateType = { [XArrangeConfigs.Types.Medal] = "Medal", } ---@class XUiGridCommon local XUiGridCommon = XClass(nil, "XUiGridCommon") local XUiPanelNameplate = require("XUi/XUiNameplate/XUiPanelNameplate") ---@param rootUi XLuaUi function XUiGridCommon:Ctor(rootUi, ui) if not ui then ui = rootUi else ---@type XLuaUi self.RootUi = rootUi end self.GameObject = ui.gameObject self.Transform = ui.transform self:InitAutoScript() self.TextCount = XUiHelper.TryGetComponent(self.Transform, "TextCount", nil) self.ProxyClickFunc = nil end function XUiGridCommon:Init(rootUi) self.RootUi = rootUi end function XUiGridCommon:SetProxyClickFunc(value) self.ProxyClickFunc = value end -- auto -- Automatic generation of code, forbid to edit function XUiGridCommon:InitAutoScript() self:AutoInitUi() XTool.InitUiObject(self) self.SpecialSoundMap = {} self:AutoAddListener() end function XUiGridCommon:AutoInitUi() self.TxtCount = XUiHelper.TryGetComponent(self.Transform, "TxtCount", "Text") if not self.TxtCount then self.TxtCount = XUiHelper.TryGetComponent(self.Transform, "PanelTxt/TxtCount", "Text") end -- 兼容不同grid结构 if not self.TxtCount then self.TxtCount = XUiHelper.TryGetComponent(self.Transform, "ImgCountBg/TxtCount", "Text") end -- 兼容不同grid结构 self.TxtName = XUiHelper.TryGetComponent(self.Transform, "TxtName", "Text") self.TxtHave = XUiHelper.TryGetComponent(self.Transform, "TxtHave", "Text") if not self.TxtHave then self.TxtHave = XUiHelper.TryGetComponent(self.Transform, "PanelTxt/TxtHave", "Text") end -- 兼容不同grid结构 self.Bg = XUiHelper.TryGetComponent(self.Transform, "Bg", "Image") self.ImgNew = XUiHelper.TryGetComponent(self.Transform, "ImgNew", "Image") self.RImgIcon = XUiHelper.TryGetComponent(self.Transform, "RImgIcon", "RawImage") self.HeadIconEffect = XUiHelper.TryGetComponent(self.Transform, "RImgIcon/Effect", "XUiEffectLayer") self.ImgQuality = XUiHelper.TryGetComponent(self.Transform, "ImgQuality", "Image") self.PanelFirst = XUiHelper.TryGetComponent(self.Transform, "PanelFirst", "Image") self.PanelSite = XUiHelper.TryGetComponent(self.Transform, "PanelSite", nil) self.TxtSite = XUiHelper.TryGetComponent(self.Transform, "PanelSite/TxtSite", "Text") self.BtnClick = XUiHelper.TryGetComponent(self.Transform, "BtnClick", "Button") self.ImgUp = XUiHelper.TryGetComponent(self.Transform, "ImgUp", "Image") self.ImgRail = XUiHelper.TryGetComponent(self.Transform, "ImgRail", "Image") self.ImgReceived = XUiHelper.TryGetComponent(self.Transform, "ImgReceived", nil) self.ImgQualityTag = XUiHelper.TryGetComponent(self.Transform, "ImgQualityTag", "Image") self.TxtStock = XUiHelper.TryGetComponent(self.Transform, "TxtStock", "Text") self.ImgNone = XUiHelper.TryGetComponent(self.Transform, "ImgNone", nil) -- 特殊标记 self.PanelTag = XUiHelper.TryGetComponent(self.Transform, "PanelTag") end function XUiGridCommon:AutoAddListener() XUiHelper.RegisterClickEvent(self, self.BtnClick, self.OnBtnClickClick) end function XUiGridCommon:SetBtnNotClick(statue) self.BtnNotClick = statue end -- auto function XUiGridCommon:OnBtnClickClick() if self.Disable or self.BtnNotClick then return end -- 匹配中 if XDataCenter.FubenUnionKillRoomManager.IsMatching() then return end if self.ProxyClickFunc then self.ProxyClickFunc() return end if self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Character then --从Tips的ui跳转需要关闭Tips的UI if self.RootUi and self.RootUi.Ui.UiData.UiType == CsXUiType.Tips then self.RootUi:Close() end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() XLuaUiManager.Open("UiCharacterDetail", self.TemplateId) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Equip then XMVCA:GetAgency(ModuleId.XEquip):OpenUiEquipPreview(self.TemplateId) --从Tips的ui跳转需要关闭Tips的UI if self.RootUi and self.RootUi.Ui.UiData.UiType == CsXUiType.Tips then self.RootUi:Close() end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Furniture then local cfg = XFurnitureConfigs.GetFurnitureReward(self.TemplateId) local furnitureRewardId = self.TemplateId local configId = cfg.FurnitureId if self.Data then XLuaUiManager.Open("UiFurnitureDetail", self.Data.InstanceId, configId, furnitureRewardId, nil, true) else XLuaUiManager.Open("UiFurnitureDetail", nil, configId, furnitureRewardId, nil, true) end elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Fashion then local buyData if self.Data and self.Data.ItemCount and self.Data.ItemIcon and self.Data.BuyCallBack then buyData = {} local isHave, isLimitTime = XRewardManager.CheckRewardOwn(self.GoodsShowParams.RewardType, self.GoodsShowParams.TemplateId) buyData.IsHave = isHave and not isLimitTime buyData.ItemIcon = self.Data.ItemIcon buyData.ItemCount = self.Data.ItemCount buyData.GiftRewardId = self.Data.GiftRewardId buyData.BuyCallBack = self.Data.BuyCallBack end XLuaUiManager.Open("UiFashionDetail", self.TemplateId, false, buyData) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Partner then --从Tips的ui跳转需要关闭Tips的UI if self.RootUi and self.RootUi.Ui.UiData.UiType == CsXUiType.Tips then self.RootUi:Close() end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() local partnerData = { Id = 0, TemplateId = self.TemplateId } local partner = XDataCenter.PartnerManager.CreatePartnerEntityByPartnerData(partnerData, true) XLuaUiManager.Open("UiPartnerPreview", partner) elseif XDataCenter.ItemManager.IsWeaponFashion(self.TemplateId) then local weaponFashionId = XDataCenter.ItemManager.GetWeaponFashionId(self.TemplateId) XLuaUiManager.Open("UiFashionDetail", weaponFashionId, true) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Nameplate then XLuaUiManager.Open("UiNameplateTip", self.TemplateId, true, true, true) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Medal then XLuaUiManager.Open("UiMeadalDetail", self.GoodsShowParams.Config, XDataCenter.MedalManager.Preview) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Background then -- v1.29 场景预览 XLuaUiManager.Open("UiSceneTip", self.TemplateId) elseif self.GoodsShowParams.RewardType == XRewardManager.XRewardType.DlcHuntChip then -- DLC local itemId = self.TemplateId if XDlcHuntChipConfigs.IsExist(itemId) then local XDlcHuntChip = require("XEntity/XDlcHunt/XDlcHuntChip") ---@type XDlcHuntChip local virtualChip = XDlcHuntChip.New() virtualChip:SetData({ Id = -1, TemplateId = itemId, Level = 1, Exp = 0, Breakthrough = 0, IsLock = false, CreateTime = 0 }) XLuaUiManager.Open("UiDlcHuntChipDetails", virtualChip) else XLuaUiManager.Open("UiDlcHuntTip", self.Data and self.Data or self.TemplateId, self.HideSkipBtn, self.RootUi and self.RootUi.Name, self.LackNum) end else XLuaUiManager.Open("UiTip", self.Data and self.Data or self.TemplateId, self.HideSkipBtn, self.RootUi and self.RootUi.Name, self.LackNum) end end function XUiGridCommon:SetUiActive(ui, active) if not ui or not ui.gameObject then return end if ui.gameObject.activeSelf == active then return end ui.gameObject:SetActiveEx(active) end function XUiGridCommon:ResetUi() self:SetUiActive(self.TxtCount, false) self:SetUiActive(self.TxtName, false) self:SetUiActive(self.ImgNew, false) self:SetUiActive(self.RImgIcon, false) self:SetUiActive(self.ImgQuality, false) self:SetUiActive(self.PanelSite, false) self:SetUiActive(self.ImgUp, false) self:SetUiActive(self.ImgRail, false) self:SetUiActive(self.ImgReceived, false) self:SetUiActive(self.ImgQualityTag, false) self:SetUiActive(self.IconLevel, false) self:SetUiActive(self.TxtHave, false) self:SetUiActive(self.TxtStock, false) self:SetUiActive(self.ImgNone, false) end -- data支持数据结构: XEquipData XItemData XCharacterData -- tags可包含: { ShowUp, ShowNew } function XUiGridCommon:Refresh(data, params, isBigIcon, hideSkipBtn, curCount) if XTool.UObjIsNil(self.GameObject) then return end self.GameObject:SetActiveEx(data ~= nil) if not data then return end self:ResetUi() self.HideSkipBtn = hideSkipBtn local count, costCount if type(data) == "number" then self.TemplateId = data else self.Data = data self.TemplateId = (data.TemplateId and data.TemplateId > 0) and data.TemplateId or data.Id count = data.Count costCount = data.CostCount end self.GoodsShowParams = self:GetGoodsShowParams() if not self.GoodsShowParams then XLog.Error("获取道具数据有误,Data :", data) return end params = params or {} -- 名字 if self.TxtName and self.GoodsShowParams.Name then if self.GoodsShowParams.RewardType == XArrangeConfigs.Types.Character then self.TxtName.text = self.GoodsShowParams.TradeName else self.TxtName.text = self.GoodsShowParams.Name end self:SetUiActive(self.TxtName, true) end -- 数量 if self.TxtCount and count then self.TxtCount.text = CS.XTextManager.GetText("ShopGridCommonCount", count) self:SetUiActive(self.TxtCount, true) end -- 可消耗数量 if self.TxtHaveCount and count and self.TxtNeedCount and costCount then self.TxtHaveCount.text = count self.TxtNeedCount.text = "/" .. costCount self.TxtHaveCount.color = CONDITION_COLOR[count >= costCount] self.LackNum = costCount - count --记录缺少数量 self:SetUiActive(self.TxtHaveCount, true) self:SetUiActive(self.TxtNeedCount, true) end -- 图标 if self.RImgIcon then local icon = self.GoodsShowParams.Icon if isBigIcon and self.GoodsShowParams.BigIcon then icon = self.GoodsShowParams.BigIcon end if icon and #icon > 0 and self.GoodsShowParams.RewardType ~= XRewardManager.XRewardType.Nameplate then --self.RootUi:SetUiSprite(self.RImgIcon, icon) self.RImgIcon:SetRawImage(icon) self:SetUiActive(self.RImgIcon, true) end end -- 特效 if self.HeadIconEffect then local effect = self.GoodsShowParams.Effect if effect then self.HeadIconEffect.gameObject:LoadPrefab(effect) self.HeadIconEffect.gameObject:SetActiveEx(true) else self.HeadIconEffect.gameObject:SetActiveEx(false) end end -- 品质底图 if self.ImgQuality and self.GoodsShowParams.Quality then local qualityIcon = self.GoodsShowParams.QualityIcon if self.RootUi and qualityIcon then self.RootUi:SetUiSprite(self.ImgQuality, qualityIcon) else XUiHelper.SetQualityIcon(self.RootUi, self.ImgQuality, self.SyncQuality or self.GoodsShowParams.Quality) end self:SetUiActive(self.ImgQuality, true) end -- 品质底图(大) if self.ImgIconQuality and self.GoodsShowParams.Quality then XUiHelper.SetQualityIcon(self.RootUi, self.ImgIconQuality, self.SyncQuality or self.GoodsShowParams.Quality) self:SetUiActive(self.ImgQuality, true) end -- 创世纪标签 if self.ImgQualityTag and self.GoodsShowParams.QualityTag then self:SetUiActive(self.ImgQualityTag, true) end if self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Equip then -- 星数 if self.PanelStars then self:ShowStar(self.GoodsShowParams.Star, self.GoodsShowParams.Star) end -- if self.PanelSite then self:SetUiActive(self.PanelSite, self.GoodsShowParams.Site ~= XEquipConfig.EquipSite.Weapon) self.TxtSite.text = "0" .. self.GoodsShowParams.Site end end --铭牌 self:RefreshNameplate() -- 特殊 : Params -- Params.ShowUp if self.ImgUp then self:SetUiActive(self.ImgUp, params.ShowUp) end -- Params.ShowNew if self.ImgNew then self:SetUiActive(self.ImgNew, params.ShowNew) end -- Params.ShowReceived 已领取 if self.ImgReceived then self:SetUiActive(self.ImgReceived, params.ShowReceived) end -- Params.Disable 不可点击 self.Disable = params.Disable --特殊抽奖中奖品的剩余数 if self.TxtStock then if curCount then self.TxtStock.text = CS.XTextManager.GetText("ResidueStockText", curCount) self:SetUiActive(self.TxtStock, true) end self:SetUiActive(self.TxtName, false) end --特殊抽奖中是否有库存的提示 if self.ImgNone then self:SetUiActive(self.ImgNone, curCount and curCount <= 0) end --收藏品等级 if self.IconLevel and self.GoodsShowParams.LevelIcon then local levelIcon = self.SyncLevelIcon or self.GoodsShowParams.LevelIcon if levelIcon then self.RootUi:SetUiSprite(self.IconLevel, levelIcon) self:SetUiActive(self.IconLevel, true) end end --是否已拥有 if self.TxtHave then local isHave, isLimitTime = XRewardManager.CheckRewardOwn(self.GoodsShowParams.RewardType, self.GoodsShowParams.TemplateId) local isShowTextHave = isHave and not isLimitTime self:SetUiActive(self.TxtHave, isShowTextHave) self:SetUiActive(self.TxtCount, not isShowTextHave) end --清除临时的同步数据 self:ClearSynData() end function XUiGridCommon:ShowCount(show) if (self.TxtCount) then self.TxtCount.gameObject:SetActiveEx(show) end if self.TextCount then self.TextCount.gameObject:SetActiveEx(show) end end function XUiGridCommon:ShowStar(count, max) local showStar = max > 0 self.PanelStars.gameObject:SetActiveEx(showStar) if not showStar then return end for i = 1, 6 do local starPanel = self["PanelStar" .. i] if starPanel then starPanel.gameObject:SetActiveEx(i <= max) end local imgStar = self["ImgStar" .. i] if imgStar then imgStar.gameObject:SetActiveEx(i <= count) end end end function XUiGridCommon:SetReceived(isReceive) if self.ImgReceived then self:SetUiActive(self.ImgReceived, isReceive) end end function XUiGridCommon:SetPanelFirst(isFirst) if self.PanelFirst then self.PanelFirst.gameObject:SetActiveEx(isFirst) end end function XUiGridCommon:SetShowUp(isShow) if self.ImgUp then self:SetUiActive(self.ImgUp, isShow) end end function XUiGridCommon:SetUpText(text) if self.UpText then self.UpText.text = text end end function XUiGridCommon:SetUpImg(img) if self.ImgUp then self.ImgUp:SetRawImage(img) end end function XUiGridCommon:SetPanelTag(isTag) if self.PanelTag then self.PanelTag.gameObject:SetActiveEx(isTag) end end function XUiGridCommon:SetClickCallback(callback) XUiHelper.RegisterClickEvent(self, self.BtnClick, callback, true) end function XUiGridCommon:SetSyncQuality(quality) self.SyncQuality = quality end function XUiGridCommon:SetSyncLevelIcon(levelIcon) self.SyncLevelIcon = levelIcon end function XUiGridCommon:ClearSynData() self.SyncQuality = nil self.SyncLevelIcon = nil end function XUiGridCommon:GetQuality() return self.GoodsShowParams.Quality end function XUiGridCommon:SetName(value) if not self.TxtName then return end self.TxtName.text = value end function XUiGridCommon:SetNeedCount(value) if self.TxtNeedCount then self.TxtNeedCount.text = value end end function XUiGridCommon:SetCount(value) if self.TxtCount then self.TxtCount.text = value self:SetUiActive(self.TxtCount, true) end end --============ --获取物品显示数据 --============ function XUiGridCommon:GetGoodsShowParams() if not self.TemplateId then XLog.Error("错误日志:显示的道具数据TemplateId为空!") return end local templateType = self.Data and self.Data.RewardType and RewardTypeToTemplateType[self.Data.RewardType] or "Default" return self["Get" .. templateType .. "GoodsShowParams"](self) end --============= --获取一般道具显示数据(默认项) --============= function XUiGridCommon:GetDefaultGoodsShowParams() return XGoodsCommonManager.GetGoodsShowParamsByTemplateId(self.TemplateId) end --============= --获取勋章显示数据 --============= function XUiGridCommon:GetMedalGoodsShowParams() --勋章的物品数据中,用TemplateId代替了表中的Params[0],即勋章Id local medal = XDataCenter.MedalManager.GetMedalById(self.Data.TemplateId) if not medal then return end local goodsShowParams = { Name = medal.Name, Icon = medal.MedalImg, Config = medal, RewardType = XRewardManager.XRewardType.Medal } return goodsShowParams end function XUiGridCommon:RefreshNameplate() if self.GoodsShowParams.RewardType == XRewardManager.XRewardType.Nameplate then self:SetUiActive(self.ImgQuality, false) self:SetUiActive(self.RImgIcon, false) local BtnSiblingIndex = 0 if self.BtnClick then BtnSiblingIndex = self.BtnClick.transform:GetSiblingIndex() end if not self.PanelNamePlate then local prefab = self.GameObject:LoadPrefab(XMedalConfigs.XNameplatePanelPath) prefab.transform:SetSiblingIndex(BtnSiblingIndex) local rectTransform = prefab.transform:GetComponent("RectTransform") if rectTransform then local vX = 0 local vY = 15 local scale = CS.UnityEngine.Vector3(0.6, 0.6, 0.6) if self.Bg then local tmpTrans = self.Bg:GetComponent("RectTransform") local vect = tmpTrans.anchoredPosition rectTransform.anchorMin = tmpTrans.anchorMin rectTransform.anchorMax = tmpTrans.anchorMax vX = vect.x vY = vect.y local bgX= self.Bg:GetComponent("RectTransform").sizeDelta.x local bgScale = self.Bg.transform.localScale.x local realBgWidth = bgX * bgScale local tempX = rectTransform.sizeDelta.x local scaleNum = 0.9 * realBgWidth/tempX scale = CS.UnityEngine.Vector3(scaleNum, scaleNum, scaleNum) -- 铭牌大小为标准背景宽高的90%防止超出格子 end rectTransform.anchoredPosition = CS.UnityEngine.Vector2(vX, vY) rectTransform.localScale = scale end self.PanelNamePlate = XUiPanelNameplate.New(prefab, self.RootUi) end self.PanelNamePlate.GameObject:SetActiveEx(true) self.PanelNamePlate:UpdateDataById(self.TemplateId) else if self.PanelNamePlate then self.PanelNamePlate.GameObject:SetActiveEx(false) else local prefab = self.GameObject:LoadPrefab(XMedalConfigs.XNameplatePanelPath) prefab.gameObject:SetActiveEx(false) end end end return XUiGridCommon