XUiPanelSkillInfo = XClass(nil, "XUiPanelSkillInfo") local MAX_SUB_SKILL_GRID_COUNT = 6 local MAX_MAIN_SKILL_GRID_COUNT = 5 -- 触发拖拽前的延时 local LONG_CLICK_OFFSET = 0.2 local LONG_PRESS_PARAMS = 500 function XUiPanelSkillInfo:Ctor(ui, parent, rootUi) self.GameObject = ui.gameObject self.Transform = ui.transform self.Parent = parent self.RootUi = rootUi self:InitAutoScript() self:ResetLongPressData() self.GridSkillInfo.gameObject:SetActiveEx(false) self.GridSubSkill.gameObject:SetActiveEx(false) self.SkillInfoGo = {} table.insert(self.SkillInfoGo, self.GridSkillInfo) self.SkillInfoGrids = {} self.NotMaskShow = true self:Refresh() self:InitSubSkillGrids() end function XUiPanelSkillInfo:InitSubSkillGrids() self.SubSkillGrids = {} for i = 1, MAX_SUB_SKILL_GRID_COUNT do local item = CS.UnityEngine.Object.Instantiate(self.GridSubSkill) local grid = XUiGridSubSkill.New(item, i, function(subSkill, index) self:UpdateSubSkillInfoPanel(subSkill, index) end) grid.GameObject:SetActiveEx(false) grid.Transform:SetParent(self.PanelSubSkillList, false) table.insert(self.SubSkillGrids, grid) end end -- auto -- Automatic generation of code, forbid to edit function XUiPanelSkillInfo:InitAutoScript() self:AutoInitUi() XTool.InitUiObject(self) self:AutoAddListener() end function XUiPanelSkillInfo:AutoInitUi() self.PanelSkillBig = self.Transform:Find("PaneSkillInfo/PanelSkillBig") self.ImgSkillPointIcon = self.Transform:Find("PaneSkillInfo/PanelSkillBig/ImgSkillPointIcon"):GetComponent("Image") self.TxtSkillType = self.Transform:Find("PaneSkillInfo/PanelSkillBig/TxtSkillType"):GetComponent("Text") self.TxtSkillName = self.Transform:Find("PaneSkillInfo/PanelSkillBig/TxtSkillName"):GetComponent("Text") self.TxtSkillLevel = self.Transform:Find("PaneSkillInfo/PanelSkillBig/TxtSkillLevel"):GetComponent("Text") self.BtnSkillpointAdd = self.Transform:Find("SkillPoint/BtnSkillpointAdd"):GetComponent("Button") self.TxtSkillNumber = self.Transform:Find("SkillPoint/TxtSkillNumber"):GetComponent("Text") self.RImgSkillIcon = self.Transform:Find("SkillPoint/RImgSkillIcon"):GetComponent("RawImage") self.PanelSubSkillList = self.Transform:Find("PaneSkillInfo/PanelSubSkillList") self.GridSubSkill = self.Transform:Find("PaneSkillInfo/PanelSubSkillList/GridSubSkill") self.PanelScroll = self.Transform:Find("PaneSkillInfo/PanelScroll") self.GridSkillInfo = self.Transform:Find("PaneSkillInfo/PanelScroll/GridSkillInfo") self.BtnHuadong = self.Transform:Find("PaneSkillInfo/BtnHuadong"):GetComponent("Button") self.BtnHuadong1 = self.Transform:Find("PaneSkillInfo/BtnHuadong1"):GetComponent("Button") self.PanelCondition = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelCondition") self.TxtConditionBad = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelCondition/TxtConditionBad"):GetComponent("Text") self.TxtConditionOk = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelCondition/TxtConditionOk"):GetComponent("Text") self.PanelConsume = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume") self.PanelSkillPoint = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelSkillPoint") self.PanelSkillPointBad = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelSkillPoint/PanelSkillPointBad") self.TxtSkillPointBad = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelSkillPoint/PanelSkillPointBad/TxtSkillPointBad"):GetComponent("Text") self.PanelSkillPointOk = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelSkillPoint/PanelSkillPointOk") self.TxtSkillPointOk = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelSkillPoint/PanelSkillPointOk/TxtSkillPointOk"):GetComponent("Text") self.PanelCoin = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelCoin") self.PanelCoinBad = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelCoin/PanelCoinBad") self.TxtCoinBad = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelCoin/PanelCoinBad/TxtCoinBad"):GetComponent("Text") self.PanelCoinOk = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelCoin/PanelCoinOk") self.TxtCoinOk = self.Transform:Find("PaneSkillInfo/SubSkillInfo/PanelConsume/PanelCoin/PanelCoinOk/TxtCoinOk"):GetComponent("Text") self.PanelMask = self.Transform:Find("PaneSkillInfo/PanelMask") end function XUiPanelSkillInfo:RegisterClickEvent(uiNode, func) if func == nil then XLog.Error("XUiPanelSkillInfo:RegisterClickEvent函数参数错误:参数func不能为空") return end if type(func) ~= "function" then XLog.Error("XUiPanelSkillInfo:RegisterClickEvent函数错误, 参数func需要是function类型, func的类型是" .. type(func)) end local listener = function(...) func(self, ...) end CsXUiHelper.RegisterClickEvent(uiNode, listener) end function XUiPanelSkillInfo:AutoAddListener() self:RegisterClickEvent(self.BtnSkillpointAdd, self.OnBtnSkillpointAddClick) self:RegisterClickEvent(self.BtnHuadong, self.OnBtnHuadongClick) self:RegisterClickEvent(self.BtnHuadong1, self.OnBtnHuadong1Click) self:RegisterClickEvent(self.BtnUnlock, self.OnBtnUnlockClick) self:RegisterClickEvent(self.BtnSwitch, self.OnBtnSwitchClick) self:RegisterLongPressLevelUp() end -- auto function XUiPanelSkillInfo:OnBtnUpgradeClick(ClientLongPressIncreaseLevel) if not self.NotMaskShow then self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) end if not ClientLongPressIncreaseLevel then --过滤掉不正确的弹窗 if (not self:CheckUpgradeSubSkill())then return end end if XTool.IsTableEmpty(self.CurSubSkill) then return end if not XDataCenter.ItemManager.DoNotEnoughBuyAsset(XDataCenter.ItemManager.ItemId.Coin, self.CurSubSkill.config.UseCoin, 1, function() self:OnBtnUpgradeClick() end, "CharacterUngradeSkillCoinNotEnough") then return end XDataCenter.CharacterManager.UpgradeSubSkillLevel(self.CharacterId, self.CurSubSkill.SubSkillId, function() XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, CS.XTextManager.GetText("CharacterUngradeSkillComplete")) self:RefreshData() self:Refresh() end, ClientLongPressIncreaseLevel) end function XUiPanelSkillInfo:OnBtnSwitchClick() local subSkillInfo = self.CurSubSkill local addLevel = XDataCenter.CharacterManager.GetSkillPlusLevel(self.CharacterId, subSkillInfo.SubSkillId) local totalLevel = subSkillInfo.Level + addLevel XLuaUiManager.Open("UiCharacterSkillSwich", subSkillInfo.SubSkillId, totalLevel, function() self:RefreshData() self:Refresh() end) end function XUiPanelSkillInfo:OnBtnUnlockClick() if (not self:CheckUpgradeSubSkill()) then return end if XTool.IsTableEmpty(self.CurSubSkill) or not XDataCenter.ItemManager.DoNotEnoughBuyAsset(XDataCenter.ItemManager.ItemId.Coin, self.CurSubSkill.config.UseCoin, 1, function() self:OnBtnUnlockClick() end, "CharacterUngradeSkillCoinNotEnough") then return end XDataCenter.CharacterManager.UnlockSubSkill(self.CurSubSkill.SubSkillId, self.CharacterId, function() XEventManager.DispatchEvent(XEventId.EVENT_CHARACTER_INCREASE_TIP, CS.XTextManager.GetText("CharacterUnlockSkillComplete")) self:RefreshData() self:Refresh() end) end function XUiPanelSkillInfo:OnBtnSkillpointAddClick() local id = XDataCenter.ItemManager.ItemId.SkillPoint XLuaUiManager.Open("UiTip", XDataCenter.ItemManager.GetItem(id)) end function XUiPanelSkillInfo:OnBtnHuadongClick() if self.Pos then self:GotoSkill(self.Pos + 1) end end function XUiPanelSkillInfo:OnBtnHuadong1Click() if self.Pos then self:GotoSkill(self.Pos - 1) end end function XUiPanelSkillInfo:GotoSkill(index) if self.Parent.SkillGrids[index] then self.Parent.SkillGrids[index]:OnBtnIconBgClick() end self.Parent:HideLevelDetail() self:UpdateArrowView() end function XUiPanelSkillInfo:UpdateArrowView() self.BtnHuadong.gameObject:SetActiveEx(not (self.Pos == MAX_MAIN_SKILL_GRID_COUNT)) self.BtnHuadong1.gameObject:SetActiveEx(not (self.Pos == 1)) end function XUiPanelSkillInfo:CheckUpgradeSubSkill() local subSkill = self.CurSubSkill local conditions = subSkill.config.ConditionId if not conditions then return true end for _, conditionId in pairs(conditions) do local passCondition local conditionDes if conditionId ~= 0 then passCondition, conditionDes = XConditionManager.CheckCondition(conditionId, self.CharacterId) if not passCondition then XUiManager.TipMsg(conditionDes) return false end end end if (not XDataCenter.CharacterManager.IsUseItemEnough(XDataCenter.ItemManager.ItemId.SkillPoint, self.CurSubSkill.config.UseSkillPoint)) then XUiManager.TipText("CharacterUngradeSkillSkillPointNotEnough") return false end return true end function XUiPanelSkillInfo:ShowPanel(characterId, skills, pos) self.CharacterId = characterId or self.CharacterId self.Skills = skills self.Pos = pos self.Skill = skills[pos] self.IsShow = true self.GameObject:SetActiveEx(true) for i, skill in pairs(skills) do local grid = self.SkillInfoGrids[i] if (grid == nil) then local ui_item = self.SkillInfoGo[i] if (ui_item == nil) then ui_item = CS.UnityEngine.Object.Instantiate(self.GridSkillInfo, self.PanelScroll) ui_item.transform:SetAsFirstSibling() table.insert(self.SkillInfoGo, ui_item) end grid = XUiGridSkillInfo.New(ui_item, skill, function(skillId) self.Parent:ShowLevelDetail(skillId) end) table.insert(self.SkillInfoGrids, grid) else grid:UpdateData(skill) end grid.CurveValue = 0 grid.GameObject:SetActiveEx(true) end self:RefreshPanel(characterId, self.Skill) self:RefreshData() -- 默认点击 if self.SubSkillGrids[1] then self.SubSkillGrids[1]:OnBtnSubSkillIconBgClick() end self:UpdateArrowView() self.Parent.SkillInfoQiehuan:PlayTimelineAnimation() end function XUiPanelSkillInfo:RefreshData(clientLevel,subSkill) local characterId = self.CharacterId if not characterId then return end self.Skills = XCharacterConfigs.GetCharacterSkills(characterId, clientLevel,subSkill) local skill = self.Skills[self.Skill.config.Pos] local grid = self.SkillInfoGrids[self.Pos] for i = 1, #self.SkillInfoGrids do self.SkillInfoGrids[i].GameObject:SetActiveEx(self.Pos == i) end if (grid) then grid:UpdateData(skill) end self.Parent:UpdateSkill() self:RefreshPanel(self.CharacterId, skill,clientLevel) self:RefreshBigSkill(skill) end function XUiPanelSkillInfo:RefreshBigSkill(skill) self.RootUi:SetUiSprite(self.ImgSkillPointIcon, skill.Icon) self.TxtSkillType.text = skill.TypeDes self.TxtSkillName.text = skill.Name local addLevel = 0 for _, skillId in pairs(skill.SkillIdList) do addLevel = addLevel + XDataCenter.CharacterManager.GetSkillPlusLevel(self.CharacterId, skillId) end local totalLevel = skill.TotalLevel + addLevel self.TxtSkillLevel.text = totalLevel end function XUiPanelSkillInfo:RefreshPanel(characterId, skill,clientLevel) self.CharacterId = characterId or self.CharacterId self.Skill = skill and skill or self.Skill self:UpdateSubSkillList(self.Skill.subSkills) for i, sub_skill in ipairs(self.Skill.subSkills) do if (i == self.CurSubSkillIndex) then self:UpdateSubSkillInfoPanel(sub_skill, self.CurSubSkillIndex) break end end end function XUiPanelSkillInfo:UpdateSubSkillList(subSkillList, cb) for _, grid in pairs(self.SubSkillGrids) do grid:Reset() end local count = #subSkillList if count > MAX_SUB_SKILL_GRID_COUNT then XLog.Warning("max subskill grid count is " .. MAX_SUB_SKILL_GRID_COUNT) count = MAX_SUB_SKILL_GRID_COUNT end for i = 1, count do local sub_skill = subSkillList[i] local grid = self.SubSkillGrids[i] grid:UpdateGrid(self.CharacterId, sub_skill) grid.GameObject.name = sub_skill.SubSkillId if i == 1 then grid:SetSelect(true) end end XEventManager.DispatchEvent(XEventId.EVENT_GUIDE_STEP_OPEN_EVENT) if (cb) then cb() end end function XUiPanelSkillInfo:UpdateSubSkillInfoPanel(subSkill, index) if not subSkill then return end local showSwithBtn = subSkill.Level > 0 and XCharacterConfigs.CanSkillSwith(subSkill.SubSkillId) self.BtnSwitch.gameObject:SetActiveEx(showSwithBtn) if self.CurSubSkillIndex then self.SubSkillGrids[self.CurSubSkillIndex]:SetSelect(false) end local grid = self.SkillInfoGrids[self.Pos] if grid then grid:SetSubInfo(self.CharacterId, index, subSkill.Level, subSkill.SubSkillId) end self.CurSubSkillIndex = index self.SubSkillGrids[self.CurSubSkillIndex]:SetSelect(true) self.CurSubSkill = subSkill for _, tmpGrid in pairs(self.SubSkillGrids) do tmpGrid:ResetSelect(subSkill.SubSkillId) end local min_max = XCharacterConfigs.GetSubSkillMinMaxLevel(subSkill.SubSkillId) if (subSkill.Level >= min_max.Max) then self.PanelCondition.gameObject:SetActiveEx(false) self.PanelConsume.gameObject:SetActiveEx(false) self.BtnUpgrade.gameObject:SetActiveEx(false) self.BtnUnlock.gameObject:SetActiveEx(false) self.PanelMaxLevel.gameObject:SetActiveEx(true) return else self.PanelMaxLevel.gameObject:SetActiveEx(false) end local passCondition = true local conditionDes = "" local conditions = subSkill.config.ConditionId if conditions then for _, conditionId in pairs(conditions) do if conditionId ~= 0 then passCondition, conditionDes = XConditionManager.CheckCondition(conditionId, self.CharacterId) if not passCondition then break end end end end self.PanelConsume.gameObject:SetActiveEx(passCondition) self.PanelCondition.gameObject:SetActiveEx(not passCondition) self.TxtConditionOk.gameObject:SetActiveEx(passCondition) self.TxtConditionBad.gameObject:SetActiveEx(not passCondition) if passCondition then self.TxtConditionOk.text = conditionDes --消耗技能点 local showSkillPoint = subSkill.config.UseSkillPoint > 0 self.PanelSkillPoint.gameObject:SetActiveEx(showSkillPoint) if showSkillPoint then local isSkillPointMeet = XDataCenter.CharacterManager.IsUseItemEnough({ XDataCenter.ItemManager.ItemId.SkillPoint }, { subSkill.config.UseSkillPoint }) if isSkillPointMeet then self.TxtSkillPointOk.text = subSkill.config.UseSkillPoint else self.TxtSkillPointBad.text = subSkill.config.UseSkillPoint end self.PanelSkillPointBad.gameObject:SetActiveEx(not isSkillPointMeet) self.PanelSkillPointOk.gameObject:SetActiveEx(isSkillPointMeet) end --消耗螺母 local showCoin = subSkill.config.UseCoin > 0 self.PanelCoin.gameObject:SetActiveEx(showCoin) if showCoin then local isUseCoinMeet = XDataCenter.CharacterManager.IsUseItemEnough({ XDataCenter.ItemManager.ItemId.Coin }, { subSkill.config.UseCoin }) if isUseCoinMeet then self.TxtCoinOk.text = subSkill.config.UseCoin else self.TxtCoinBad.text = subSkill.config.UseCoin end self.PanelCoinBad.gameObject:SetActiveEx(not isUseCoinMeet) self.PanelCoinOk.gameObject:SetActiveEx(isUseCoinMeet) end if not showCoin and not showSkillPoint then self.PanelConsume.gameObject:SetActiveEx(false) end else self.TxtConditionBad.text = conditionDes end if (subSkill.Level <= 0) then self.BtnUnlock:SetDisable(not passCondition) self.BtnUnlock.gameObject:SetActiveEx(true) self.BtnUpgrade.gameObject:SetActiveEx(false) elseif (subSkill.Level < min_max.Max and subSkill.Level > 0) then local canUpdate = XDataCenter.CharacterManager.CheckCanUpdateSkill(self.CharacterId, subSkill.SubSkillId, subSkill.Level) self.BtnUpgrade:SetDisable(not canUpdate) self.BtnUpgrade.gameObject:SetActiveEx(true) self.BtnUnlock.gameObject:SetActiveEx(false) end end function XUiPanelSkillInfo:HidePanel() self.Clicker:Reset() self:ResetLongPressData() self.IsShow = false self.GameObject:SetActiveEx(false) if (self.ScrollFlow) then self.ScrollFlow:Dispose() end self.CurSubSkillIndex = nil self.CurSubSkill = nil self.Parent.BtnSkillTeach.gameObject:SetActiveEx(XUiPanelCharSkill.BUTTON_SKILL_TEACH_ACTIVE) end function XUiPanelSkillInfo:Refresh() --读取数据 local item = XDataCenter.ItemManager.GetItem(XDataCenter.ItemManager.ItemId.SkillPoint) local count = item ~= nil and tostring(item.Count) or "0" local icon = XDataCenter.ItemManager.GetItemIcon(XDataCenter.ItemManager.ItemId.SkillPoint) self.TxtSkillNumber.text = count self.RImgSkillIcon:SetRawImage(icon) end --技能长按 function XUiPanelSkillInfo:RegisterLongPressLevelUp() -- 添加长按事件 local btnClickPointer = self.BtnUpgrade.gameObject:GetComponent("XUiPointer") if not btnClickPointer then btnClickPointer = self.BtnUpgrade.gameObject:AddComponent(typeof(CS.XUiPointer)) end self.Clicker = XUiButtonLongClick.New(btnClickPointer, math.floor(1000/ CS.XGame.ClientConfig:GetInt("LongPressPerLevelUp")), self, self.OnBtnUpgradeClick, self.OnLongPress, function() self:OnLongPressUp() end, false, nil,true,true) self.Clicker:SetTriggerOffset(LONG_CLICK_OFFSET) end function XUiPanelSkillInfo:OnLongPress(pressingTime) if self.NotMaskShow then --增加mask,阻止长按时候玩家的其他操作 self.NotMaskShow = false self.PanelMask.gameObject:SetActiveEx(true) end local clientShowLevelParam = 0 local minMax if pressingTime > LONG_CLICK_OFFSET * LONG_PRESS_PARAMS then --控制延时刷新,避免点击一次就刷新技能升级预览 for i, sub_skill in ipairs(self.Skill.subSkills) do if (i == self.CurSubSkillIndex) then local originalLevel = XDataCenter.CharacterManager.GetSkillLevel(sub_skill.SubSkillId) minMax = XCharacterConfigs.GetSubSkillMinMaxLevel(sub_skill.SubSkillId) self.ClientLongPressIncreaseLevel = self.ClientLongPressIncreaseLevel + 1 clientShowLevelParam = self.ClientLongPressIncreaseLevel + originalLevel local canUpdate = XDataCenter.CharacterManager.CheckCanUpdateSkillMultiLevel(self.CharacterId, sub_skill.SubSkillId, originalLevel,clientShowLevelParam - 1 )--当前等级的消耗是升级到下一级的,所以判断升级的时候-1 if canUpdate then if (clientShowLevelParam > minMax.Max) then clientShowLevelParam = minMax.Max end self.ClientShowLevelParam = clientShowLevelParam self:RefreshData(self.ClientShowLevelParam,self.CurSubSkill) else return true,true --回调参数即使时间短也要加弹窗提示 end break end end end end function XUiPanelSkillInfo:OnLongPressUp() self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) if XTool.IsTableEmpty(self.CurSubSkill) then return end local originalLevel = XDataCenter.CharacterManager.GetSkillLevel(self.CurSubSkill.SubSkillId) local minMax = XCharacterConfigs.GetSubSkillMinMaxLevel(self.CurSubSkill.SubSkillId) for i = originalLevel, self.ClientShowLevelParam -1 do --当前等级的消耗是升级到下一级的需要减一操作 local gradeConfig = XCharacterConfigs.GetSkillGradeConfig(self.CurSubSkill.SubSkillId, i) if not gradeConfig then break end self.LongPressCostCoin = self.LongPressCostCoin + gradeConfig.UseCoin self.LongPressCostSkillPoint = self.LongPressCostSkillPoint + gradeConfig.UseSkillPoint end if self.LongPressCostCoin <= 0 and self.LongPressCostSkillPoint <= 0 then --无消耗就无升级 return end local textParam = "LongPressLevelUpSkill" if minMax and minMax.Max == self.ClientShowLevelParam then textParam = "LongPressLevelUpSkillMax" end local content = CSXTextManagerGetText(textParam, self.LongPressCostCoin, self.LongPressCostSkillPoint, self.ClientShowLevelParam) local tempClientShowLevelParam = self.ClientShowLevelParam local sureCallBack = function() self:OnBtnUpgradeClick(tempClientShowLevelParam - originalLevel) end local closeCallback = function() self:RefreshData() end self:ResetLongPressData() local title = CS.XTextManager.GetText("TipTitle") XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, closeCallback, sureCallBack) end function XUiPanelSkillInfo:ResetLongPressData() self.ClientShowLevelParam = 0 --要升级到的等级 self.ClientLongPressIncreaseLevel = 0 --等级变量依据长按时间增加 self.LongPressCostCoin = 0 self.LongPressCostSkillPoint = 0 self.NotMaskShow = true self.PanelMask.gameObject:SetActiveEx(false) end function XUiPanelSkillInfo:RefreshClientBigSkill() if not self.CharacterId or not self.ClientShowLevelParam then return end self.Skills = XCharacterConfigs.GetCharacterSkills(self.CharacterId) local skill = self.Skills[self.Skill.config.Pos] local addLevel = self.ClientShowLevelParam for _, skillId in pairs(skill.SkillIdList) do addLevel = addLevel + XDataCenter.CharacterManager.GetSkillPlusLevel(self.CharacterId, skillId) end local totalLevel = skill.TotalLevel + addLevel self.TxtSkillLevel.text = totalLevel end