-- gacha3D抽卡界面 local XUiEpicFashionGacha = XLuaUiManager.Register(XLuaUi, "UiEpicFashionGacha") local LongEnableCb -- 长动画的回调 local CanPlayEnableAnim = false -- 只有进入卡池时会检测播放1次 local ShowFashionTrigger = nil local ShowCourseRewardTrigger = nil local DoGachaTrigger = nil -- 抽卡触发器,1/10回抽按钮设置,拨动时钟触发 local FinishCbTrigger = nil -- 抽卡结束触发器,抽卡请求回调设置,播放完抽卡演出后触发 local GachaAllFinishTrigger = nil -- 抽卡全结束触发器,1/10回抽按钮设置,抽卡结果界面关闭后刷新触发 local HasBeenKey = "HasBeenKey" local SkipBtnKey = "UiEpicFashionGacha" local GachaStoryRedPoint = "GachaStoryRedPoint" local TempFx = nil function XUiEpicFashionGacha:SetSelfActive(flag) self.PanelGachaGroup.gameObject:SetActiveEx(flag) self:SetXPostFaicalControllerActive(flag) self.IsParentShow = flag end function XUiEpicFashionGacha:OnAwake() self.IsParentShow = true self.IsCanGacha = true self.IsCanGachaClick = true self.GridCourseRewardsDic = {} self.GridBoardRewardsDic = {} self.PanelShowDic = {} self:InitButton() self:Init3DSceneInfo() end function XUiEpicFashionGacha:InitButton() self:RegisterClickEvent(self.BtnBack, self.Close) self:RegisterClickEvent(self.BtnMainUi, function() XLuaUiManager.RunMain() end) self:RegisterClickEvent(self.BtnGacha, function () self:OnBtnGachaClick(self.GachaCfg.BtnGachaCount[1]) end) self:RegisterClickEvent(self.BtnGacha2, function () self:OnBtnGachaClick(self.GachaCfg.BtnGachaCount[2]) end) self:RegisterClickEvent(self.BtnStartGacha, self.OnBtnStartClick) self:RegisterClickEvent(self.BtnStartAnim, self.PlayLongEnableAnim2) self:RegisterClickEvent(self.BtnSkipGacha, self.OnBtnSkipGachaClick) self:RegisterClickEvent(self.BtnStoryLine, self.OnBtnStoryLineClick) self:RegisterClickEvent(self.BtnAward, function () XLuaUiManager.Open("UiEpicFashionGachaLog", self.GachaCfg, 1) end) self:RegisterClickEvent(self.BtnHelp, function () XLuaUiManager.Open("UiEpicFashionGachaLog", self.GachaCfg) end) self:RegisterClickEvent(self.BtnSet, function () XLuaUiManager.Open("UiSet") end) end function XUiEpicFashionGacha:Init3DSceneInfo() if not self.UiSceneInfo or XTool.UObjIsNil(self.UiSceneInfo.Transform) then self:LoadUiScene(self:GetDefaultSceneUrl(), self:GetDefaultUiModelUrl()) end self.Panel3D = {} local root = self.UiModelGo.transform XTool.InitUiObjectByUi(self.Panel3D, self.UiSceneInfo.Transform) -- 将场景的内容和镜头的内容加到1个table里 XTool.InitUiObjectByUi(self.Panel3D, root) -- 3d镜头的ui self:Refresh3DSceneInfo() -- 阴影要放在武器模型加载完之后 CS.XShadowHelper.AddShadow(self.Panel3D.Model2.gameObject, true) end function XUiEpicFashionGacha:Refresh3DSceneInfo() self.Panel3D.UiModelParent.gameObject:SetActiveEx(true) self.Panel3D.UiModelParentStory.gameObject:SetActiveEx(false) self.Panel3D.Model2.gameObject:SetActiveEx(true) self.Panel3D.Uimc_05ClockAni.gameObject:SetActiveEx(true) -- 抽卡界面专用时钟 self.Panel3D.Uimc_05ClockAni2.gameObject:SetActiveEx(false) self.Panel3D.Uimc_05ClockAni3.gameObject:SetActiveEx(false) -- 关闭主界面专用时钟 -- 打开主摄像机 关闭剧情相机和时钟相机 self.Panel3D.UiFarCameraMain.gameObject:SetActiveEx(true) self.Panel3D.UiFarCameraClock.gameObject:SetActiveEx(false) self.Panel3D.UiFarCameraDeep.gameObject:SetActiveEx(false) self.Panel3D.UiFarCameraStory.gameObject:SetActiveEx(false) self.Panel3D.UiNearCameraMain.gameObject:SetActiveEx(true) self.Panel3D.UiNearCameraClock.gameObject:SetActiveEx(false) self.Panel3D.UiNearCameraDeep.gameObject:SetActiveEx(false) self.Panel3D.UiNearCameraStory.gameObject:SetActiveEx(false) end function XUiEpicFashionGacha:OnStart(gachaId, autoOpenStory) self.GachaId = gachaId self.GachaCfg = XGachaConfigs.GetGachaCfgById(self.GachaId) self.AutoOpenStory = autoOpenStory -- 跳过按钮,只有在进入ui时自动刷新1次 local isSelect = XSaveTool.GetData(SkipBtnKey) local state = isSelect and CS.UiButtonState.Select or CS.UiButtonState.Normal self.BtnSkip:SetButtonState(state) CanPlayEnableAnim = true end function XUiEpicFashionGacha:OnChildClose() self:SetSelfActive(true) self:Refresh3DSceneInfo() self:RefreshUiShow() if CanPlayEnableAnim then self:PlayEnableAnim(function () self:RefreshReddot() end) else self.AnimEnableShort:PlayTimelineAnimation() self.Panel3D.AnimEnableShort:PlayTimelineAnimation(function () self:RefreshReddot() self:SetXPostFaicalControllerActive(true) end) end if self.TimerStoryRoleEnbale then XScheduleManager.UnSchedule(self.TimerStoryRoleEnbale) self.TimerStoryRoleEnbale = nil end end function XUiEpicFashionGacha:AutoOpenChild() if self.AutoOpenStory then self:OnBtnStoryLineClick(true) self.AutoOpenStory = nil elseif self.IsGoFight then self:OnBtnStoryLineClick() self.IsGoFight = nil end end function XUiEpicFashionGacha:OnEnable() -- 顺序不能改表 -- 1.先检测是否需要打开子界面 -- 【需要的话】就不进行enable动画播放 且直接刷新红点 -- 2.【不需要的话】就开始播放enable动画,且必须在动画播完后再刷新红点 if not self.Panel3D or XTool.UObjIsNil(self.Panel3D.GameObject) then self:Init3DSceneInfo() -- 战斗回来后场景会被销毁,需要判空再加载1次 end self:RefreshUiShow() self:AutoOpenChild() if CanPlayEnableAnim then self:PlayEnableAnim(function () self:RefreshReddot() end) else self:RefreshReddot() self:SetXPostFaicalControllerActive(true) end end -- 开启/关闭角色的视线跟随 function XUiEpicFashionGacha:SetXPostFaicalControllerActive(flag) local model = self.Panel3D.Model2 local targetComponent = model:GetComponent(typeof(CS.XPostFaicalController)) if not targetComponent then return end if flag and not targetComponent.enabled then targetComponent.enabled = true end targetComponent:ActiveInput(flag) end function XUiEpicFashionGacha:SetXPostFaicalControllerEnable(flag) local model = self.Panel3D.Model2 local targetComponent = model:GetComponent(typeof(CS.XPostFaicalController)) if not targetComponent then return end targetComponent.enabled = flag end function XUiEpicFashionGacha:PlayEnableAnim(cb) if not self.IsParentShow then return end CanPlayEnableAnim = false -- 播放演出动画的时候必须关闭头部跟随 关闭待机loop动画 self.Panel3D.RoleLoop:GetComponent("PlayableDirector"):Stop() self:SetXPostFaicalControllerActive(false) local isSkip = XSaveTool.GetData(SkipBtnKey) -- 如果勾了跳过演出 就播放短动画 否则播放长动画 if isSkip then if cb then cb() end self:PlayShortEnableAnim() else self:PlayLongEnableAnim1(cb) local hasBeen = XSaveTool.GetData(HasBeenKey) if not hasBeen then -- 如果第一次进来播长动画,自动勾上跳过 self.BtnSkip:SetButtonState(CS.UiButtonState.Select) XSaveTool.SaveData(HasBeenKey, 1) end end end -- 长动画1阶段,开始播放循环等待动画 function XUiEpicFashionGacha:PlayLongEnableAnim1(cb) LongEnableCb = cb -- 播放循环动画 self.AnimStart1:PlayTimelineAnimation() self.Panel3D.AnimStart1Loop:GetComponent("PlayableDirector"):Play() -- 打开按钮 等待玩家点击开始下一阶段长动画 self.BtnStartAnim.gameObject:SetActiveEx(true) end -- 长动画2阶段,该方法由玩家点击按钮后主动调用 function XUiEpicFashionGacha:PlayLongEnableAnim2() -- 点击后直接隐藏按钮 self.BtnStartAnim.gameObject:SetActiveEx(false) -- 动画 local lastUiDirector = self.Panel3D.AnimStart1Loop:GetComponent("PlayableDirector") local currTime = lastUiDirector.time or 0 lastUiDirector:Stop() self.Panel3D.AnimEnableLong.gameObject:SetActiveEx(true) local curUiDirector = self.Panel3D.AnimEnableLong:GetComponent("PlayableDirector") curUiDirector.initialTime = currTime curUiDirector:Play() self.LongAnimTimer = XScheduleManager.ScheduleOnce(function() self.Panel3D.RoleLoop:GetComponent("PlayableDirector"):Play() -- 必须要在enable动画完成后打开视线跟随 self.Panel3D.AnimEnableLong.gameObject:SetActiveEx(false) self:SetXPostFaicalControllerActive(true) if LongEnableCb then LongEnableCb() LongEnableCb = nil end end, math.round(curUiDirector.duration * XScheduleManager.SECOND)) self.AnimEnableLong:GetComponent("PlayableDirector").initialTime = currTime self.AnimEnableLong:GetComponent("PlayableDirector"):Play() self.Panel3D.TimeDisable:GetComponent("PlayableDirector").initialTime = currTime self.Panel3D.TimeDisable:GetComponent("PlayableDirector"):Play() end function XUiEpicFashionGacha:PlayShortEnableAnim(cb) self.Panel3D.RoleLoop:GetComponent("PlayableDirector"):Play() self.AnimEnableShort:PlayTimelineAnimation() self.Panel3D.AnimEnableShort:PlayTimelineAnimation(function () self:SetXPostFaicalControllerActive(true) if cb then cb() end end) end function XUiEpicFashionGacha:RefreshUiShow() -- 把实际的刷新方法放进1个fun里,因为会有两种刷新方式, -- 1 是抽完卡后的第一次刷新,必须通过动画回调,且这个动画必须放在刷新前 -- 2 是正常刷新,非抽卡后的刷新 local doRefreshFun = function () -- 资源栏 local managerItems = XDataCenter.ItemManager.ItemId self.AssetPanel = XUiHelper.NewPanelActivityAsset({ managerItems.PaidGem, managerItems.HongKa, self.GachaCfg.ConsumeId }, self.PanelSpecialTool) self.AssetPanel:SetButtonCb(3, function () self:OpenGachaItemShop() end) -- 奖励展示滚动 local PanelAwardShow = {} XTool.InitUiObjectByUi(PanelAwardShow, self.PanelAwardShow) local rewardRareLevelList = XDataCenter.GachaManager.GetGachaRewardSplitByRareLevel(self.GachaId) for i, group in ipairs(rewardRareLevelList) do local Panel = self.PanelShowDic[i] if XTool.IsTableEmpty(Panel) then Panel = {} self.PanelShowDic[i] = Panel local panelShowUiTrans = PanelAwardShow["PanelShow"..i] if not panelShowUiTrans then break end XTool.InitUiObjectByUi(Panel, panelShowUiTrans) end for k, v in pairs(group) do local searchIndex = i*10 + k local item = self.GridBoardRewardsDic[searchIndex] if not item then local uiTrans = k == 1 and Panel.GridRewards or CS.UnityEngine.Object.Instantiate(Panel.GridRewards, Panel.GridRewards.parent) item = XUiGridCommon.New(self, uiTrans) self.GridBoardRewardsDic[searchIndex] = item end local tmpData = {} tmpData.TemplateId = v.TemplateId tmpData.Count = v.Count local curCount if v.RewardType == XGachaConfigs.RewardType.Count then curCount = v.CurCount end item:Refresh(tmpData, nil, nil, nil, curCount) end end -- 历程 local curTotalGachaTimes = XDataCenter.GachaManager.GetTotalGachaTimes(self.GachaId) local courseReward = XGachaConfigs.GetGachaCourseRewardById(self.GachaCfg.CourseRewardId) local gachaBuyTicketRuleConfig = XGachaConfigs.GetGachaItemExchangeCfgById(self.GachaCfg.ExchangeId) local totaMaxTimes = gachaBuyTicketRuleConfig.TotalBuyCountMax curTotalGachaTimes = curTotalGachaTimes >= totaMaxTimes and totaMaxTimes or curTotalGachaTimes -- 分子不能超过分母 self.TextProgress.text = curTotalGachaTimes.."/"..totaMaxTimes local Notes = {} for i = 1, #courseReward.LimitDrawTimes, 1 do Notes[i] = {} XTool.InitUiObjectByUi(Notes[i], self["Note"..i]) end for i, rewardId in ipairs(courseReward.RewardIds) do -- 节点进度条 local curNoteGachaTime = courseReward.LimitDrawTimes[i] -- 该节点对应的gacha抽次数 local progresssImg = self["ProgressImgYellow"..i] progresssImg.fillAmount = (curTotalGachaTimes - (courseReward.LimitDrawTimes[i-1] or 0)) / (curNoteGachaTime - (courseReward.LimitDrawTimes[i-1] or 0)) -- 节点奖励 local rewards = XRewardManager.GetRewardList(rewardId) local note = Notes[i] note.Txt.text = curNoteGachaTime local isReceived = curTotalGachaTimes >= curNoteGachaTime if isReceived then if ShowCourseRewardTrigger and curTotalGachaTimes - 10 < curNoteGachaTime then -- 只有刚刚抽到的时候才闪一下 XUiHelper.PlayAllChildParticleSystem(note.PanelEffect) end note.PanelEffect.gameObject:SetActiveEx(true) note.Select.gameObject:SetActiveEx(true) else note.PanelEffect.gameObject:SetActiveEx(false) note.Select.gameObject:SetActiveEx(false) end for j, item in pairs(rewards) do local searchIndex = curNoteGachaTime + j local gridReward = self.GridCourseRewardsDic[searchIndex] if not gridReward then local ui = CS.UnityEngine.Object.Instantiate(note.GridRewards, note.GridRewards.parent) gridReward = XUiGridCommon.New(self, ui) self.GridCourseRewardsDic[searchIndex] = gridReward end gridReward.GameObject:SetActiveEx(true) gridReward:Refresh(item) gridReward:SetReceived(isReceived) end end -- 如果抽完卡达到历程奖励 弹奖励提示 if ShowCourseRewardTrigger then ShowCourseRewardTrigger() ShowCourseRewardTrigger = nil end -- 抽奖按钮 local GridBtnGachas = {} GridBtnGachas[1] = {} GridBtnGachas[2] = {} XTool.InitUiObjectByUi(GridBtnGachas[1], self.BtnGacha) XTool.InitUiObjectByUi(GridBtnGachas[2], self.BtnGacha2) local icon = XDataCenter.ItemManager.GetItemTemplate(self.GachaCfg.ConsumeId).Icon GridBtnGachas[1].ImgUseItemIcon:SetRawImage(icon) GridBtnGachas[1].TxtUseItemCount.text = self.GachaCfg.ConsumeCount GridBtnGachas[2].ImgUseItemIcon:SetRawImage(icon) GridBtnGachas[2].TxtUseItemCount.text = self.GachaCfg.ConsumeCount * 10 -- 按钮显示 local leftCanGachaCount = totaMaxTimes - curTotalGachaTimes self.IsCanGacha1 = leftCanGachaCount > 0 self.IsCanGacha10 = leftCanGachaCount >= 10 self.BtnGacha:SetDisable(not self.IsCanGacha1) self.BtnGacha2:SetDisable(not self.IsCanGacha10) if ShowFashionTrigger then ShowFashionTrigger() ShowFashionTrigger = nil end end if GachaAllFinishTrigger then GachaAllFinishTrigger = nil self.AnimEnableShort:PlayTimelineAnimation(function () doRefreshFun() self.Panel3D.RoleLoop:GetComponent("PlayableDirector"):Play() end) else doRefreshFun() end end function XUiEpicFashionGacha:RefreshReddot() -- 红点 local allStageIds = XFestivalActivityConfig.GetFestivalById(self.GachaCfg.FestivalActivityId).StageId local isAllPass = true for k, stageId in pairs(allStageIds) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if not stageInfo.Passed then isAllPass = false break end end local isNewDay = nil local updateTime = XSaveTool.GetData(GachaStoryRedPoint) if updateTime then isNewDay = XTime.GetServerNowTimestamp() > updateTime else isNewDay = true end local isRed = not isAllPass and isNewDay self.BtnStoryLine:ShowReddot(isRed) end -- 打开gacha道具购买界面 function XUiEpicFashionGacha:OpenGachaItemShop(openCb, gachaCount) -- 购买上限检测 local gachaBuyTicketRuleConfig = XGachaConfigs.GetGachaItemExchangeCfgById(self.GachaCfg.ExchangeId) if XDataCenter.GachaManager.GetCurExchangeItemCount(self.GachaId) >= gachaBuyTicketRuleConfig.TotalBuyCountMax then XUiManager.TipError(CS.XTextManager.GetText("BuyItemCountLimit", XDataCenter.ItemManager.GetItemName(self.GachaCfg.ConsumeId))) return end local createItemData = function (config, index) return { ItemId = config.UseItemIds[index], Sale = config.Sales[index], -- 折扣 CostNum = config.UseItemCounts[index], -- 价格 ItemImg = config.UseItemImgs[index], } end local itemData1 = createItemData(gachaBuyTicketRuleConfig, 1) local itemData2 = createItemData(gachaBuyTicketRuleConfig, 2) local targetData = {ItemId = self.GachaCfg.ConsumeId, ItemImg = gachaBuyTicketRuleConfig.TargetItemImg} XLuaUiManager.Open("UiEpicFashionGachaBuyTicket", self.GachaCfg, itemData1, itemData2, targetData, gachaCount, function () self:RefreshUiShow() end) if openCb then openCb() end end function XUiEpicFashionGacha:CheckIsCanGacha(gachaCount) if not XDataCenter.GachaManager.CheckGachaIsOpenById(self.GachaCfg.Id, true) then return false end -- 剩余抽卡次数检测 if not self["IsCanGacha"..gachaCount] then return end -- 抽卡前检测物品是否满了 if XDataCenter.EquipManager.CheckBoxOverLimitOfDraw() then return false end -- 检查货币是否足够 local ownItemCount = XDataCenter.ItemManager.GetItem(self.GachaCfg.ConsumeId).Count local lackItemCount = self.GachaCfg.ConsumeCount * gachaCount - ownItemCount if lackItemCount > 0 then -- 打开购买界面 self:OpenGachaItemShop(function () XUiManager.TipError(CS.XTextManager.GetText("DrawNotEnoughError")) end, gachaCount) return false end -- 奖励库存检查(检测抽奖池剩余库存) -- local dtCount = XDataCenter.GachaManager.GetMaxCountOfAll() - XDataCenter.GachaManager.GetCurCountOfAll() -- if dtCount < gachaCount and not XDataCenter.GachaManager.GetIsInfinite() then -- XUiManager.TipMsg(CS.XTextManager.GetText("GachaIsNotEnough")) -- return -- end return true end -- 抽卡流程 -- 1.点击gacha按钮调用 OnBtnGachaClick ,将DoGacha写入触发器 DoGachaTrigger 等待BtnStart按钮触发 --→ 2.打开1阶段动画仅移动镜头和开启下一步点击的全屏按钮BtnStart, 仅调用PlayGachaAnime1 -- 3.点击 BtnStart按钮 触发DoGachaTrigger 调用 DoGacha,成功抽取奖励后将展示奖励ui的逻辑写入触发器 FinishCbTrigger 等待第二阶段动画播放完后调用。播放动画调用 PlayGachaAnime2 -- 4.播放第二阶段动画,在播放完的回调里调用 FinishCbTrigger 。结束 function XUiEpicFashionGacha:DoGacha(gachaCount, isSkipToShow) local totalGachaCountBefore = XDataCenter.GachaManager.GetTotalGachaTimes(self.GachaId) if self.IsCanGacha then self.IsCanGacha = false -- 根据是否已拥有奖励判断能否弹窗历程奖励 local isShowCourseRewardList = {} local courseReward = XGachaConfigs.GetGachaCourseRewardById(self.GachaCfg.CourseRewardId) for i = 1, #courseReward.LimitDrawTimes, 1 do local rewardList = XRewardManager.GetRewardList(courseReward.RewardIds[i]) local isShow = true -- 检测是否已经拥有奖励的内容了,已拥有就不弹了。这个检测必须放在trigger外面作为upvalue,因为trigeer的调用时机很晚,背包可能已经被塞入东西看 for k, data in pairs(rewardList) do if i == 1 then if XRewardManager.CheckRewardOwn(data.RewardType, data.TemplateId) then isShow = false end end isShowCourseRewardList[i] = isShow end end local successCb = function (rewardList) self.RewardList = rewardList -- 检测是否抽到时装 for k, v in pairs(rewardList) do if v.TemplateId == self.GachaCfg.TargetTemplateId then ShowFashionTrigger = function () XLuaUiManager.Open("UiEpicFashionGachaQuickWear", self.GachaCfg.TargetTemplateId) end break end end -- 检测是否达到历程奖励 local totalGachaCountAfter = XDataCenter.GachaManager.GetTotalGachaTimes(self.GachaId) for i = 1, #courseReward.LimitDrawTimes, 1 do local times = courseReward.LimitDrawTimes[i] if totalGachaCountBefore < times and totalGachaCountAfter >= times then local rewardList = XRewardManager.GetRewardList(courseReward.RewardIds[i]) local isShow = isShowCourseRewardList[i] ShowCourseRewardTrigger = function () if isShow then XUiManager.OpenUiObtain(rewardList) end end break end end -- 播放完动画 展示奖励界面的触发器 FinishCbTrigger = function (isSkipToShow2) -- 抽卡成功关闭场景镜头、特效 self:StopAnime() local isSkipToShow = isSkipToShow2 or isSkipToShow -- 闭包在其他函数调用的时候不能获取当前函数里的的upvalue isSkipToShow,所以要在其他地方调用时要额外再传一次isSkipToShow2 XLuaUiManager.Open("UiEpicFashionGachaShow", self.GachaId, self.RewardList, function() XLuaUiManager.Open("UiEpicFashionGachaResult", self.GachaId, self.RewardList, function() end,self.Background) end, nil, isSkipToShow and gachaCount > 1) -- 单抽不能跳过奖励展示 self.IsCanGacha = true self.IsCanGachaClick = true end if isSkipToShow then if FinishCbTrigger then FinishCbTrigger(isSkipToShow) FinishCbTrigger = nil end else local maxQuality = 0 for k, rewardInfo in pairs(rewardList) do --获取奖励品质 local id = rewardInfo.Id and rewardInfo.Id > 0 and rewardInfo.Id or rewardInfo.TemplateId local Type = XTypeManager.GetTypeById(id) if rewardInfo.ConvertFrom > 0 then Type = XTypeManager.GetTypeById(rewardInfo.ConvertFrom) id = rewardInfo.ConvertFrom end local quality local templateIdData = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(id) if Type == XArrangeConfigs.Types.Wafer then quality = templateIdData.Star elseif Type == XArrangeConfigs.Types.Weapon then quality = templateIdData.Star elseif Type == XArrangeConfigs.Types.Character then quality = XCharacterConfigs.GetCharMinQuality(id) elseif Type == XArrangeConfigs.Types.Partner then quality = templateIdData.Quality else quality = XTypeManager.GetQualityById(id) end if XDataCenter.ItemManager.IsWeaponFashion(id) then quality = XTypeManager.GetQualityById(id) end -- 强制检测特效 local foreceQuality = XGachaConfigs.GetGachaShowRewardConfigById(id) if foreceQuality then quality = foreceQuality.EffectQualityType end if quality > maxQuality then maxQuality = quality end end self:PlayGachaAnime2(maxQuality) end end XDataCenter.GachaManager.DoGacha(self.GachaCfg.Id, gachaCount, successCb, function(res) -- self.ImgMask.gameObject:SetActiveEx(false) end) end end -- 1阶段特效 (点击单抽或十连抽按钮后的特效:镜头推至时钟,打开冰霜特效) function XUiEpicFashionGacha:PlayGachaAnime1() self.PlayAnime1 = true -- 镜头 self.Panel3D.UiNearCameraClock.gameObject:SetActiveEx(true) self.Panel3D.UiFarCameraClock.gameObject:SetActiveEx(true) -- 特效 self.PanelGachaEffect.gameObject:SetActiveEx(true) self.Panel3D.FxUiMain3dClockChoukaPingmuIce.gameObject:SetActiveEx(true) -- 按钮 self.BtnSkipGacha.gameObject:SetActiveEx(true) self.BtnStartGacha.gameObject:SetActiveEx(true) -- 动画 self.GachaButtonsEnable:PlayTimelineAnimation() self.Panel3D.GachaButtonsEnable:PlayTimelineAnimation() self.PlayAnime1 = false -- 生成音效 TempFx = self.Transform:LoadPrefab(CS.XGame.ClientConfig:GetString("EpicGahcaSoundPingmuIce")) end -- 2阶段特效 (点击时钟后:播放时钟转动动画,打开玫瑰特效 并根据抽出的品质展示不同颜色的特效 function XUiEpicFashionGacha:PlayGachaAnime2(quality) self.PlayAnime2 = true if not FinishCbTrigger then return end -- 镜头 self.Panel3D.UiFarCameraDeep.gameObject:SetActiveEx(true) self.Panel3D.UiNearCameraDeep.gameObject:SetActiveEx(true) -- 特效 self.PanelGachaEffect.gameObject:SetActiveEx(false) self.Panel3D.FxJiaotangWuguang02.gameObject:SetActiveEx(false) --场景的光柱特效 self.Panel3D.FxUiMain3dClockChouka.gameObject:SetActiveEx(true) self.Panel3D.FxUiMain3dClockChoukaYaan.gameObject:SetActiveEx(true) self.Panel3D.FxUiMain3dClockChoukaPingmuBlack.gameObject:SetActiveEx(true) -- 播放动画,隐藏原来的时钟 self.Panel3D.Uimc_05ClockAni.gameObject:SetActiveEx(false) self.Panel3D.Uimc_05ClockAni2.gameObject:SetActiveEx(true) self.GachaButtonsDisable:PlayTimelineAnimation() quality = quality or 4 local go = self.Panel3D["FxUiMain3dClockHuaban"..quality] if go then go.gameObject:SetActiveEx(true) end self.Panel3D.Uimc_05ClockAni2:Find("Animation/Rotate"):PlayTimelineAnimation(function () if not self.PlayAnime2 then return end self.PlayAnime2 = false if FinishCbTrigger then FinishCbTrigger() FinishCbTrigger = nil end end) -- 销毁音效 if TempFx then TempFx = self.Transform:LoadPrefab(CS.XGame.ClientConfig:GetString("EpicGahcaSoundClose")) end end -- 关闭所有特效 function XUiEpicFashionGacha:StopAnime() -- 镜头 self.Panel3D.UiNearCameraClock.gameObject:SetActiveEx(false) self.Panel3D.UiFarCameraClock.gameObject:SetActiveEx(false) self.Panel3D.UiFarCameraDeep.gameObject:SetActiveEx(false) self.Panel3D.UiNearCameraDeep.gameObject:SetActiveEx(false) -- 特效 self.PanelGachaEffect.gameObject:SetActiveEx(false) self.Panel3D.FxJiaotangWuguang02.gameObject:SetActiveEx(true) --场景的光柱特效 self.Panel3D.FxUiMain3dClockChoukaPingmuIce.gameObject:SetActiveEx(false) self.Panel3D.FxUiMain3dClockChouka.gameObject:SetActiveEx(false) self.Panel3D.FxUiMain3dClockChoukaYaan.gameObject:SetActiveEx(false) self.Panel3D.FxUiMain3dClockChoukaPingmuBlack.gameObject:SetActiveEx(false) for i = 3, 6, 1 do local go = self.Panel3D["FxUiMain3dClockHuaban"..i] if go then go.gameObject:SetActiveEx(false) end end -- 动画 self.Panel3D.Uimc_05ClockAni.gameObject:SetActiveEx(true) self.Panel3D.Uimc_05ClockAni2.gameObject:SetActiveEx(false) -- 按钮 self.BtnSkipGacha.gameObject:SetActiveEx(false) self.BtnStartGacha.gameObject:SetActiveEx(false) -- 销毁音效 if TempFx then TempFx = self.Transform:LoadPrefab(CS.XGame.ClientConfig:GetString("EpicGahcaSoundClose")) end end -- 传入要抽多少抽 function XUiEpicFashionGacha:OnBtnGachaClick(gachaCount) if not self:CheckIsCanGacha(gachaCount) then return end self.BtnStoryLine:ShowReddot(false) -- 因为红点是用粒子特效做的,动画无法隐藏,必须程序控制抽卡时隐藏红点 self:SetXPostFaicalControllerActive(false) self:PlayGachaAnime1() GachaAllFinishTrigger = true DoGachaTrigger = function (isSkipToshow) self:DoGacha(gachaCount, isSkipToshow) end end -- 出现抽卡特效后再点该按钮才进行下一步 function XUiEpicFashionGacha:OnBtnStartClick() if not self.IsCanGachaClick then return end self.IsCanGachaClick = false if DoGachaTrigger then DoGachaTrigger() DoGachaTrigger = nil end end -- 跳过抽卡演出,直接展示所有奖励 function XUiEpicFashionGacha:OnBtnSkipGachaClick() -- 3种情况, -- 1是还没点击抽卡,在播放动画1 -- 2是还没点击抽卡,准备播放动画2 -- 3是已经点了抽卡正在播放动画2 if self.PlayAnime1 then elseif self.IsCanGacha and not self.PlayAnime2 then if DoGachaTrigger then DoGachaTrigger(true) DoGachaTrigger = nil end elseif not self.IsCanGacha and self.PlayAnime2 then self.PlayAnime2 = false if FinishCbTrigger then FinishCbTrigger(true) FinishCbTrigger = nil end end end function XUiEpicFashionGacha:OnBtnStoryLineClick(isAutoOpen) self:SetSelfActive(false) self:OpenOneChildUi("UiEpicFashionGachaStageLine", self.GachaCfg.FestivalActivityId, self.Panel3D, isAutoOpen) -- 下楼梯动画 self.Panel3D.StoryRoleEnbale.gameObject:SetActiveEx(true) local storyRoleEnbaleDictor = self.Panel3D.StoryRoleEnbale:GetComponent("PlayableDirector") storyRoleEnbaleDictor:Play() self.TimerStoryRoleEnbale = XScheduleManager.ScheduleOnce(function() self.Panel3D.RoleLoop:GetComponent("PlayableDirector"):Play() self.Panel3D.StoryRoleEnbale.gameObject:SetActiveEx(false) end, math.round(storyRoleEnbaleDictor.duration * XScheduleManager.SECOND)) end function XUiEpicFashionGacha:OnDisable() -- 本地缓存skip按钮状态 local isSelect = self.BtnSkip:GetToggleState() XSaveTool.SaveData(SkipBtnKey, isSelect) -- 离开界面时关闭视线跟随 self:SetXPostFaicalControllerActive(false) if self.TimerStoryRoleEnbale then XScheduleManager.UnSchedule(self.TimerStoryRoleEnbale) self.TimerStoryRoleEnbale = nil end if self.LongAnimTimer then XScheduleManager.UnSchedule(self.LongAnimTimer) self.LongAnimTimer = nil end end function XUiEpicFashionGacha:OnDestroy() ShowFashionTrigger = nil ShowCourseRewardTrigger = nil DoGachaTrigger = nil end -- 记录战斗前后数据 function XUiEpicFashionGacha:OnReleaseInst() return { IsGoFight = true } end function XUiEpicFashionGacha:OnResume(data) data = data or {} self.IsGoFight = data.IsGoFight end