local tableInsert = table.insert local CSXTextManagerGetText = CS.XTextManager.GetText local TipSkipTitle = CSXTextManagerGetText("MovieSkipTipTitle") local TipSkipContent = CSXTextManagerGetText("MovieSkipTipContent") local XUiGridMovieActor = require("XUi/XUiMovie/XUiGridMovieActor") local XUiPanelMovie3D = require("XUi/XUiMovie/XUiPanelMovie3D") local XUiMovie = XLuaUiManager.Register(XLuaUi, "UiMovie") local InsertDirection = { Left = 1, Right = 2 } local InsertPanelEnableAnimationDic = { [InsertDirection.Left] = "PanelinsertLeftEnable", [InsertDirection.Right] = "PanelinsertRightEnable" } local InsertPanelDisableAnimationDic = { [InsertDirection.Left] = "PanelinsertLeftDisable", [InsertDirection.Right] = "PanelinsertRightDisable" } function XUiMovie:OnAwake() self:AddListener() end function XUiMovie:OnStart(hideSkipBtn) self:InitView() self:OnInitScene() self.BtnSkip.gameObject:SetActiveEx(not hideSkipBtn) XEventManager.DispatchEvent(XEventId.EVENT_MOVIE_UI_OPEN, self) self.LastOperationType = CS.XInputManager.CurOperationType CS.XInputManager.SetCurOperationType(CS.XOperationType.System) end function XUiMovie:OnEnable() XEventManager.DispatchEvent(XEventId.EVENT_MOVIE_BREAK_BLOCK) end function XUiMovie:OnDisable() end function XUiMovie:OnDestroy() for _, actor in pairs(self.ActorDic) do if not XTool.UObjIsNil(actor) then actor:Destroy() end end self.ActorDic = {} for _, camera in pairs(self.CameraDic) do if not XTool.UObjIsNil(camera) then CS.UnityEngine.GameObject.Destroy(camera.gameObject) end end self.CameraDic = {} for _, timeline in pairs(self.TimelineDic) do if not XTool.UObjIsNil(timeline) then CS.UnityEngine.GameObject.Destroy(timeline.gameObject) end end self.TimelineDic = {} CS.XInputManager.SetCurOperationType(self.LastOperationType) XEventManager.DispatchEvent(XEventId.EVENT_MOVIE_UI_DESTROY) end function XUiMovie:InitView() self.FullScreenDialogUsingIndex = 1 self.FullScreenDialogGrids = {} self.AnimPrefabDic = {} self.EffectGoDic = {} self.PanelEffects = { self.EffectBg, self.EffectCha, self.EffectFull, } self.Actors = {} for actorIndex = 1, XMovieConfigs.MAX_ACTOR_NUM do tableInsert(self.Actors, XUiGridMovieActor.New(self,self["PanelActor" .. actorIndex], actorIndex)) end self.PanelElement.gameObject:SetActiveEx(true) self.PanelDialog.gameObject:SetActiveEx(false) self.PanelFullScreenDialog.gameObject:SetActiveEx(false) self.PanelSelectableDialog.gameObject:SetActiveEx(false) self.PanelTheme.gameObject:SetActiveEx(false) self.PanelSummer.gameObject:SetActiveEx(false) self.PanelSelectableDialog.gameObject:SetActiveEx(false) self.PanelMask.gameObject:SetActiveEx(false) self.PanelStaff.gameObject:SetActiveEx(false) self.Panel3D = XUiPanelMovie3D.New(self.Panel3d, self) end function XUiMovie:OnInitScene() self.CameraDic = {} self.ActorDic = {} self.TimelineDic = {} ---@type UnityEngine.Transform local root = self.UiModelGo.transform self.CameraRoot = root:FindTransform("CameraRoot") self.ActorRoot = root:FindTransform("ActorRoot") ---@type Cinemachine.CinemachineBrain self.CineMachineBrain = root:FindTransform("UiNearCamera"):GetComponent(typeof(CS.Cinemachine.CinemachineBrain)) self.DefaultBlendDefine = self.CineMachineBrain.m_DefaultBlend self.CutBlendDefine = CS.Cinemachine.CinemachineBlendDefinition() self.TimelineRoot = root:FindTransform("TimelineRoot") self.MixRoot = root.parent.parent:FindTransform("MixRoot") self.MixActorRoot = self.MixRoot:FindTransform("MixActorRoot") ---@type UnityEngine.UI.RawImage self.MixBg = self.MixRoot:FindTransform("Bg"):GetComponent(typeof(CS.UnityEngine.UI.RawImage)) ---@type UnityEngine.Camera self.MixUiCamera = self.MixRoot:FindTransform("MixUiCamera"):GetComponent(typeof(CS.UnityEngine.Camera)) self.MixCanvas = self.MixRoot:FindTransform("MixCanvas") self:AutoResizeMixCanvas() end function XUiMovie:AddListener() self.BtnSkip.CallBack = function() self:OnClickBtnSkip() end self.BtnReview.CallBack = function() self:OnClickBtnReview() end self.BtnAuto.CallBack = function() self:OnClickBtnAuto() end self.BtnTurn.CallBack = function() self:OnClickBtnTurn() end self.BtnHide.CallBack = function() self:OnClickBtnHide() end self.PanelMaskInputHandler:AddPointerClickListener(handler(self, self.OnClickBtnPause)) self.PanelHideMaskInputHandler:AddPointerClickListener(handler(self, self.OnClickHideMask)) end function XUiMovie:SelectPanelShowing() return self.PanelSelectableDialog.gameObject.activeSelf; end function XUiMovie:OnClickBtnSkip() if self:SelectPanelShowing() then return end local description = XDataCenter.MovieManager.GetMovieDescription() local closeCb = function() local dict = {} dict["story_id"] = XDataCenter.MovieManager.GetCurPlayingMovieId() dict["role_level"] = XPlayer.GetLevel() CS.XRecord.Record(dict, "200003", "StorylineSkip") XDataCenter.MovieManager.StopMovie() end if description and description ~= "" then XLuaUiManager.Open("UiStorySkipDialog", description, closeCb) else XUiManager.SystemDialogTip(TipSkipTitle, TipSkipContent, XUiManager.DialogType.Normal, nil, closeCb) end end function XUiMovie:OnClickBtnReview() if self:SelectPanelShowing() then return end self:OpenChildUi("UiMovieReview") self:ResetAutoPlay() end function XUiMovie:OnClickHideMask() self.PanelHideMask.gameObject:SetActiveEx(false) self.PanelDialogCanvasGroup.alpha = 1 self.TopBtnCanvasGroup.alpha = 1 end function XUiMovie:OnClickBtnHide() self.PanelHideMask.gameObject:SetActiveEx(true) self.PanelDialogCanvasGroup.alpha = 0 self.TopBtnCanvasGroup.alpha = 0 self:ResetAutoPlay() end function XUiMovie:OnClickBtnPause() if self:SelectPanelShowing() then return end if not XDataCenter.MovieManager.IsAutoPlay() then return end XDataCenter.MovieManager.SwitchMovieState() local isMoviePause = XDataCenter.MovieManager.IsMoviePause() if isMoviePause then self:PlayAnimation("ImgPauseIconEnable") else self:PlayAnimation("ImgPauseIconDisable") end self.ImgPauseIcon.gameObject:SetActiveEx(isMoviePause) end function XUiMovie:OnClickBtnAuto() if self:SelectPanelShowing() then return end XDataCenter.MovieManager.SwitchAutoPlay() if XDataCenter.MovieManager.IsMoviePause() then XDataCenter.MovieManager.SetMoviePause(false) end local isAutoPlay = XDataCenter.MovieManager.IsAutoPlay() self.BtnTurn:SetDisable(isAutoPlay, not isAutoPlay) self.PanelMask.gameObject:SetActiveEx(isAutoPlay) self.ImgPauseIcon.gameObject:SetActiveEx(false) if isAutoPlay then -- self:ShowSpeedList(false) self.BtnAuto.ButtonState = CS.UiButtonState.Select else self.BtnAuto.ButtonState = CS.UiButtonState.Normal end end function XUiMovie:OnClickBtnTurn() XDataCenter.MovieManager.BackToLastAction() end function XUiMovie:ResetAutoPlay() if XDataCenter.MovieManager.IsAutoPlay() then self.BtnAuto:SetButtonState(XUiButtonState.Normal) self:OnClickBtnAuto() end end function XUiMovie:GetActor(actorIndex) local actor = self.Actors[actorIndex] if not actor then XLog.Error("XUiMovie:GetActor error:ActorIndex is not match, actorIndex is " .. actorIndex) end return actor end function XUiMovie:GetTipActor(actorIndex) local actor = self.InsertActors[actorIndex] if not actor then XLog.Error("XUiMovie:GetTipActor error:ActorIndex is not match, actorIndex is " .. actorIndex) end return actor end function XUiMovie:GetModelActor(roleId) local actor = self.ActorDic[roleId] if not actor then XLog.Debug("XUiMovie:GetModelActor error:ActorIndex is not match, actorIndex is " .. roleId) end return actor end function XUiMovie:AddModelActor(roleId, transform, isShow) --todo aafasou 加载角色模型 if self.ActorDic[roleId] then XLog.Error("XUiMovie:LoadModelActor,重复载入角色,roleId", roleId) return end local proxy = CS.Movie.XMovie3DManager.Get3DRoleProxy(roleId) proxy:Show(transform.Position, transform.Rotation) proxy.transform.parent = self.ActorRoot self.ActorDic[roleId] = proxy end function XUiMovie:AddTimeline(path, name, position, rotation) if self.TimelineDic[name] then return end local timelineObj = CS.LoadHelper.InstantiateGameObject(path) timelineObj.transform.parent = self.TimelineRoot timelineObj.transform.position = position timelineObj.transform.localEulerAngles = rotation ---@type UnityEngine.Playables.PlayableDirector local timelineHelper = timelineObj:GetTimelineHelper() if timelineHelper then self.TimelineDic[name] = timelineHelper else XLog.Error(" XUiMovie:AddTimeline 添加的资源不带有PlayableDirector,请检查对应预制体,Path:", path) end end function XUiMovie:GetTimeline(name) if self.TimelineDic[name] then return self.TimelineDic[name] else XLog.Error("XUiMovie:GetTimeline 对应Timeline资源尚未加载 name:", name) end end function XUiMovie:AddCamera(name,cameraPath,transform) if not cameraPath then return end if self.CameraDic[name] then return end local container = CS.UnityEngine.GameObject() container.name = name container.transform.parent = self.CameraRoot local obj = container:LoadPrefab(cameraPath) obj.transform.localPosition = transform.Position obj.transform.localEulerAngles = transform.Rotation self.CameraDic[name] = container container.gameObject:SetActiveEx(false) end function XUiMovie:SwitchCamera(name,time) ---@type UnityEngine.GameObject local camera = self.CameraDic[name] if not camera then XLog.Error("XUiMovie:PlayCameraAnimation:没有加载对应的Camera动画,name:", name) return end for _, obj in pairs(self.CameraDic) do obj.gameObject:SetActiveEx(false) end local define = self.CineMachineBrain.m_DefaultBlend define.m_Time = time self.CineMachineBrain.m_DefaultBlend = define camera.gameObject:SetActiveEx(true) end function XUiMovie:Switch3DMovie() self.Bg.gameObject:SetActiveEx(false) self.RImgBg1.gameObject:SetActiveEx(false) self.TopBtn.gameObject:SetActiveEx(false) self.Panel3d.gameObject:SetActiveEx(true) end function XUiMovie:Hide() self.GameObject:SetActiveEx(false) end function XUiMovie:Show() self.GameObject:SetActiveEx(true) end function XUiMovie:SetMixBg(path) if not string.IsNilOrEmpty(path) then self.MixBg:SetRawImage(path) self.MixBg.gameObject:SetActiveEx(true) end end function XUiMovie:AutoResizeMixCanvas() local v = self.MixCanvas.transform.position - self.MixUiCamera.transform.position local offset = CS.UnityEngine.Vector3.Project(v, self.MixUiCamera.transform.position) self.MixCanvas.transform.position = self.MixCanvas.transform.position + offset local height = self.MixUiCamera.orthographicSize * 2 local width = height * self.MixUiCamera.aspect ---@type UnityEngine.RectTransform local rectTransform = self.MixCanvas:GetComponent(typeof(CS.UnityEngine.RectTransform)) rectTransform.sizeDelta = CS.UnityEngine.Vector2(width, height) end function XUiMovie:SwitchMixPanel() self.MixRoot.gameObject:SetActiveEx(true) self:Switch3DMovie() end function XUiMovie:ShowInsertTips() self.Panelinsert02.gameObject:SetActiveEx(true) self:PlayAnimation("Panelinsert02Enable") end function XUiMovie:HideInsertTips() self:PlayAnimation("Panelinsert02Disable",function() self.Panelinsert02.gameObject:SetActiveEx(false) end) end function XUiMovie:SetInsertBg(bgPath) if not string.IsNilOrEmpty(bgPath) then self.InsertBg:SetRawImage(bgPath) end end function XUiMovie:GetInsertBgActor(direction) local actor = self.InsertBgActor[direction] if not actor then XLog.Error("XUiMovie:GetInsertBgActor error:ActorIndex is not match, actorIndex is " .. direction) return end return actor end function XUiMovie:SetInsertPanelBg(bgPath,direction) if not string.IsNilOrEmpty(bgPath) then if direction == InsertDirection.Left then self.RImgLeftBg:SetRawImage(bgPath) elseif direction == InsertDirection.Right then self.RImgRightBg:SetRawImage(bgPath) end end end function XUiMovie:PlayInsertPanelEnableAnimation(direction) self:PlayAnimation(InsertPanelEnableAnimationDic[direction]) end function XUiMovie:PlayInsertPanelDisableAnimation(direction) self:PlayAnimation(InsertPanelDisableAnimationDic[direction]) end