local XUiPanelFurnitureLike = require("XUi/XUiDormSecond/XUiPanelFurnitureLike") local XUiDormCaress = XClass(XLuaBehaviour, "XUiDormCaress") function XUiDormCaress:Ctor(uiRoot, ui) self.GameObject = ui.gameObject self.Transform = ui.transform self.UiRoot = uiRoot self.OnBtnBackClickCb = function() self:OnBtnBackClick() end XTool.InitUiObject(self) self:RefreshData() self:InitAddListen() self:InitTabGroup() self.FurnitureLike = XUiPanelFurnitureLike.New(uiRoot, self.PanelFurnitureLike) end function XUiDormCaress:InitAddListen() self.UiRoot:RegisterClickEvent(self.BtnBack, self.OnBtnBackClickCb) end function XUiDormCaress:OnBtnBackClick() self.UiRoot:OnCloseedCaress() XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_HIDE) XDataCenter.DormManager.SetInTouch(false) XDataCenter.DormManager.GetNextShowEvent() end function XUiDormCaress:InitTabGroup() self.BtnList = {} table.insert(self.BtnList, self.BtnCaress) table.insert(self.BtnList, self.BtnGun) table.insert(self.BtnList, self.BtnPlay) self.PanelParticularCaressGroup:Init(self.BtnList, function(index) self.CurTouchState = index end) end function XUiDormCaress:Show(characterId, curRoomId) self.IsTouchCD = false self:RefreshData() self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchDesc") self.CharacterId = characterId self.Camera = XHomeSceneManager.GetSceneCamera() self.CurSelectCharacter = XHomeCharManager.GetSelectCharacter() self.FurnitureLike:Refresh(characterId, curRoomId) self.FurnitureLike.GameObject:SetActiveEx(true) -- 设置默认开启 self.PanelParticularCaressGroup:SelectIndex(XDormConfig.TouchState.Touch) -- 拉近摄像头 local cameraController = XHomeSceneManager.GetSceneCameraController() self.TargetAngleX = cameraController.TargetAngleX self.TargetAngleY = cameraController.TargetAngleY self.MinDistance = cameraController.MinDistance self.Distance = cameraController.Distance self.AllowZoom = cameraController.AllowZoom if not XTool.UObjIsNil(cameraController) then cameraController:SetWorldOffset(CS.UnityEngine.Vector2(0, -0.39)) cameraController:SetTartAngle(CS.UnityEngine.Vector2(self.CurSelectCharacter.Transform.eulerAngles.y - 180, 10)) cameraController:SetMinDistance(XDormConfig.DRAFT_DIS) XCameraHelper.SetCameraTarget(cameraController, self.CurSelectCharacter.Transform, XDormConfig.DRAFT_DIS) CS.XDofManager.Instance:SetDormitoryDof(self.CurSelectCharacter.Transform) cameraController.AllowZoom = false end self:ReqFondleData() XEventManager.DispatchEvent(XEventId.EVENT_CARESS_SHOW) end function XUiDormCaress:ReqFondleData() self:RemoveTimer() XDataCenter.DormManager.GetDormFondleData(self.CharacterId, function(fondleData) self.FondleConfig = XDormConfig.GetCharacterFondleByCharId(self.CharacterId) self.FondleData = fondleData self:SetRecoveryInfo(fondleData.LeftCount, fondleData.LastRecoveryTime) self.PanelParticularCaress.gameObject:SetActiveEx(true) end) end function XUiDormCaress:SetRecoveryInfo(leftCount, recoveryTime) self.PanelTimeOut.gameObject:SetActiveEx(leftCount < self.FondleConfig.MaxCount) self.TxtTouchCount.text = CS.XTextManager.GetText("DormFondleCount", leftCount, self.FondleConfig.MaxCount) if leftCount >= self.FondleConfig.MaxCount then return end local now = XTime.GetServerNowTimestamp() local leftTime = recoveryTime + self.FondleConfig.RecoveryTime - now local timeString = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.CHALLENGE) self.TxtTimeOut.text = CS.XTextManager.GetText("DormFondleRecovey", timeString) self:RemoveTimer()--临时处理防止定时器注销失败问题 self:RemoveTimer() --临时处理防止定时器Remove失败 self.TimerId = XScheduleManager.ScheduleForever(function() if XTool.UObjIsNil(self.Transform) or not self.GameObject.activeSelf then return end leftTime = leftTime - 1 if leftTime <= 0 then self:ReqFondleData() return end timeString = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.CHALLENGE) self.TxtTimeOut.text = CS.XTextManager.GetText("DormFondleRecovey", timeString) end, 1000) end function XUiDormCaress:RemoveTimer() if self.TimerId then XScheduleManager.UnSchedule(self.TimerId) self.TimerId = nil end end function XUiDormCaress:RemoveAnimaTimer() if self.AnimaTimer then XScheduleManager.UnSchedule(self.AnimaTimer) self.AnimaTimer = nil end end function XUiDormCaress:OnClose(curDormId) self.FondleData = {} self:RemoveTimer() self:RemoveAnimaTimer() self:RefreshData() self.PanelParticularCaress.gameObject:SetActiveEx(false) -- 拉远摄像头 local cameraController = XHomeSceneManager.GetSceneCameraController() if not XTool.UObjIsNil(cameraController) then cameraController:SetWorldOffset(CS.UnityEngine.Vector2(0, 0)) cameraController:SetTartAngle(CS.UnityEngine.Vector2(self.TargetAngleX, self.TargetAngleY)) local curDormTransform = XHomeDormManager.GetRoom(curDormId).Transform cameraController:SetMinDistance(self.MinDistance) XCameraHelper.SetCameraTarget(cameraController, curDormTransform, self.Distance) CS.XDofManager.Instance:SetDormitoryDof(nil) cameraController.AllowZoom = self.AllowZoom end end function XUiDormCaress:Update() if XTool.UObjIsNil(self.Transform) or not self.GameObject.activeSelf then return end local point = self:GetPisont() if not XTool.UObjIsNil(self.Camera) and point then local ray = self.Camera:ScreenPointToRay(point) local layerMask = CS.UnityEngine.LayerMask.GetMask("HomeCharacter") if layerMask then local rect, hit = ray:RayCast(layerMask) if rect and hit and self.CurSelectCharacter.Transform == hit.transform.parent.transform then if not self:JudgeLeftCount() then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hate, self.CharacterId, nil) end self:UpdateFondleInfo(point) end end end end function XUiDormCaress:GetPisont() local screenPoint local platform = CS.UnityEngine.Application.platform local runtimePlatform = CS.UnityEngine.RuntimePlatform if platform == runtimePlatform.WindowsEditor or platform == runtimePlatform.WindowsPlayer then if self.CurTouchState == XDormConfig.TouchState.WaterGun then if CS.UnityEngine.Input.GetMouseButtonDown(0) then screenPoint = CS.UnityEngine.Vector3(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y, 0) elseif CS.UnityEngine.Input.GetMouseButtonUp(0) then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil) end else if CS.UnityEngine.Input.GetMouseButtonDown(0) then self:RefreshData() elseif CS.UnityEngine.Input.GetMouseButtonUp(0) then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil) end if CS.UnityEngine.Input.GetMouseButton(0) then screenPoint = CS.UnityEngine.Vector3(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y, 0) end end else if CS.UnityEngine.Input.touchCount > 0 then if self.CurTouchState == XDormConfig.TouchState.WaterGun then if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Began then local p = CS.UnityEngine.Input.GetTouch(0).position screenPoint = CS.UnityEngine.Vector3(p.x, p.y, 0) elseif CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Ended then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil) end else if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Began then self:RefreshData() elseif CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Ended then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil) end if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Stationary or CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Moved then local p = CS.UnityEngine.Input.GetTouch(0).position screenPoint = CS.UnityEngine.Vector3(p.x, p.y, 0) end end end end return screenPoint end function XUiDormCaress:RefreshData() self.TouchLength = 0 self.PlayTime = 0 self.LastPoint = nil self.PlayTimer = 0 end -- 每帧更新爱抚滑动详情 function XUiDormCaress:UpdateFondleInfo(point) if self.CurTouchState == XDormConfig.TouchState.Touch then -- 判断是否还有次数 if not self:JudgeLeftCount() then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.TouchHate, self.CharacterId, point) return end -- 判断是否在CD中 if self.IsTouchCD then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.Touch, self.CharacterId, point) return end if self.LastPoint then local dis = (self.LastPoint - point).sqrMagnitude self.TouchLength = self.TouchLength + dis end self.LastPoint = point -- 判断前置长度 local propLength = XDormConfig.TOUCH_LENGTH * XDormConfig.TOUCH_PROP local propNum = self.TouchLength / XDormConfig.TOUCH_LENGTH if propNum < 0 then propNum = 0 elseif propNum > 1 then propNum = 1 end if self.TouchLength < propLength then XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.Touch, self.CharacterId, point, propNum) return end -- 达到长度请求抚摸 if self.TouchLength >= XDormConfig.TOUCH_LENGTH then self:RefreshData() self:ReqFondle() end XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Touch, self.CharacterId, point, propNum) elseif self.CurTouchState == XDormConfig.TouchState.WaterGun then self:ReqFondle() XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.WaterGun, self.CharacterId, point) elseif self.CurTouchState == XDormConfig.TouchState.Play then self.PlayTimer = self.PlayTimer + CS.UnityEngine.Time.deltaTime if self.PlayTimer >= XDormConfig.PLAY_TIME then self:RefreshData() self:ReqFondle() end XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Play, self.CharacterId, point) end end -- 请求爱抚 function XUiDormCaress:ReqFondle() -- 次数不足 if self.FondleData.LeftCount <= 0 then return end XDataCenter.DormManager.DoFondleReq(self.CharacterId, self.CurTouchState, function() local state = XDormConfig.TouchState.Hide if self.CurTouchState == XDormConfig.TouchState.Touch then state = XDormConfig.TouchState.TouchSuccess elseif self.CurTouchState == XDormConfig.TouchState.WaterGun then state = XDormConfig.TouchState.WaterGunSuccess elseif self.CurTouchState == XDormConfig.TouchState.Play then state = XDormConfig.TouchState.PlaySuccess end if self.CurTouchState == XDormConfig.TouchState.Touch then self.IsTouchCD = true local time = XDormConfig.TOUCH_CD self.AnimaTimer = XUiHelper.Tween(time, function(f) if not self.GameObject.activeSelf or XTool.UObjIsNil(self.Transform) then return end local timeStr = string.format("%.1f", time - f * time) self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchTimeOut", timeStr) end, function() self:RemoveAnimaTimer() self.IsTouchCD = false self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchDesc") end) end XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, state, self.CharacterId, nil) self:ReqFondleData() end) end -- 判断是否还有次数 function XUiDormCaress:JudgeLeftCount() if self.FondleData and self.FondleData.LeftCount then return self.FondleData.LeftCount > 0 end return false end return XUiDormCaress