local UIRedEnvelopeRainStart = UIViewClass() local RedEnvelopeRainDuration = DataSheetManager.ConstData:GetDataByID("RedEnvelopeRainDuration").IntValue -- 都是毫秒为单位 需要转换成秒 local SmallEnvelopeDropIntermission = DataSheetManager.ConstData:GetDataByID("SmallEnvelopeDropIntermission").IntListValue local LargeEnvelopeDropIntermission = DataSheetManager.ConstData:GetDataByID("LargeEnvelopeDropIntermission").IntListValue local GetRedEnvelopeMaxNum = DataSheetManager.ConstData:GetDataByID("GetRedEnvelopeMaxNum").IntValue local FallSpeed = 12 local UpCanvas = 500 ------------------- function UIRedEnvelopeRainStart:OnCreated() self.smallRedPacketCountDown = 0 self.bigRedPacketCountDown = 0 self.randomChannelList = nil self.redPacketDic = {} self.redPacketPool = {} self.playAnimRedPacketList = {} end function UIRedEnvelopeRainStart:OnOpened(context) self:RegistSystemEvent(EventID.RedEnvelope_StartCountDown, self.RefreshCountDown) self:RegistSystemEvent(EventID.RedEnvelope_RefreshResidueDrawTimes, self.RefreshResidueDrawTimes) -- 打开界面时停止自动寻路 防止抽卡TimeLine和剧情重叠 NotSyncBattleSetter.StopAutoFightPathInTown() --停止现在的寻路 -- 玩家不在队伍中 & 在匹配状态 则取消匹配 if not CTL.Team.IsInTeam() then CTL.TeamMatch.CancelCurMatch() end local x, y = self.obj_RedPacketEnd:GetAnchoredPosition() self.redPacketEndY = y -- 设置层级 UIUtils.SetCanvasSortingOrderByMainCanvas(self.gameObject:GetComponent(typeof(UnityEngine.Canvas)), self.obj_UpCanvas, UpCanvas) -- 关闭奖励提示 MDL.Reward.SetCloseRewardTipShow(true) self:RefreshCountDown() end function UIRedEnvelopeRainStart:OnClosed() -- 打开奖励提示 MDL.Reward.SetCloseRewardTipShow(false, true) end function UIRedEnvelopeRainStart:OnButtonClicked(comp) for envelopId, item in pairs(self.redPacketDic) do if item.btn_RedPacket == comp then self.redPacketDic[envelopId] = nil item.obj_Anim:PlayAnim() table.insert(self.playAnimRedPacketList, {item = item, timestamp = 0, isPlayEffect = false}) self:StartRepeatFunc(self.RecyclePlayAnimItem, 0.1) MDL.RedEnvelopRain.ReceiveRedEnvelopReward(envelopId) end end end -------------------- function UIRedEnvelopeRainStart:RefreshCountDown() self:RecycleAllRedPacketItem() self.bigEnvelopeInfo, self.smallEnvelopeInfo = MDL.RedEnvelopRain.GetEnvelopeInfo() self.bigEnvelopeIndex, self.smallEnvelopeIndex = 1, 1 -- 正在下的红包index self:StartRepeatFunc(self.OnUpdateCountDownTime, 0.02) self:RefreshResidueDrawTimes() end function UIRedEnvelopeRainStart:RefreshResidueDrawTimes() local residueDrawTimes = MDL.RedEnvelopRain.GetResidueDrawTimes() UIUtils.SetLabel(self.txt_Times, string.FormatByIdsId(Const_IDS.IDS_RedEnvelopeRain_RemainingTimes, residueDrawTimes)) -- 次数结束 if residueDrawTimes <= 0 then CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_RedEnvelopeRain_Collected, GetRedEnvelopeMaxNum - MDL.RedEnvelopRain.GetResidueDrawTimes())) self:CloseView(true) end end function UIRedEnvelopeRainStart:OnUpdateCountDownTime(deltaTime, timeSinceUpdate) local residueTime = MDL.RedEnvelopRain.GetRemainSecond() if residueTime > RedEnvelopeRainDuration then residueTime = RedEnvelopeRainDuration end residueTime = residueTime - timeSinceUpdate -- 设置倒计时 UIUtils.SetLabel(self.txt_CountDown, UTL.Time.FormatTimeSeconds(residueTime)) -- 下落红包 self:FallRedPacket(deltaTime) -- 更新红包位置 self:UpdateRedPacketPosition() -- 倒计时结束 if residueTime <= 0 then CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_RedEnvelopeRain_Collected, GetRedEnvelopeMaxNum - MDL.RedEnvelopRain.GetResidueDrawTimes())) self:CloseView(true) end end function UIRedEnvelopeRainStart:FallRedPacket(deltaTime) self.bigRedPacketCountDown = self.bigRedPacketCountDown - deltaTime if self.bigRedPacketCountDown <= 0 and #self.bigEnvelopeInfo >= self.bigEnvelopeIndex then local info = self.bigEnvelopeInfo[self.bigEnvelopeIndex] self.bigEnvelopeIndex = self.bigEnvelopeIndex + 1 local item = self:GetRedPacketItem() item.obj_Anim:GetComponent(typeof(UnityEngine.CanvasGroup)).alpha = 1 item.obj_RedPacketState:SetState(0) item.gameObject.transform:SetPosition(self:RandomRedPacketChannel():GetPosition()) self.redPacketDic[info.envelopId] = item if #self.bigEnvelopeInfo >= self.bigEnvelopeIndex then self.bigRedPacketCountDown = self:CalculateRedPacketIntervalByEnvelopeType(MDL.RedEnvelopRain.EnvelopeType.Big) end end self.smallRedPacketCountDown = self.smallRedPacketCountDown - deltaTime if self.smallRedPacketCountDown <= 0 and #self.smallEnvelopeInfo >= self.smallEnvelopeIndex then local info = self.smallEnvelopeInfo[self.smallEnvelopeIndex] self.smallEnvelopeIndex = self.smallEnvelopeIndex + 1 local item = self:GetRedPacketItem() item.obj_Anim:GetComponent(typeof(UnityEngine.CanvasGroup)).alpha = 1 item.obj_RedPacketState:SetState(1) item.gameObject.transform:SetPosition(self:RandomRedPacketChannel():GetPosition()) self.redPacketDic[info.envelopId] = item if #self.smallEnvelopeInfo >= self.smallEnvelopeIndex then self.smallRedPacketCountDown = self:CalculateRedPacketIntervalByEnvelopeType(MDL.RedEnvelopRain.EnvelopeType.Small) end end end function UIRedEnvelopeRainStart:UpdateRedPacketPosition() local removeToPool = {} for envelopId, item in pairs(self.redPacketDic) do local x, y = item.gameObject.transform:GetAnchoredPosition() if y < self.redPacketEndY then table.insert(removeToPool, envelopId) else item.gameObject.transform:SetAnchoredPosition(x, y - FallSpeed) end end -- 移除红包到屏幕外 for _, envelopId in ipairs(removeToPool) do local item = self.redPacketDic[envelopId] self.redPacketDic[envelopId] = nil UIUtils.SetActive(item.gameObject, false) table.insert(self.redPacketPool, item) end end function UIRedEnvelopeRainStart:CalculateRedPacketIntervalByEnvelopeType(envelopeType) if envelopeType == MDL.RedEnvelopRain.EnvelopeType.Small then return math.random(SmallEnvelopeDropIntermission[1], SmallEnvelopeDropIntermission[2]) / 1000 elseif envelopeType == MDL.RedEnvelopRain.EnvelopeType.Big then return math.random(LargeEnvelopeDropIntermission[1], LargeEnvelopeDropIntermission[2]) / 1000 end end function UIRedEnvelopeRainStart:RandomRedPacketChannel() if not self.randomChannelList then self.randomChannelList = {} for i, _ in ipairs(self.obj_RedPacketChannel) do table.insert(self.randomChannelList, i) end end local index = math.random(3, #self.randomChannelList) -- index = 2 是上上次随机的位置, index = 1 是上次随机位置,每一次随机都需要将上上随机的位置放入池子重随 self.randomChannelList[2], self.randomChannelList[index] = self.randomChannelList[index], self.randomChannelList[2] self.randomChannelList[1], self.randomChannelList[2] = self.randomChannelList[2], self.randomChannelList[1] return self.obj_RedPacketChannel[self.randomChannelList[1]] end function UIRedEnvelopeRainStart:GetRedPacketItem() local item = table.remove(self.redPacketPool) if not item then item = self:InstantiateCollection(self.obj_RedPacketRoot, self.obj_RedPacket.gameObject) end UIUtils.SetActive(item.gameObject, true) return item end function UIRedEnvelopeRainStart:RecyclePlayAnimItem(deltaTime, timeSinceUpdate) for i = #self.playAnimRedPacketList, 1, -1 do local data = self.playAnimRedPacketList[i] data.timestamp = data.timestamp + deltaTime if data.timestamp > 0.4 and not data.isPlayEffect then data.item.effect_Disappear:PlayUIEffect() data.isPlayEffect = true elseif data.timestamp > 1 then data.item.effect_Disappear:StopUIEffect() UIUtils.SetActive(data.item.gameObject, false) table.remove(self.playAnimRedPacketList, i) table.insert(self.redPacketPool, data.item) end end if #self.playAnimRedPacketList == 0 then self:StopRepeatFunc(self.RecyclePlayAnimItem) end end function UIRedEnvelopeRainStart:RecycleAllRedPacketItem() -- 暂停计时器 self:StopRepeatFunc(self.RecyclePlayAnimItem) self:StopRepeatFunc(self.OnUpdateCountDownTime) -- 清空正在播放动画的红包 for _, item in ipairs(self.playAnimRedPacketList) do item.effect_Disappear:StopUIEffect() UIUtils.SetActive(item.gameObject, false) table.insert(self.redPacketPool, item) end self.playAnimRedPacketList = {} -- 清空下落的红包 for envelopId, item in pairs(self.redPacketDic) do self.redPacketDic[envelopId] = nil item.effect_Disappear:StopUIEffect() UIUtils.SetActive(item.gameObject, false) table.insert(self.redPacketPool, item) end end return UIRedEnvelopeRainStart