forked from endernon/PGRData
789 lines
32 KiB
Lua
789 lines
32 KiB
Lua
|
-- 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
|