local DefaultScale = CS.UnityEngine.Vector3(1, 1, 1) local DefaultColor = CS.UnityEngine.Color.white local FrontScale = CS.UnityEngine.Vector3(1.02, 1.02, 1) local BackColor = CS.UnityEngine.Color(0.39, 0.39, 0.39, 1) local AnimNames = { Enable = "PanelActor%dEnable", Disable = "PanelActor%dDisable", NormalToFront = "PanelActor%dBlowUpNor", NormalToBack = "PanelActor%dDarkNor", BackToFront = "PanelActor%dBlowUp", FrontToBack = "PanelActor%dDark", } local ShowStatus = { Normal = 0, Back = 1, Front = 2, Hide = 3, } local XUiGridMovieActor = XClass(nil, "XUiGridMovieActor") function XUiGridMovieActor:Ctor(uiRoot, obj, actorIndex) self.UiRoot = uiRoot self.ActorIndex = actorIndex self.PlayingAnimDic = {} local panelActor = {} panelActor.Transform = obj.transform panelActor.gameObject = obj.gameObject XTool.InitUiObject(panelActor) self.PanelActor = panelActor self.RImgActor = panelActor.RImgActor self.RImgFace = panelActor.RImgFace self.EffctActor = panelActor.EffctActor self.MetearialActor = panelActor.MetearialActor self.MeterialFace = panelActor.MeterialFace ---@type UnityEngine.CanvasGroup self.CanvasGroup = panelActor.Transform:GetComponent("CanvasGroup") self.Status = ShowStatus.Hide panelActor.gameObject:SetActiveEx(false) self.RImgFace.gameObject:SetActiveEx(false) XEventManager.AddEventListener(XEventId.EVENT_MOVIE_UI_DESTROY, self.Destroy, self) end function XUiGridMovieActor:Destroy() self.UiRoot = nil self.RImgActor = nil self.PanelActor = nil self.EffctActor = nil self.RImgFace = nil self.MetearialActor = nil self.MeterialFace = nil self.CanvasGroup = nil end function XUiGridMovieActor:UpdateActor(actorId) if self.ActorId == actorId then return end self.ActorId = actorId self:SetImage() self.PanelActor.gameObject:SetActiveEx(true) end function XUiGridMovieActor:SetImage() local rImgActor = self.RImgActor if not rImgActor then return end local actorId = self.ActorId local path = XMovieConfigs.GetActorImgPath(actorId) rImgActor:SetRawImage(path, function() rImgActor:SetNativeSize() end) end function XUiGridMovieActor:SetImagePos(pos) if self.Pos == pos then return end local rImgActor = self.RImgActor if XTool.UObjIsNil(rImgActor) then return end self.Pos = pos rImgActor.rectTransform.anchoredPosition3D = pos end function XUiGridMovieActor:GetImagePos() return self.Pos end function XUiGridMovieActor:GetEffectGo() return self.EffctActor end function XUiGridMovieActor:GetEffectParentGo() return self.RImgActor.transform end function XUiGridMovieActor:GetActorId() return self.ActorId or 0 end function XUiGridMovieActor:GetFaceId() return self.FaceId or 0 end function XUiGridMovieActor:IsHide() return self.Status == ShowStatus.Hide end function XUiGridMovieActor:IsBack() return self.Status == ShowStatus.Back end function XUiGridMovieActor:IsFront() return self.Status == ShowStatus.Front end function XUiGridMovieActor:SetFace(faceId) local rImgFace = self.RImgFace local actorId = self.ActorId if faceId ~= 0 then self.FaceId = faceId local path = XMovieConfigs.GetActorFaceImgPath(actorId, faceId) rImgFace:SetRawImage(path, function() rImgFace:SetNativeSize() end) rImgFace.rectTransform.anchoredPosition = XMovieConfigs.GetActorFacePosVector2(actorId) rImgFace.gameObject:SetActiveEx(true) else rImgFace.gameObject:SetActiveEx(false) end end function XUiGridMovieActor:SetGrayScale(value) if self.GrayValue == value then return end self.GrayValue = value self.MetearialActor:SetGrayScale(value) self.MeterialFace:SetGrayScale(value) end function XUiGridMovieActor:RevertActorPanel() local rImgActor = self.RImgActor local rImgFace = self.RImgFace if XTool.UObjIsNil(rImgActor) then return end local alpha = self.CanvasGroup.alpha local color = DefaultColor local scale = DefaultScale local status = self.Status if status == ShowStatus.Back then color = BackColor elseif status == ShowStatus.Front then self.PanelActor.Transform:SetAsLastSibling() scale = FrontScale elseif status == ShowStatus.Hide then alpha = 0 end self.CanvasGroup.alpha = alpha rImgActor.color = color rImgFace.color = color rImgActor.rectTransform.localScale = scale end function XUiGridMovieActor:PlayAnimEnable(skipAnim) if self.IsUsing then return end self.IsUsing = true if self.Status == ShowStatus.Normal then return end self.Status = ShowStatus.Normal if skipAnim then self:RevertActorPanel() return end local actorIndex = self.ActorIndex local animName = string.format(AnimNames.Enable, actorIndex) if not animName then return end local sameAnimPlaying = self.PlayingAnimDic[animName] if sameAnimPlaying then XLog.Error("XUiGridMovieActor:PlayAnimEnable Error:配置错误,不允许连续配置相同index的角色出现") return end self.PlayingAnimDic[animName] = true self.IsPlayingEnable = true local anim = self.UiRoot[animName] if anim then anim.gameObject:SetActiveEx(true) end anim:PlayTimelineAnimation(function() XLuaUiManager.SetMask(false) self.IsPlayingEnable = nil self.PlayingAnimDic[animName] = nil anim.gameObject:SetActiveEx(false) local tmpAnimName = self.DelayAnimName if tmpAnimName then local tmpAnim = self.UiRoot[tmpAnimName] tmpAnim.gameObject:SetActiveEx(true) tmpAnim:PlayTimelineAnimation(function() XLuaUiManager.SetMask(false) tmpAnim.gameObject:SetActiveEx(false) self:RevertActorPanel() end, function() XLuaUiManager.SetMask(true) end) self.DelayAnimName = nil else self:RevertActorPanel() end end, function() XLuaUiManager.SetMask(true) end) end function XUiGridMovieActor:PlayAnimDisable(skipAnim, cb) if not self.IsUsing then return end self.IsUsing = nil if self.Status == ShowStatus.Hide then return end self.Status = ShowStatus.Hide if skipAnim then self:RevertActorPanel() return end local actorIndex = self.ActorIndex local animName = string.format(AnimNames.Disable, actorIndex) if not animName then return end local sameAnimPlaying = self.PlayingAnimDic[animName] if sameAnimPlaying then XLog.Error("XUiGridMovieActor:PlayAnimEnable Error:配置错误,不允许连续配置相同index的角色消失") return end self.PlayingAnimDic[animName] = true local anim = self.UiRoot[animName] if anim then anim.gameObject:SetActiveEx(true) anim:PlayTimelineAnimation(function() XLuaUiManager.SetMask(false) anim.gameObject:SetActiveEx(false) self.PlayingAnimDic[animName] = nil if cb then cb() end end, function() XLuaUiManager.SetMask(true) end) end end function XUiGridMovieActor:PlayAnimBack(skipAnim) if not self.IsUsing then return end if self.Status == ShowStatus.Back then return end local animName = self:GetStatusAnimName(ShowStatus.Back) if not animName then return end self.Status = ShowStatus.Back if skipAnim then self:RevertActorPanel() return end if self.IsPlayingEnable then self.DelayAnimName = animName return end local anim = self.UiRoot[animName] if anim then anim.gameObject:SetActiveEx(true) anim:PlayTimelineAnimation(function() XLuaUiManager.SetMask(false) anim.gameObject:SetActiveEx(false) self:RevertActorPanel() end, function() XLuaUiManager.SetMask(true) end) end end function XUiGridMovieActor:PlayAnimFront(skipAnim) if not self.IsUsing then return end if self.Status == ShowStatus.Front then return end local animName = self:GetStatusAnimName(ShowStatus.Front) if not animName then return end self.Status = ShowStatus.Front if skipAnim then self:RevertActorPanel() return end if self.IsPlayingEnable then self.DelayAnimName = animName return end local anim = self.UiRoot[animName] if anim then anim.gameObject:SetActiveEx(true) anim:PlayTimelineAnimation(function() XLuaUiManager.SetMask(false) anim.gameObject:SetActiveEx(false) self:RevertActorPanel() end, function() XLuaUiManager.SetMask(true) end) end end function XUiGridMovieActor:GetStatusAnimName(toStatus) local animName local actorIndex = self.ActorIndex if not actorIndex then return end local status = self.Status if toStatus == ShowStatus.Back then if status == ShowStatus.Normal then animName = string.format(AnimNames.NormalToBack, actorIndex) elseif status == ShowStatus.Front then animName = string.format(AnimNames.FrontToBack, actorIndex) end elseif toStatus == ShowStatus.Front then if status == ShowStatus.Normal then animName = string.format(AnimNames.NormalToFront, actorIndex) elseif status == ShowStatus.Back then animName = string.format(AnimNames.BackToFront, actorIndex) end end return animName end function XUiGridMovieActor:PlayFadeAnimation(beginAlpha,endAlpha,duration) self.CanvasGroup.alpha = beginAlpha self.CanvasGroup:DOFade(endAlpha, duration) end return XUiGridMovieActor