------------------------------------------------ --作者: 何健 --日期: 2019-04-28 --文件: UIItem.lua --模块: UIItem --描述: 物品格子公用组件 ------------------------------------------------ local UIItem ={ RootTrans = nil, RootGO = nil, gameObject = nil, --品质框图片 QualitySpr = nil, --绑定图片 BindSpr = nil, -- 帧动画 EffectAniGO = nil, EffectScript = nil, Effect2AniGO = nil, Effect2Script = nil, -- 装备物效 EffectGO = nil, -- 不可使用 UnUseGo = nil, -- 数量 NumLabel = nil, -- 装备阶数 LevelLabel = nil, -- 装备星级 StarGrid = nil, -- 向上箭头,表示该装备比身上装备评分更高 UpTransGo = nil, -- icon图标 Icon = nil, IconSpr = nil, --格子锁定图标 LockGo = nil, --加号图标,在一些地方表示点击添加材料 AddSprGo = nil, --选中图片 SelectGo = nil, Btn = nil, Location = ItemTipsLocation.Defult, IsBindBagNum = false, IsRegisterBagMsg = false, ShowNum = 0, IsShowTips = false, IsShowAddSpr = false, IsShowGet = false, ShowItemData = nil, ExtData = nil, SingleClick = nil, --是否是单个数字 IsSingleNum = false, } local L_ItemMap = {} function UIItem:New(res) local _tmp = L_ItemMap[res] if _tmp ~= nil then _tmp:CanelBindBagNum() return _tmp end local _M = Utils.DeepCopy(self) _M.RootTrans = res _M.RootGO = res.gameObject _M.gameObject = _M.RootGO local trans = UIUtils.FindTrans(_M.RootTrans, "Quality") if trans ~= nil then _M.QualitySpr = UIUtils.FindSpr(_M.RootTrans, "Quality") end _M.Icon = UIUtils.RequireUIIconBase(UIUtils.FindTrans(_M.RootTrans, "Icon")) _M.IconSpr = UIUtils.FindSpr(_M.RootTrans, "Icon") trans = UIUtils.FindTrans(_M.RootTrans, "Bind") if(trans ~= nil) then _M.BindSpr = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "Effect") if(trans ~= nil) then _M.EffectGO = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Effect1") if(trans ~= nil) then _M.EffectAniGO = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Effect2") if(trans ~= nil) then _M.Effect2AniGO = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "XJbg") if(trans ~= nil) then _M.XJbgGo = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Num") if(trans ~= nil) then _M.NumLabel = UIUtils.FindLabel(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "NameLabel") if(trans ~= nil) then _M.NameLabel = UIUtils.FindLabel(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "Level") if(trans ~= nil) then _M.LevelLabel = UIUtils.FindLabel(trans) if _M.LevelLabel ~= nil then _M.LevelLabel.gameObject:SetActive(true) end end trans = UIUtils.FindTrans(_M.RootTrans, "Lock") if(trans ~= nil) then _M.LockGo = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Add") if(trans ~= nil) then _M.AddSprGo = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Select") if(trans ~= nil) then _M.SelectGo = trans.gameObject end trans = UIUtils.FindTrans(_M.RootTrans, "Grid") if(trans ~= nil) then _M.StarGrid = UIUtils.FindGrid(trans) _M.StarGridGo = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "up") if(trans ~= nil) then _M.UpTransGo = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "LvBg") if(trans ~= nil) then _M.LvBgGo = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "StarNum") if(trans ~= nil) then _M.StarNumLabel = UIUtils.FindLabel(trans) _M.StarNumGo = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "Title") if(trans ~= nil) then _M.TitleLabel = UIUtils.FindLabel(trans, "Label") _M.TitleGo = UIUtils.FindGo(trans) end trans = UIUtils.FindTrans(_M.RootTrans, "UnUseSprite") if(trans ~= nil) then _M.UnUseGo = UIUtils.FindGo(trans) end _M.Location = ItemTipsLocation.Defult _M.Btn = UIUtils.FindBtn(_M.RootTrans) UIUtils.AddBtnEvent(_M.Btn, _M.OnBtnItemClick, _M) _M.IsShowTips = true LuaBehaviourManager:Add(_M.RootTrans, _M) L_ItemMap[res] = _M; return _M end --克隆一个对象 function UIItem:Clone() local _trans = UnityUtils.Clone(self.RootGO) return UIItem:New(_trans.transform) end function UIItem:InitWithItemData(itemInfo, num, mastShowNum, isShowGetBtn, location, extData) -- Debug.Log("yy InitWithItemData") self.ShowItemData = itemInfo self.IsEnough = false local _unUseGoActive = false local _upTransGoActive = false local _addSprGoActive = false local _xjbgGoActive = false local _clearLevelLabel = true local _showLvBg = false if(isShowGetBtn ~= nil) then self.IsShowGet = isShowGetBtn end if location ~= nil then self.Location = location end self.ExtData = extData if num == nil and itemInfo ~= nil then num = itemInfo.Count end if self.ShowItemData ~= nil and self.ShowItemData:IsValid() == true then -- Debug.Log("yy InitWithItemData 111") local _itemType = self.ShowItemData.Type if _itemType == ItemType.ImmortalEquip then _xjbgGoActive = true end if _itemType == ItemType.Equip or _itemType == ItemType.HolyEquip or _itemType == ItemType.UnrealEquip or _itemType == ItemType.ImmortalEquip or _itemType == ItemType.SoulPearl then local lp = GameCenter.GameSceneSystem:GetLocalPlayer() if lp ~= nil then if (self.ShowItemData:CheackOcc(lp.IntOcc)) and self.UpTransGo ~= nil then _upTransGoActive = self.ShowItemData:CheckBetterThanDress() end if self.UnUseGo ~= nil then _unUseGoActive = not self.ShowItemData:CheackOcc(lp.IntOcc) end end if self.LevelLabel ~= nil and _itemType ~= ItemType.ImmortalEquip and _itemType ~= ItemType.SoulPearl then _clearLevelLabel = false UIUtils.SetTextByEnum(self.LevelLabel, "LEVEL_FOR_JIE", self.ShowItemData.Grade) _showLvBg = true end end if _itemType == ItemType.MonsterSoulEquip then if self.UpTransGo then _upTransGoActive = GameCenter.MonsterSoulSystem:CheckBetterThanDress(self.ShowItemData, self.ExtData) end if self.LevelLabel ~= nil then if self.ShowItemData.StrengthLevel > 0 then _clearLevelLabel = false UIUtils.SetTextFormat(self.LevelLabel, "+{0}", self.ShowItemData.StrengthLevel) _showLvBg = true else _clearLevelLabel = true end end end if _itemType == ItemType.PetEquip and location and location == ItemTipsLocation.Equip and extData and type(extData) == "number" then if self.LevelLabel ~= nil then local _lv = GameCenter.PetEquipSystem:GetPetEquipSoulLv(extData, self.ShowItemData.Part) UIUtils.SetTextByEnum(self.LevelLabel, "LEVEL_FOR_JIE", _lv) _showLvBg = true _clearLevelLabel = false end end if self.ShowItemData.Type == ItemType.HorseEquip then if self.LevelLabel ~= nil then _clearLevelLabel = false UIUtils.SetTextByEnum(self.LevelLabel, "LEVEL_FOR_JIE", self.ShowItemData.Grade) _showLvBg = true end end -- Debug.Log("yy self.ShowItemData.Icon "..tostring(self.ShowItemData.Icon)) self.Icon:UpdateIcon(self.ShowItemData.Icon) if self.QualitySpr ~= nil then self.QualitySpr.spriteName = Utils.GetQualitySpriteName(self.ShowItemData.Quality) end if _itemType == ItemType.LingPo then --灵魄取灵魄配置表数据 local _immCfg = DataConfig.DataImmortalSoulAttribute[self.ShowItemData.CfgID] if _immCfg ~= nil then self:OnSetStarSpr(_immCfg.Star) else self:OnSetStarSpr(0) end else self:OnSetStarSpr(self.ShowItemData.StarNum) end self:OnSetEffect(self.ShowItemData.Effect) if self.NumLabel ~= nil then if num > 1 or mastShowNum then _showLvBg = true UIUtils.SetTextByNumber(self.NumLabel, num, true, 4) else UIUtils.ClearText(self.NumLabel) end end if self.NameLabel then UIUtils.SetTextByString(self.NameLabel, self.ShowItemData.Name) end if self.BindSpr ~= nil then self.BindSpr:SetActive(self.ShowItemData.IsBind) end if self.QualitySpr ~= nil then self.QualitySpr.gameObject:SetActive(true) end self.ShowNum = num else Debug.Log("yy InitWithItemData 222") self.Icon:UpdateIcon(-1) if self.BindSpr ~= nil then self.BindSpr:SetActive(false) end if self.QualitySpr ~= nil then self.QualitySpr.gameObject:SetActive(false) end if self.NumLabel ~= nil then UIUtils.ClearText(self.NumLabel) end if num and num == -1 then _clearLevelLabel = true end self.ShowNum = 0 if self.IsShowAddSpr and self.AddSprGo then _addSprGoActive = true if self.LockGo ~= nil and self.LockGo.activeSelf then _addSprGoActive = false end end if self.NameLabel then UIUtils.ClearText(self.NameLabel) end self:OnSetStarSpr(0) self:OnSetEffect(-1) end if self.LvBgGo then self.LvBgGo:SetActive(_showLvBg) end if self.UnUseGo ~= nil then self.UnUseGo:SetActive(_unUseGoActive) end if self.UpTransGo ~= nil then self.UpTransGo:SetActive(_upTransGoActive) end if self.AddSprGo then self.AddSprGo:SetActive(_addSprGoActive) end if self.XJbgGo then self.XJbgGo:SetActive(_xjbgGoActive) end if _clearLevelLabel and self.LevelLabel ~= nil then UIUtils.ClearText(self.LevelLabel) end end function UIItem:InItWithCfgid(itemID, num, isBind, isShowGetBtn, mastShowNum) itemID = tonumber(itemID); num = tonumber(num); local item = LuaItemBase.CreateItemBase(itemID) if item ~= nil then item.Count = num item.IsBind = isBind and item.Type ~= 1 --物品类型(1:货币) 策划说货币不区分绑定和非绑定,都按非绑定显示 if item.ItemInfo == nil and itemID ~= 0 then Debug.LogError("未找到配置数据cfgid = %d", itemID) end if itemID == 0 then item = nil end end if not mastShowNum then mastShowNum = false end self:InitWithItemData(item, num, mastShowNum, isShowGetBtn, ItemTipsLocation.Defult) end --设置显隐 function UIItem:SetActive(isActive) self.RootGO:SetActive(isActive) end --设置标签 function UIItem:SetTitle(titleStr) if titleStr and titleStr ~= "" and self.TitleLabel then UIUtils.SetTextByString(self.TitleLabel, titleStr) self.TitleGo:SetActive(true) else self.TitleGo:SetActive(false) end end --设置星星图片 function UIItem:OnSetStarSpr(diaNum) if self.StarGrid == nil then return end local oldCount = self.StarGrid.transform.childCount for i = 0, oldCount - 1 do self.StarGrid.transform:GetChild(i).gameObject:SetActive(false) end if self.StarNumGo then self.StarNumGo:SetActive(diaNum > 5) end if diaNum > 0 and diaNum <= 5 then local childGo = nil for i = 1, diaNum do if i <= oldCount then childGo = self.StarGrid.transform:GetChild(i - 1).gameObject else childGo = UnityUtils.Clone(childGo) end if childGo ~= nil then childGo:SetActive(true) end end elseif diaNum > 5 then UIUtils.SetTextByNumber(self.StarNumLabel, diaNum) end self.StarGrid.repositionNow = true end --设置装备特效 function UIItem:OnSetEffect(effectID) if self.EffectGO ~= nil then self.EffectGO:SetActive(effectID == 1 or effectID == 3) end if self.EffectAniGO ~= nil then self.EffectAniGO:SetActive(effectID == 2 or effectID > 3) if (effectID == 2 or effectID > 3) then if self.EffectScript == nil then --注册脚本 local _animation = UIUtils.RequireUISpriteAnimation(self.EffectAniGO.transform) if(_animation ~= nil) then _animation.namePrefix = "item_" _animation.framesPerSecond = 10 _animation.PrefixSnap = false end self.EffectScript = _animation end if self.EffectScript ~= nil then if effectID == 2 then self.EffectScript.namePrefix = "item_" elseif effectID == 4 then self.EffectScript.namePrefix = "item3_" elseif effectID == 5 then self.EffectScript.namePrefix = "item4_" elseif effectID == 6 then self.EffectScript.namePrefix = "item5_" elseif effectID == 7 then self.EffectScript.namePrefix = "item6_" end end end end if self.Effect2AniGO ~= nil then self.Effect2AniGO:SetActive(effectID == 3) if self.Effect2Script == nil then --注册脚本 local _animation = UIUtils.RequireUISpriteAnimation(self.Effect2AniGO.transform) if(_animation ~= nil) then _animation.namePrefix = "item1_" _animation.framesPerSecond = 10 _animation.PrefixSnap = false end self.Effect2Script = _animation end end end -- 绑定背包中的数量 function UIItem:BindBagNum(isSingleNum) self.IsSingleNum = not(not isSingleNum) self.IsBindBagNum = true self:RegisterMsg() self:UpdateBagNum() end -- 取消绑定背包中的数量 function UIItem:CanelBindBagNum() self.IsBindBagNum = false self:UnRegisterMsg() end -- 设置数量 function UIItem:OnSetNum(sTx) if self.NumLabel ~= nil then UIUtils.SetTextByString(self.NumLabel, sTx) end end function UIItem:OnSetNumColor(r, g, b, a) if not Utils.IsNull(self.NumLabel) then UIUtils.SetColor(self.NumLabel, r, g, b, a) end end --设置格子是否锁定 function UIItem:OnLock(lock) if not Utils.IsNull(self.LockGo) then self.LockGo:SetActive(lock) end end --选中 function UIItem:SelectItem(select) if not Utils.IsNull(self.SelectGo) then self.SelectGo:SetActive(select) end end --设置ICON置灰 function UIItem:SetIsGray(isGray) self.IconSpr.IsGray = isGray self.QualitySpr.IsGray = isGray end -- 按钮事件 function UIItem:OnBtnItemClick() --锁定状态不响应点击 if self.LockGo ~= nil and self.LockGo.activeSelf then return end if self.IsShowTips then if self.ShowItemData ~= nil then GameCenter.ItemTipsMgr:ShowTips(self.ShowItemData, self.RootGO, self.Location, self.IsShowGet, nil, true, self.ExtData) end end if self.SingleClick ~= nil then self.SingleClick(self) end end function UIItem:UpdateBagNum() if Utils.IsNull(self.RootTrans) then return end if self.ShowItemData == nil then return end if not self.IsBindBagNum then return end local haveNum = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(self.ShowItemData.CfgID) self.IsEnough = haveNum >= self.ShowNum if self.IsSingleNum then if self.NumLabel ~= nil then UIUtils.SetTextByNumber(self.NumLabel, haveNum, true, 4); end else if self.NumLabel ~= nil then UIUtils.SetTextByProgress(self.NumLabel, haveNum, self.ShowNum, true, 4) UIUtils.SetColorByString(self.NumLabel, self.IsEnough and "#00ff00" or "#ff2222") end end end function UIItem:OnBagItemChanged(obj, sender) if Utils.IsNull(self.RootTrans) then return end if self.ShowItemData == nil then return end if not self.IsBindBagNum then return end local itemBase = obj if itemBase ~= nil then if itemBase.CfgID == self.ShowItemData.CfgID then self:UpdateBagNum() end end end function UIItem:OnCoinChanged(obj, sender) if Utils.IsNull(self.RootTrans) then return end if self.ShowItemData == nil then return end if not self.IsBindBagNum or self.ShowItemData.CfgID ~= obj then return end self:UpdateBagNum() end function UIItem:RegisterMsg() if self.IsRegisterBagMsg then return end self.IsRegisterBagMsg = true GameCenter.RegFixEventHandle(LogicEventDefine.EVENT_BACKFORM_ITEM_UPDATE, self.OnBagItemChanged, self) GameCenter.RegFixEventHandle(LogicEventDefine.EVENT_COIN_CHANGE_UPDATE, self.OnCoinChanged, self) end function UIItem:UnRegisterMsg() if not self.IsRegisterBagMsg then return end self.IsRegisterBagMsg = false GameCenter.UnRegFixEventHandle(LogicEventDefine.EVENT_BACKFORM_ITEM_UPDATE, self.OnBagItemChanged, self) GameCenter.UnRegFixEventHandle(LogicEventDefine.EVENT_COIN_CHANGE_UPDATE, self.OnCoinChanged, self) end function UIItem:OnEnable() if self.IsBindBagNum then self:RegisterMsg() end end function UIItem:OnDisable() if self.IsBindBagNum then self:UnRegisterMsg() end end function UIItem:OnDestroy() L_ItemMap[self.RootTrans] = nil; if self.IsBindBagNum then self:UnRegisterMsg() end end return UIItem