local XUiPlanetChapterGrid = require("XUi/XUiPlanet/Chapter/XUiPlanetChapterGrid") local XUiPlanetChapter = XLuaUiManager.Register(XLuaUi, "UiPlanetChapter") local VALUELIMIT = 10000 function XUiPlanetChapter:OnAwake() self:InitObj() if not self.Widget then self:InitDynamicTable() end self:AddBtnClickListener() end function XUiPlanetChapter:OnStart() if not self.Widget then self:UpdateChapterList() end if not XDataCenter.PlanetManager.CheckMainIsExit() then self.IsResume = true XDataCenter.PlanetManager.ResumeMainScene(function() self.IsResume = false XDataCenter.PlanetManager.GetPlanetMainScene():UpdateCameraInChapter(function() self:UpdateChapterGridList() self:UpdateChapterGridListPosition() self:StartUpdateChapterGridListPosition() end) end) end XDataCenter.PlanetManager.SceneOpen(XPlanetConfigs.SceneOpenReason.UiPlanetChapter) end function XUiPlanetChapter:OnEnable() self:InitChapterGridList() self.PlanetMainScene = XDataCenter.PlanetManager.GetPlanetMainScene() self.PlanetMainScene:UpdateCameraInChapter(function() self:UpdateChapterGridListPosition() end) self.IsBounce = false self.IsDrag = false self:RefreshRedPoint() self:RefreshTalentBtn() if self.Widget and not self.IsResume then self:UpdateChapterGridList() self:UpdateChapterGridListPosition() self:StartUpdateChapterGridListPosition() end end function XUiPlanetChapter:OnDisable() self:StopUpdateChapterGridListPosition() end function XUiPlanetChapter:OnRelease() self.Super.OnRelease(self) self:StopUpdateChapterGridListPosition() end function XUiPlanetChapter:OnDestroy() XDataCenter.PlanetManager.SceneRelease(XPlanetConfigs.SceneOpenReason.UiPlanetChapter) end --region Ui function XUiPlanetChapter:InitChapterGridList() self.ChapterList = XDataCenter.PlanetManager.GetShowChapterList() for _, chapterId in ipairs(self.ChapterList) do if not self.ChapterGridList[chapterId] then local go = XUiHelper.Instantiate(self.GridStar.gameObject, self.ChapterRoot) self.ChapterGridList[chapterId] = XUiPlanetChapterGrid.New(go, self) end end self.PanelItemList.gameObject:SetActiveEx(false) end function XUiPlanetChapter:UpdateChapterGridList() for chapterId, grid in ipairs(self.ChapterGridList) do grid:Refresh(chapterId) end end function XUiPlanetChapter:UpdateChapterGridListPosition() local beforeUiXPosition local afterUiXPosition local beforePlanetXPosition local afterPlanetXPosition for chapterId, grid in ipairs(self.ChapterGridList) do local position = self.PlanetMainScene:GetChapterPlanetPosition(chapterId) local camera = self.PlanetMainScene:GetCamera() local uiPosition = XUiHelper.ObjPosToUguiPos(self.Transform, position, camera) if beforeUiXPosition == nil then beforeUiXPosition = uiPosition.x end if beforePlanetXPosition == nil then beforePlanetXPosition = position.x end afterPlanetXPosition = position.x afterUiXPosition = uiPosition.x grid:SetPosition(uiPosition) end self.PlanetXDistance = (beforeUiXPosition - afterUiXPosition) / (#self.ChapterList - 1) self:InitDragParams(beforePlanetXPosition, afterPlanetXPosition, self.PlanetXDistance) end function XUiPlanetChapter:StartUpdateChapterGridListPosition() self.UpdateTimer = XScheduleManager.ScheduleForever(function() if self.PlanetMainScene:CheckCameraIsMove() then self:UpdateChapterGridListPosition() else self:CamBounceBack() end end, 0, 0) end function XUiPlanetChapter:StopUpdateChapterGridListPosition() if self.UpdateTimer then XScheduleManager.UnSchedule(self.UpdateTimer) end self.UpdateTimer = nil end function XUiPlanetChapter:RefreshRedPoint() -- 必须要先请求商店信息 才能检测红点。请求前先判断能否获取信息 XDataCenter.PlanetManager.RefreshShopInfo(function () self.BtnShop:ShowReddot(XDataCenter.PlanetManager.CheckShopRedPoint()) end, true) self.BtnTask:ShowReddot(XDataCenter.PlanetManager.CheckTaskRedPoint()) self.BtnHome:ShowReddot(XDataCenter.PlanetManager.CheckTalentRedPoint()) end function XUiPlanetChapter:RefreshTalentBtn() local isShowTalentPlanet = XDataCenter.PlanetManager.GetViewModel():CheckStageIsPass(XPlanetConfigs.GetTalentUnLockStage()) self.BtnHome:SetDisable(not isShowTalentPlanet) end --endregion --region Drag local PlanetDeltaXPosition = 0 -- 两星球间X坐标差 local UiGridDeltaXPosition = 0 -- 两uiGrid间坐标差 local OverNum = 0.5 -- 超出范围百分比(小数表示) local OverTime = 0.08 -- 回弹时间 local LeftLimit = 0 -- 左极限 local RightLimit = 0 -- 右极限 local Value = 1 -- 滑动范围百分比(小数表示) local BounceFri = 0 -- 弹性拉伸缓长 local OffsetX = 0 -- 当前偏移值(用于惯性) local InertiaStrength = 10 -- 惯性力度 local Mathf = CS.UnityEngine.Mathf local Input = CS.UnityEngine.Input function XUiPlanetChapter:InitDragParams(leftLimit, rightLimit, uiGridDeltaXPosition) local camPosition = XDataCenter.PlanetManager.GetPlanetMainScene():GetCamera().transform.position if RightLimit ~= rightLimit then PlanetDeltaXPosition = XPlanetConfigs.GetCamChapterXOffset() LeftLimit = leftLimit + PlanetDeltaXPosition / 2 RightLimit = rightLimit UiGridDeltaXPosition = uiGridDeltaXPosition end Value = (camPosition.x - LeftLimit) / (RightLimit - LeftLimit) end function XUiPlanetChapter:OnBeginDrag() local mainScene = XDataCenter.PlanetManager.GetPlanetMainScene() self.StartDragPosition = Input.mousePosition self.CameraPosition = mainScene:GetCamera().transform.position self.IsDrag = true end function XUiPlanetChapter:OnDrag() local deltaPosition = Input.mousePosition - self.StartDragPosition local camXMove = XPlanetConfigs.GetCamChapterXOffset() / UiGridDeltaXPosition OffsetX = (deltaPosition.x * camXMove) / (RightLimit - LeftLimit) Value = Value + OffsetX Value = Mathf.Max(0 - OverNum, Value) Value = Mathf.Min(Value, 1 + OverNum) if Value > 1 then Value = Mathf.SmoothDamp(Value, 1, BounceFri, OverTime) elseif Value < 0 then Value = Mathf.SmoothDamp(Value, 0, BounceFri, OverTime) end self:_UpdateCamPosition() self.IsDrag = true self.StartDragPosition = Input.mousePosition self.CameraPosition = XDataCenter.PlanetManager.GetPlanetMainScene():GetCamera().transform.position end function XUiPlanetChapter:OnEndDrag() self.CurValue = Value + OffsetX * InertiaStrength self.CurValue = Mathf.Max(0, self.CurValue) self.CurValue = Mathf.Min(self.CurValue, 1) self.IsDrag = false self.IsBounce = true end ---相机弹性拉伸 function XUiPlanetChapter:CamBounceBack() if not self.CameraPosition then return end if self.IsDrag then return end if not self.IsBounce then return end if Value > 1 then -- 右回弹 Value = Mathf.SmoothDamp(Value, 1, BounceFri, OverTime) --因为Mathf.SmoothDamp的time参数不填1是不能到达目标值的,因此需要设置退出值,下方同理 if math.floor(Value * VALUELIMIT) == 1 then Value = 1 self.IsBounce = false end elseif Value < 0 then -- 左回弹 Value = Mathf.SmoothDamp(Value, 0, BounceFri, OverTime) if math.ceil(Value * VALUELIMIT) == 0 then Value = 0 self.IsBounce = false end elseif Value > 0 and Value < 1 then -- 惯性滑动 Value = Mathf.SmoothDamp(Value, self.CurValue, BounceFri, OverTime) if math.floor(Value * VALUELIMIT) == math.floor(self.CurValue * VALUELIMIT) then Value = self.CurValue self.IsBounce = false end end self:_UpdateCamPosition() end function XUiPlanetChapter:_UpdateCamPosition() local mainScene = XDataCenter.PlanetManager.GetPlanetMainScene() local x = LeftLimit + (RightLimit - LeftLimit) * Value local newPosition = Vector3(x, self.CameraPosition.y, self.CameraPosition.z) mainScene:MoveStaticCamera(newPosition) self:UpdateChapterGridListPosition() end --endregion --region 列表刷新 function XUiPlanetChapter:InitDynamicTable() self.ScrollRect = self.PanelItemList:GetComponent("ScrollRect") self.ScrollRect.onValueChanged:AddListener(handler(self, self.ChangeCam)) self.DynamicTable = XDynamicTableNormal.New(self.PanelItemList) self.DynamicTable:SetProxy(XUiPlanetChapterGrid, self) self.DynamicTable:SetDelegate(self) self.GridStar.gameObject:SetActiveEx(false) end function XUiPlanetChapter:UpdateChapterList() self.ChapterList = XDataCenter.PlanetManager.GetShowChapterList() self.DynamicTable:SetDataSource(self.ChapterList) self.DynamicTable:ReloadDataASync(1) end function XUiPlanetChapter:OnDynamicTableEvent(event, index, grid) if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then local chapterId = self.ChapterList[index] grid:Refresh(chapterId) end end function XUiPlanetChapter:GetScreenOffset(index) local chapterId = self.ChapterList[index] local screen = CS.UnityEngine.Screen local mainScene = XDataCenter.PlanetManager.GetPlanetMainScene() -- ScreenPoint以左下角为原点 local position = mainScene:GetCamera():WorldToScreenPoint(mainScene:GetChapterPlanetPosition(chapterId)) local screenPoint = position - Vector3(screen.width / 2, screen.height / 2, 0) - offset return screenPoint end function XUiPlanetChapter:ChangeCam() local mainScene = XDataCenter.PlanetManager.GetPlanetMainScene() local deltaPosition = self.InitPosition - self.PanelStar.transform.localPosition local camXMove = 42.5 * deltaPosition.x / self.GridStar.transform.rect.width --mainScene:MoveStaticCamera(Vector3(27.5, 0, -50) + Vector3(camXMove, 0, 0)) mainScene:MoveStaticCamera(Vector3(27.5, 0, mainScene:GetCamera().transform.position.z) + Vector3(camXMove, 0, 0)) end --endregion --region 对象初始化 function XUiPlanetChapter:InitObj() self.PlanetMainScene = XDataCenter.PlanetManager.GetPlanetMainScene() self.PlanetViewModel = XDataCenter.PlanetManager.GetViewModel() self.InitPosition = self.PanelStar.transform.localPosition ---@type XUiPlanetChapterGrid self.ChapterGridList = {} end --endregion --region 按钮绑定 function XUiPlanetChapter:AddBtnClickListener() XUiHelper.RegisterClickEvent(self, self.BtnTask, self.OnBtnTaskClick) XUiHelper.RegisterClickEvent(self, self.BtnShop, self.OnBtnShopClick) XUiHelper.RegisterClickEvent(self, self.BtnHome, self.OnBtnHomeClick) XUiHelper.RegisterClickEvent(self, self.BtnBack, self.Close) XUiHelper.RegisterClickEvent(self, self.BtnMainUi, function() XLuaUiManager.RunMain() end) self:BindHelpBtn(self.BtnHelp, XPlanetConfigs.GetHelpKey()) if self.Widget then self.Widget:AddBeginDragListener(function(eventData) self:OnBeginDrag() end) self.Widget:AddEndDragListener(function(eventData) self:OnEndDrag() end) self.Widget:AddDragListener(function(eventData) self:OnDrag() end) end end function XUiPlanetChapter:OnBtnHomeClick() if XDataCenter.PlanetManager.GetViewModel():CheckStageIsPass(XPlanetConfigs.GetTalentUnLockStage()) then XLuaUiManager.Open("UiPlanetHomeland") else local stageName = XPlanetStageConfigs.GetStageFullName(XPlanetConfigs.GetTalentUnLockStage()) XUiManager.TipError(XUiHelper.GetText("PlanetRunningTalentCardLock", stageName)) end end function XUiPlanetChapter:OnBtnShopClick() if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.ShopCommon) then return end XDataCenter.PlanetManager.RefreshShopInfo(function () XLuaUiManager.Open("UiPlanetPropertyShop") end) end function XUiPlanetChapter:OnBtnTaskClick() XLuaUiManager.Open("UiPlanetPropertyTask") end --endregion