local UIPlayerGuideDialogue = UIViewClass() local SPACE = 10 local HEDDSPACE = 110 local RIGHTHEADOFFSET = 80 ---根据手指图片大小计算的经验值 local LEFTHEADOFFSET = 100 local MAXCLICKCOUNT = 5 local SCALEMAGNIFY = 5 function UIPlayerGuideDialogue:OnOpened(context) --先设置一个0.2s的mask 防止有些gameobject还没有生成 比如cell self:SetPushStyle(LuaConst.PushStyleEnum.CLOSENOTRECOVER) self.guideData = context.guideData self.clickCount = 0 self.backdrop.gameObject:SetActive(false) self.cleardrop.gameObject:SetActive(false) self.mask.gameObject:SetActive(true) self.skip_btn.gameObject:SetActive(false) self.state:SetState(4) self.square.gameObject:SetActive(false) self.round.gameObject:SetActive(false) self.roundNew.gameObject:SetActive(false) self.squareNew.gameObject:SetActive(false) self.group_PlayerGuideDialogue.gameObject:SetActive(false) self.initGuideDialoguePosx , self.initGuideDialoguePosy = self.group_PlayerGuideDialogue:GetAnchoredPosition() self.curMask = nil if self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ActivityID then self.activityIndex = UIManager.CallViewFunction(self.guideData.ButtonContainer, "MoveToId", tonumber(self.guideData.PushButton2)) elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroChangeId then self.targetTrans = UIManager.CallViewFunction(self.guideData.ButtonContainer, "GetCell", tonumber(self.guideData.PushButton2)) end self:RegistSystemEvent(EventID.ChildTaskFinish, self.CheckFinishGuideByCompleteCondition) self:RegistSystemEvent(EventID.UI_OnOrientationChange,self.OnOrientationChange) self:StartRepeatFunc(self.OnUpdateFun, 0.2) end function UIPlayerGuideDialogue:InitBGMask() if self.guideData.ScreenEffect == 0 then --暗遮罩 self.backdrop.gameObject:SetActive(false) self.cleardrop.gameObject:SetActive(true) self.backdrop = self.cleardrop elseif self.guideData.ScreenEffect == 4 then --透明遮罩 self.backdrop.gameObject:SetActive(false) self.cleardrop.gameObject:SetActive(true) else--透明背景遮罩 self.backdrop.gameObject:SetActive(true) self.cleardrop.gameObject:SetActive(false) end self:InitClickStyle() self.backdrop.ClickCallBack = function () --点击任何区域的回调 self:OnClickBgCb() end self.backdrop.ClickObjCallBack = function () -- 点击目标节点的回调 self:OnClickObjCb() end --只有完成任务引导类型时,加上此点击事件检测 if self.guideData.GuideType == 3 then self.cleardrop.ClickCallBack = function () -- 点击任何区域的回调 if not self.notDoClickClearBgCb then self:OnClickClearBgCb() else self.notDoClickClearBgCb=false end end --点击目标区域时,不弹出任务引导 self.cleardrop.ClickObjCallBack = function () -- 点击任何区域的回调 self.notDoClickClearBgCb=true end end self:SetPushStyle(LuaConst.PushStyleEnum.CLOSENOTRECOVER) end function UIPlayerGuideDialogue:OnUpdateFun() self:InitBGMask() local obj = nil local viewTrans = UIManager.FindViewTransform(self.guideData.ButtonContainer, nil, true) if viewTrans == nil then self:StopRepeatFunc(self.OnUpdateFun) logging.error(LTAG.LOG," 当前引导时机错误 ",self.guideData.ButtonContainer) CTL.PlayerGuide.FinishGuide(self.guideData) return end if string.isNilOrEmpty(self.guideData.PushButton) then self:SetHeadPos() else --查找目标节点 if self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ObjNode or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroSelectId then obj = UTL.UIRender.FindInChildren(viewTrans, self.guideData.PushButton) elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.LoopScrollRect then obj = UTL.UIRender.FindInChildren(viewTrans, self.guideData.PushButton) if obj == nil then CTL.PlayerGuide.FinishGuide(self.guideData) return end if not obj.gameObject.activeInHierarchy then self:CloseView() return end local loopScrollRect = obj:GetComponent(typeof(UnityEngine.UI.LoopScrollRect)) local index = tonumber(self.guideData.PushButton2)-1 if loopScrollRect.content.childCount > index then obj = loopScrollRect.content:GetChild(index) end elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ActivityID then obj = viewTrans:Find("Panel_ActivitiesMain/condition_Activities/group_Activities/group_Scroll/Content"):GetChild(self.activityIndex - 1) obj = UTL.UIRender.FindInChildren(obj.gameObject.transform,self.guideData.PushButton) elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroChangeId then if self.targetTrans then obj = UTL.UIRender.FindInChildren(self.targetTrans, self.guideData.PushButton) else CTL.PlayerGuide.FinishGuide(self.guideData, true) return end elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.LoopScrollRectBtn then local names = string.split(self.guideData.PushButton,",") local loopName = names[1] local btnName = names[2] obj = UTL.UIRender.FindInChildren(viewTrans, loopName) local loopScrollRect = obj:GetComponent(typeof(UnityEngine.UI.LoopScrollRect)) if loopScrollRect.content.childCount > tonumber(self.guideData.PushButton2)-1 then obj = loopScrollRect.content:GetChild(tonumber(self.guideData.PushButton2)-1) obj = UTL.UIRender.FindInChildren(obj.gameObject.transform,btnName) else obj = nil end elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroShowPos then if MDL.Player.HeroIsLineUp(tonumber(self.guideData.PushButton2)) then obj = UTL.UIRender.FindInChildren(viewTrans, "toggle_2") else CTL.PlayerGuide.FinishGuide(self.guideData) return end elseif self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ToggleGroup then obj = UTL.UIRender.FindInChildren(viewTrans, self.guideData.PushButton) if obj == nil then CTL.PlayerGuide.FinishGuide(self.guideData) end if not obj.gameObject.activeInHierarchy then self:CloseView() return end local toggleGroup = obj:GetComponent(typeof(UIToggleGroup)) if toggleGroup then local index = tonumber(self.guideData.PushButton2)-1 obj = toggleGroup:GetToggle(index).transform end end if obj == nil or not obj.gameObject.activeInHierarchy then logging.error(LTAG.LOG," 引导查找结点错误 ",self.guideData.ButtonContainer,self.guideData.PushButton,self.guideData.PushButtonType) CTL.PlayerGuide.FinishGuide(self.guideData) return end self.backdrop.clickGameObj = obj.gameObject self:InitMask(self.guideData,obj) end self:InitHead(self.guideData) LevelManager.PauseLevel(self.guideData.IsUIStop ~= 0 ) self:StopRepeatFunc(self.OnUpdateFun) end function UIPlayerGuideDialogue:PlayEffect() if self.guideData.PointDirection ~= CTL.PlayerGuide.QuadrantType.NONE then self.effect:PlayUIEffect(ConstAssetPathConfig.Pattern12,-1) local anchorPosX, anchorPosY = self.curMask.transform:GetAnchoredPosition() self.effect.transform:SetAnchoredPosition(anchorPosX, anchorPosY) self.focusEffect.transform:SetAnchoredPosition(anchorPosX, anchorPosY) end end function UIPlayerGuideDialogue:InitMask(guideData,obj) local sizeX, sizeY = obj.transform:GetSizeDelta() local mask = nil if guideData.ScreenEffectRange and string.len(guideData.ScreenEffectRange) > 0 then local values = string.split( guideData.ScreenEffectRange,",") sizeX = tonumber(values[1]) sizeY = tonumber(values[2]) end if guideData.ScreenEffect == 1 then mask = self.round.transform self.square.gameObject:SetActive(false) self.round.gameObject:SetActive(true) elseif guideData.ScreenEffect == 2 then mask = self.square.transform self.square.gameObject:SetActive(true) self.round.gameObject:SetActive(false) else self.state:SetState(4) self.square.gameObject:SetActive(false) self.round.gameObject:SetActive(false) mask = self.round.transform end mask:SetParent(obj, false) -- 设置mask位置 与目标位置一样 mask:SetParent(self.gameObject.transform, true) mask:SetAsFirstSibling() mask:SetSizeDelta(sizeX, sizeY) self.curMask = mask self:InitPostion(mask) if guideData.ScreenEffect == 0 then self:PlayEffect() self.mask.gameObject:SetActive(false) elseif guideData.ScreenEffect == 3 or guideData.ScreenEffect==4 then self.mask.gameObject:SetActive(false) self.cleardrop.clickGameObj = obj.gameObject else local x, y = self.curMask:GetSizeDelta() --播放聚焦动画 if guideData.ScreenEffect == 1 then self.roundImage.gameObject:SetActive(true) self.roundImage.transform:SetSizeDelta(x * 1.2, y * 1.2) self.roundImage.transform:SetPosition (self.curMask.position.x,self.curMask.position.y) self.animationId = self:PlayUIAnimation("MaskZoomRound",true) self.animationId = self:PlayUIAnimation("MaskZoomRound1",true) else self.squareImage.gameObject:SetActive(true) self.squareImage.transform:SetSizeDelta(x * 1.05, y * 1.2) self.squareImage.transform:SetPosition (self.curMask.position.x,self.curMask.position.y) self.animationId = self:PlayUIAnimation("MaskZoomSquare",true) self.animationId = self:PlayUIAnimation("MaskZoomSquare1",true) end if self.HandObj then UIUtils.SetActive(self.HandObj, true) end UIUtils.SetActive(self.mask, false) end end function UIPlayerGuideDialogue:OnUIAnimationStoped(id) --动画结束 显示手指 聚焦特效等 if self.animationId == id then self:PlayEffect() if self.guideData.ScreenEffect == 1 then --do nothing elseif self.guideData.ScreenEffect == 2 then --do nothing elseif self.guideData.ScreenEffect == 3 then self.isPlayingGuideOfMission=false self.roundNew.gameObject:SetActive(false) elseif self.guideData.ScreenEffect == 4 then self.isPlayingGuideOfMission=false self.squareNew.gameObject:SetActive(false) end end end function UIPlayerGuideDialogue:InitHead(guideData) if guideData.HeadPic and string.len(guideData.HeadPic) > 0 then local path = ConstAssetPathConfig.path1..guideData.HeadPic..".png" UIUtils.SetImageByAssetBundle(self.img_HeroHead, path) UIUtils.SetLabelText(self.txt_PlayerGuideDialogue,Const_IDS[guideData.Explain]) CTL.Sound.CheckAndPlay(guideData.Explain) self.group_PlayerGuideDialogue.gameObject:SetActive(true) else self.group_PlayerGuideDialogue.gameObject:SetActive(false) end end function UIPlayerGuideDialogue:OnClickObjCb() --任务完成的引导类型走任务结束关闭,其他的走点击关闭 if self.guideData.GuideType ~= 3 then CTL.PlayerGuide.FinishGuide(self.guideData) self.backdrop.ClickCallBack = nil end end function UIPlayerGuideDialogue:OnClickBgCb() self.clickCount = self.clickCount + 1 --增加是否可跳过的条件判断 local isCanSkip=CTL.PlayerGuide.IsCanSkip(self.guideData.ID,self.guideData.ChildID) if self.clickCount >= MAXCLICKCOUNT and isCanSkip then self.skip_btn.gameObject:SetActive(true) end if self.guideData.SelectEffect ~= 0 then self.focusEffect:PlayUIEffect(ConstAssetPathConfig.AssetPath164,-1) end end function UIPlayerGuideDialogue:OnClickClearBgCb() --任务完成类型的强制引导使用特殊的表现 if self.guideData.GuideType == 3 then --检查是否到了CD时间 local isCD self.lastClickMissionGuideTime,isCD=self:CheckButtonCD(self.lastClickMissionGuideTime,self:GetCompulsiveGuideIntervalTime()) if not isCD then return end self:PlayGuideOfMissionCompleteShow() return end end function UIPlayerGuideDialogue:GetCompulsiveGuideIntervalTime() if self.CompulsiveGuideIntervalTime==nil then self.CompulsiveGuideIntervalTime=DataSheetManager.ConstData:GetDataByID("CompulsiveGuideIntervalTime").IntValue end return self.CompulsiveGuideIntervalTime end function UIPlayerGuideDialogue:CheckButtonCD(cdtime,timeInterval) local isCanChange=false --1秒cd if cdtime ==nil then cdtime=UTL.Time.GetServerTimestamp() isCanChange=true else local currentTime=UTL.Time.GetServerTimestamp() --1秒cd if (currentTime- cdtime) >timeInterval then cdtime=currentTime isCanChange=true end end return cdtime,isCanChange end function UIPlayerGuideDialogue:InitPostion(mask) if self.guideData.PointPosition and string.len(self.guideData.PointPosition)>0 then local values = string.split( self.guideData.PointPosition,",") local anchorPosX, anchorPosY = mask:GetAnchoredPosition() mask:SetAnchoredPosition(anchorPosX + tonumber(values[1]) ,anchorPosY + tonumber(values[2])) end local anchorPosX, anchorPosY = mask:GetAnchoredPosition() local handSizeX = self.HandDownLelf.transform:GetSizeDelta() local headInfoSizeX = self.group_PlayerGuideDialogue:GetSizeDelta() local offset = {0,0} if self.guideData.ExplainPosition and string.len(self.guideData.ExplainPosition) > 0 then local values = string.split( self.guideData.ExplainPosition,",") offset = {tonumber(values[1]), tonumber(values[2])} end self.HandObj = nil if self.guideData.PointDirection == CTL.PlayerGuide.QuadrantType.RT then self.state:SetState(2) self.HandDownLelf.transform:SetAnchoredPosition(anchorPosX + handSizeX/2 + SPACE,anchorPosY - RIGHTHEADOFFSET) self.group_PlayerGuideDialogue:SetAnchoredPosition(anchorPosX + handSizeX + HEDDSPACE + headInfoSizeX/2 + offset[1] ,anchorPosY - RIGHTHEADOFFSET + offset[2]) self.curPlayId = self:PlayUIAnimation("ArrowJumpAll1") self.HandObj = self.HandDownLelf elseif self.guideData.PointDirection == CTL.PlayerGuide.QuadrantType.RB then self.state:SetState(1) self.HandDownRight.transform:SetAnchoredPosition(anchorPosX - handSizeX/2 - SPACE,anchorPosY + RIGHTHEADOFFSET) self.group_PlayerGuideDialogue:SetAnchoredPosition(anchorPosX - handSizeX - HEDDSPACE - headInfoSizeX/2 + offset[1], anchorPosY + RIGHTHEADOFFSET + offset[2]) self.curPlayId = self:PlayUIAnimation("ArrowJumpAll4") self.HandObj = self.HandDownRight elseif self.guideData.PointDirection == CTL.PlayerGuide.QuadrantType.LT then self.state:SetState(3) self.HandDownBottom.transform:SetAnchoredPosition(anchorPosX + handSizeX/2 + SPACE,anchorPosY+ LEFTHEADOFFSET) self.group_PlayerGuideDialogue:SetAnchoredPosition(anchorPosX + handSizeX + HEDDSPACE + headInfoSizeX/2+ offset[1], anchorPosY+ LEFTHEADOFFSET + offset[2]) self.curPlayId = self:PlayUIAnimation("ArrowJumpAll2") self.HandObj = self.HandDownBottom elseif self.guideData.PointDirection == CTL.PlayerGuide.QuadrantType.LB then self.state:SetState(0) self.HandDownTop.transform:SetAnchoredPosition(anchorPosX - handSizeX/2 - SPACE,anchorPosY - LEFTHEADOFFSET) self.group_PlayerGuideDialogue:SetAnchoredPosition(anchorPosX - handSizeX - HEDDSPACE - headInfoSizeX/2+ offset[1], anchorPosY - LEFTHEADOFFSET + offset[2]) self.curPlayId = self:PlayUIAnimation("ArrowJumpAll3") self.HandObj = self.HandDownTop elseif self.guideData.PointDirection == CTL.PlayerGuide.QuadrantType.NONE then self:SetHeadPos() self.state:SetState(4) end end function UIPlayerGuideDialogue:SetHeadPos( ) local anchorPosX, anchorPosY = self.group_PlayerGuideDialogue:GetAnchoredPosition() local offset = {0,0} if self.guideData.ExplainPosition and string.len(self.guideData.ExplainPosition) > 0 then local values = string.split( self.guideData.ExplainPosition,",") offset = {tonumber(values[1]), tonumber(values[2])} end self.group_PlayerGuideDialogue:SetAnchoredPosition(anchorPosX + offset[1], anchorPosY + offset[2]) end function UIPlayerGuideDialogue:InitClickStyle() if self.guideData.GuideType == 0 then -- 强制引导 需要找到节点 只是区分cell 和 btn if self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ObjNode or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.LoopScrollRectBtn or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ActivityID or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroSelectId or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroShowPos or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ToggleGroup or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroChangeId then self.backdrop.guideType = 1 else self.backdrop.guideType = 2 -- 强制引导 cell end elseif self.guideData.GuideType == 1 then --半强制引导 可以点击任何响应buttonclick 的事件 self.backdrop.guideType = 3 elseif self.guideData.GuideType == 2 then --非强制引导 点击任何区域 引导完成 self.backdrop.guideType = 4 elseif self.guideData.GuideType == 3 then -- 强制引导 需要找到节点 只是区分cell 和 btn if self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ObjNode or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.LoopScrollRectBtn or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ActivityID or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroSelectId or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.HeroShowPos or self.guideData.PushButtonType == CTL.PlayerGuide.ActionType.ToggleGroup then self.cleardrop.guideType = 1 else self.cleardrop.guideType = 2 -- 强制引导 cell end end end function UIPlayerGuideDialogue:OnButtonClicked(comp) if comp == self.skip_btn then CTL.PlayerGuide.FinishGuide(self.guideData,true) end end function UIPlayerGuideDialogue:CheckFinishGuideByCompleteCondition() CTL.PlayerGuide.FinishGuideByCompleteCondition(self.guideData) end --播放任务完成的引导的表现 function UIPlayerGuideDialogue:PlayGuideOfMissionCompleteShow() if self.guideData.GuideType == 3 then --没有播放的时候才会生效 if not self.isPlayingGuideOfMission then local sizeX, sizeY = self.backdrop.clickGameObj.transform:GetSizeDelta() if self.guideData.ScreenEffectRange and string.len(self.guideData.ScreenEffectRange) > 0 then local values = string.split( self.guideData.ScreenEffectRange,",") sizeX = tonumber(values[1]) sizeY = tonumber(values[2]) end self.isPlayingGuideOfMission=true --播放一些动画表现 if self.guideData.ScreenEffect ==3 then self.roundNew.gameObject:SetActive(true) self.roundNew.transform:SetPosition(0,0,0) self.roundNew.transform:SetParent(self.backdrop.clickGameObj.transform, false) -- 设置位置 与目标位置一样 self.roundNew.transform:SetParent(self.gameObject.transform, true) self.roundNew.transform:SetAsFirstSibling() self.roundNew.transform:SetSizeDelta(sizeX* 1.2, sizeY* 1.2) if self.guideData.PointPosition and string.len(self.guideData.PointPosition)>0 then local values = string.split( self.guideData.PointPosition,",") local anchorPosX, anchorPosY = self.squareNew.transform:GetAnchoredPosition() self.roundNew.transform:SetAnchoredPosition(anchorPosX + tonumber(values[1]) ,anchorPosY + tonumber(values[2])) end self.animationId = self:PlayUIAnimation("NoMaskZoomRound",true) elseif self.guideData.ScreenEffect ==4 then self.squareNew.gameObject:SetActive(true) self.squareNew.transform:SetPosition(0,0,0) self.squareNew.transform:SetParent(self.backdrop.clickGameObj.transform, false) -- 设置位置 与目标位置一样 self.squareNew.transform:SetParent(self.gameObject.transform, true) self.squareNew.transform:SetAsFirstSibling() self.squareNew.transform:SetSizeDelta(sizeX* 1.05, sizeY* 1.2) if self.guideData.PointPosition and string.len(self.guideData.PointPosition)>0 then local values = string.split( self.guideData.PointPosition,",") local anchorPosX, anchorPosY = self.squareNew.transform:GetAnchoredPosition() self.squareNew.transform:SetAnchoredPosition(anchorPosX + tonumber(values[1]) ,anchorPosY + tonumber(values[2])) end self.animationId = self:PlayUIAnimation("NoMaskZoomSquare",true) end end end end function UIPlayerGuideDialogue:OnOrientationChange() if self.backdrop.clickGameObj then self.roundImage.transform:SetAnchoredPosition(0,0) self.squareImage.transform:SetAnchoredPosition(0,0) self.group_PlayerGuideDialogue:SetAnchoredPosition(self.initGuideDialoguePosx , self.initGuideDialoguePosy) if self.curMask then self.curMask:SetAnchoredPosition(0,0) end if self.curPlayId then self:StopUIAnimation(self.curPlayId) end self:InitMask(self.guideData,self.backdrop.clickGameObj.transform) end end return UIPlayerGuideDialogue