PGRData/Script/matrix/xui/xuimain/XUiMain.lua
2024-09-01 22:49:41 +02:00

618 lines
No EOL
21 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--local XUiMainDown = require("XUi/XUiMain/XUiMainDown")
local XUiMainRightTop = require("XUi/XUiMain/XUiMainRightTop")
local XUiMainRightMid = require("XUi/XUiMain/XUiMainRightMid")
local XUiMainLeftTop = require("XUi/XUiMain/XUiMainLeftTop")
--local XUiMainRightMidSecond = require("XUi/XUiMain/XUiMainRightMidSecond")
local XUiMainRightBottom = require("XUi/XUiMain/XUiMainRightBottom")
--local XUiMainLeftMid = require("XUi/XUiMain/XUiMainLeftMid")
local XUiMainLeftBottom = require("XUi/XUiMain/XUiMainLeftBottom")
local XUiMainOther = require("XUi/XUiMain/XUiMainOther")
local XUiPanelSignBoard = require("XUi/XUiMain/XUiChildView/XUiPanelSignBoard")
local XUiMainCalendar = require("XUi/XUiMain/XUiMainCalendar")
---@class XUiMain : XLuaUi
local XUiMain = XLuaUiManager.Register(XLuaUi, "UiMain")
local CameraIndex = {
Main = 1,
MainEnter = 2,
MainChatEnter = 3,
MainRightMidSecondEnter = 4,
}
local MenuType = {
Main = 1,
Second = 2,
}
XUiMain.LowPowerState = {
Full = 1,
Low = 2,
LowToFull = 3,
FullToLow = 4,
None = 5
}
local RightMidType = MenuType.Main
local InitBackgroundScreenCapture = false
function XUiMain:InitPanel()
---@type XUiMainRightTop
self.RightTop = XUiMainRightTop.New(self.PanelRightTop.transform, self, self) --右上角组件(资源、电量、时间、设置、邮件……)
self.RightMid = XUiMainRightMid.New(self.PanelRightMid, self, self) --右中角组件(各种功能……)
--self.RightMidSecond = XUiMainRightMidSecond.New(self) -- 右中角二级菜单
self.RightBottom = XUiMainRightBottom.New(self.PanelRightBottom.transform, self, self) --右下角组件(各个大功能入口……)
---@type XUiMainLeftTop
self.LeftTop = XUiMainLeftTop.New(self.PanelLeftTop, self, self) --左上角组件(玩家信息……)
--self.LeftMid = XUiMainLeftMid.New(self.PanelLeftMid.transform, self) --左中角组件(自动战斗、过期提醒……)
self.LeftBottom = XUiMainLeftBottom.New(self.PanelLeftBottom.transform, self) --左下角组件公告、好友、福利、AD、聊天……
---@type XUiMainOther
self.Other = XUiMainOther.New(self.PanelOther.transform, self, self) --其他组件(角色触摸、截图……)
--self.Down = XUiMainDown.New(self.PanelDown, self, self) --底部组件(战斗通行证……)
self.Terminal = require("XUi/XUiMain/XUiMainTerminal").New(self.PanelRightMidSecond.transform, self, self) --终端界面
---@type XUiMainCalendar
self.Calendar = XUiMainCalendar.New(self.PanelLeftCalendar, self, self) --周历界面
-- self.AreanOnline = XUiPanelArenaOnline.New(self, self.PanelArenaOnline) --屏蔽合众战局
end
function XUiMain:OnAwake()
--BDC
CS.XHeroBdcAgent.BdcIntoGame(CS.UnityEngine.Time.time)
self.PreEnterFightCallback = function() self:OnPreEnterFight() end
XEventManager.AddEventListener(XEventId.EVENT_PRE_ENTER_FIGHT, self.PreEnterFightCallback)
XEventManager.AddEventListener(XEventId.EVENT_SCENE_UIMAIN_RIGHTMIDTYPE_CHANGE, self.ForceChangeUiMainRightMidType, self)
--self.Down.GameObject:SetActiveEx(not XUiManager.IsHideFunc)
self.PanelLeftBottom.gameObject:SetActiveEx(not XUiManager.IsHideFunc)
end
function XUiMain:OnStart()
self:InitPanel()
self:InitTheme()
-- 注销后重新登录 主界面默认不显示二级菜单
if XLoginManager.IsFirstOpenMainUi() then
RightMidType = MenuType.Main
end
--界面重新打开
self.NewOpen = true
if InitBackgroundScreenCapture == false then
CS.XBlurHelper.GetBlurScreenCapture(CS.XUiManager.Instance.UiCamera,
CS.XGraphicManager.RenderConst.Ui.PopupBackgroundBlurInfo, function(tex2D)
CS.UnityEngine.Object.DestroyImmediate(tex2D);
-- CS.XLog.Debug("----- InitBackgroundScreenCapture")
end, false);
InitBackgroundScreenCapture = true
end
-- 回到主界面就重置XInputSystem.operationType
CS.XInputManager.SetCurOperationType(CS.XOperationType.System)
end
function XUiMain:OnEnable()
if XDataCenter.GuideManager.CheckIsInGuide() then
RightMidType = MenuType.Main
end
-- 刷新二级菜单
self:UpdateRightMenu()
CS.XResourceRecord.Stop();
-- 每次打开的时候重新加载一下场景
local curSceneId = XDataCenter.PhotographManager.GetCurSceneId()
local curSceneTemplate = XDataCenter.PhotographManager.GetSceneTemplateById(curSceneId)
local curSceneUrl, _ = XSceneModelConfigs.GetSceneAndModelPathById(curSceneTemplate.SceneModelId)
local modelUrl = self:GetDefaultUiModelUrl()
self.CurSceneId = curSceneId
--先加载可见界面主题
self:UpdateTheme()
self:LoadUiScene(curSceneUrl, modelUrl, function() self:OnUiSceneLoaded(curSceneTemplate.ParticleGroupName) end, false)
self:PlayEnterAnim()
XRedPointManager.AutoReleaseRedPointEvent()
-- self.LeftTop:OnEnable()
-- --self.LeftMid:OnEnable()
-- self.LeftBottom:OnEnable()
-- self.RightMid:OnEnable()
-- --self.RightMidSecond:OnEnable()
-- self.RightTop:OnEnable()
-- self.RightBottom:OnEnable()
-- self.Other:OnEnable()
-- self.Calendar:OnEnable()
self:SetCacheFight()
self:SetScreenAdaptorCache()
XDataCenter.SetManager.SetSceneUIType()
--self.Down:OnEnable()
XLoginManager.ResetHearbeatInterval()
self:AreanOnlineInviteNotify()
XEventManager.AddEventListener(XEventId.EVENT_SCENE_UIMAIN_STATE_CHANGE, self.OnBackGroupPreview, self)
XDataCenter.SignBoardManager.AddRoleActionUiAnimListener(self)
if not XLoginManager.IsFirstOpenMainUi() then
self:PlayEquipGuide(false)
end
-- 开启时钟
self.ClockTimer = XUiHelper.SetClockTimeTempFun(self)
end
function XUiMain:ForceChangeUiMainRightMidType(arg)
RightMidType = arg
end
function XUiMain:OnDisable()
-- self.LeftTop:OnDisable()
--self.LeftMid:OnDisable()
-- self.LeftBottom:OnDisable()
-- self.RightMid:OnDisable()
-- --self.RightMidSecond:OnDisable()
-- self.Other:OnDisable()
-- self.RightBottom:OnDisable()
-- self.RightTop:OnDisable()
self.Terminal:OnDisable()
-- self.Calendar:OnDisable()
--self.Down:OnDisable()
XEventManager.RemoveEventListener(XEventId.EVENT_SCENE_UIMAIN_STATE_CHANGE, self.OnBackGroupPreview, self)
XDataCenter.SignBoardManager.RemoveRoleActionUiAnimListener(self)
--界面重新打开
self.NewOpen = false
self:ClearSceneReference()
-- 关闭时钟
if self.ClockTimer then
XUiHelper.StopClockTimeTempFun(self, self.ClockTimer)
self.ClockTimer = nil
end
end
function XUiMain:OnDestroy()
self.LeftBottom:OnDestroy()
self.Other:OnDestroy()
self.RightTop:OnDestroy()
self.LeftTop:OnDestroy()
self.RightBottom:OnDestroy()
XEventManager.RemoveEventListener(XEventId.EVENT_PRE_ENTER_FIGHT, self.PreEnterFightCallback)
XEventManager.RemoveEventListener(XEventId.EVENT_SCENE_UIMAIN_RIGHTMIDTYPE_CHANGE, self.ForceChangeUiMainRightMidType, self)
end
function XUiMain:OnNotify(evt, ...)
if evt == XEventId.EVENT_CHAT_OPEN then
--打开聊天界面
self:PlayMainChatIn()
elseif evt == XEventId.EVENT_CHAT_CLOSE then
--聊天界面关闭
self:PlayMainChatOut()
elseif evt == XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT then
-- self.AreanOnline:Show(...)
elseif evt == XEventId.EVENT_GUIDE_START then
-- 进行新手引导时,切换显示为主菜单
self:OnShowMain()
elseif evt == XEventId.EVENT_SCENE_SET_NONE_STATE then
self:ChangeLowPowerState(self.LowPowerState.None)
end
self.LeftBottom:OnNotify(evt)
self.RightMid:OnNotify(evt)
self.RightTop:OnNotify(evt)
end
function XUiMain:OnPreEnterFight()
self:LoadUiScene("", "") -- 释放主界面角色场景
end
function XUiMain:AreanOnlineInviteNotify()
local chatdata = XDataCenter.ArenaOnlineManager.GetPrivateChatData()
if not chatdata or not next(chatdata) then
return
end
XLuaUiManager.Open("UiArenaOnlineInvitation")
end
function XUiMain:OnGetEvents()
return {
XEventId.EVENT_CHAT_OPEN,
XEventId.EVENT_CHAT_CLOSE,
XEventId.EVENT_NOTICE_PIC_CHANGE,
XEventId.EVENT_TASKFORCE_INFO_NOTIFY,
XEventId.EVENT_ACTIVITY_MAINLINE_STATE_CHANGE,
XAgencyEventId.EVENT_MAIL_COUNT_CHANGE,
XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT,
XEventId.EVENT_GUIDE_START,
XEventId.EVENT_SCENE_SET_NONE_STATE,
}
end
--初始化摄像机
function XUiMain:InitSceneRoot(particleGroupName)
local root = self.UiModelGo.transform
self.CameraFar = {
[CameraIndex.Main] = self:FindVirtualCamera("CamFarMain"),
[CameraIndex.MainEnter] = self:FindVirtualCamera("CamFarMainEnter"),
[CameraIndex.MainChatEnter] = self:FindVirtualCamera("CamFarMainChatEnter"),
[CameraIndex.MainRightMidSecondEnter] = self:FindVirtualCamera("CamFarMainRightMidSecondEnter"),
}
self.CameraNear = {
[CameraIndex.Main] = self:FindVirtualCamera("CamNearMain"),
[CameraIndex.MainEnter] = self:FindVirtualCamera("CamNearMainEnter"),
[CameraIndex.MainChatEnter] = self:FindVirtualCamera("CamNearMainChatEnter"),
[CameraIndex.MainRightMidSecondEnter] = self:FindVirtualCamera("CamNearMainRightMidSecondEnter"),
}
--主页面电量特效相关
local sceneRoot = self.UiSceneInfo.Transform
local animationRoot = self.UiSceneInfo.Transform:Find("Animations")
if XTool.UObjIsNil(animationRoot) then return end
if particleGroupName and particleGroupName ~= "" then
self.ChargeAnimator = sceneRoot:FindTransform(particleGroupName):GetComponent("Animator")
else
self.ChargeAnimator = nil
end
self.ToChargePD = sceneRoot:Find("Animations/ToChargeTimeLine")
self.ToFullPD = sceneRoot:Find("Animations/ToFullTimeLine")
self.FullPD = sceneRoot:Find("Animations/FullTimeLine")
self.ChargePD = sceneRoot:Find("Animations/ChargeTimeLine")
end
--- 清除场景引用,避免场景加载前使用
---@return void
--------------------------
function XUiMain:ClearSceneReference()
self.CameraFar = nil
self.CameraNear = nil
self.ChargeAnimator = nil
self.ToChargePD = nil
self.ToFullPD = nil
self.FullPD = nil
self.ChargePD = nil
end
function XUiMain:ChangeLowPowerPartical(state)
if self.ChargeAnimator then
if state == self.LowPowerState.Full then
self.ChargeAnimator:Play("Full")
elseif state == self.LowPowerState.Low then
self.ChargeAnimator:Play("Low")
elseif state == self.LowPowerState.LowToFull then
self.ChargeAnimator:Play("LowToFull")
elseif state == self.LowPowerState.FullToLow then
self.ChargeAnimator:Play("FullToLow")
end
end
end
function XUiMain:ChangeLowPowerTimeLine(state)
if self.ToChargePD then self.ToChargePD.gameObject:SetActiveEx(false) end
if self.ToFullPD then self.ToFullPD.gameObject:SetActiveEx(false) end
if self.FullPD then self.FullPD.gameObject:SetActiveEx(false) end
if self.ChargePD then self.ChargePD.gameObject:SetActiveEx(false) end
if state == self.LowPowerState.Full then
if self.FullPD then self.FullPD.gameObject:SetActiveEx(true) end
elseif state == self.LowPowerState.Low then
if self.ChargePD then self.ChargePD.gameObject:SetActiveEx(true) end
elseif state == self.LowPowerState.LowToFull then
if self.ToFullPD then self.ToFullPD.gameObject:SetActiveEx(true) end
elseif state == self.LowPowerState.FullToLow then
if self.ToChargePD then self.ToChargePD.gameObject:SetActiveEx(true) end
end
end
function XUiMain:ChangeLowPowerState(state)
self:ChangeLowPowerPartical(state)
self:ChangeLowPowerTimeLine(state)
end
function XUiMain:UpdateCamera(camera)
if not self.CameraFar or not self.CameraNear then
return
end
for _, cameraIndex in pairs(CameraIndex) do
local nearCamera = self.CameraNear[cameraIndex]
if not XTool.UObjIsNil(nearCamera) then
nearCamera.gameObject:SetActive(cameraIndex == camera)
end
local farCamera = self.CameraFar[cameraIndex]
if not XTool.UObjIsNil(farCamera) then
farCamera.gameObject:SetActive(cameraIndex == camera)
end
end
end
function XUiMain:UpdateRightMenu()
if self:IsShowTerminal() then
self:OnShowTerminal()
else
self:OnShowMain()
end
end
--播放主界面打开动画
function XUiMain:PlayEnterAnim()
local anim, endCb
if XLoginManager.IsFirstOpenMainUi() then
anim = "AnimEnter"
else
anim = "AnimReenter"
end
XLuaUiManager.SetMask(true)
endCb = function()
if XLoginManager.IsFirstOpenMainUi() then
anim = "AnimEnter2"
self:PlayAnimation(anim, endCb)
self:UpdateCamera(CameraIndex.Main)
self:PlayEquipGuide(true)
XLoginManager.SetFirstOpenMainUi(false)
--第一次进入界面,拦截公告请求
self.InterceptNotice = true
else
XLoginManager.SetStartGuide(true)
XEventManager.DispatchEvent(XEventId.EVENT_MAINUI_ENABLE)
XEventManager.DispatchEvent(XEventId.EVENT_CARD_REFRESH_WELFARE_BTN)
XLuaUiManager.SetMask(false)
if XDataCenter.DlcRoomManager.IsCanReconnect() then
XDataCenter.DlcRoomManager.ReconnectToRoom()
end
--发送公告请求
self:UpdateNotice()
--取消拦截公告
self.InterceptNotice = false
--动画播放完,再加载剩余主题
self:UpdateTheme()
end
end
self:PlayAnimation(anim, endCb)
end
--播放关闭聊天动画
function XUiMain:PlayMainChatOut()
self:SetSignPanelEnable(true)
self:UpdateCamera(CameraIndex.Main)
self:PlayAnimation("AnimChatIn")
end
--播放打开聊天动画
function XUiMain:PlayMainChatIn()
self:SetSignPanelEnable(false)
self.Other:Stop()
self:UpdateCamera(CameraIndex.MainChatEnter)
self:PlayAnimation("AnimChatOut")
end
--播放装备目标动画
function XUiMain:PlayEquipGuide(isFirst)
local isSetEquipTarget = XDataCenter.EquipGuideManager.IsSetEquipTarget()
if not isSetEquipTarget then
return
end
local anim = isFirst and "EquipGuideEnableLong" or "EquipGuideEnableShort"
self:PlayAnimation(anim, function()
self.RightMid:SetBtnEquipGuideState(false)
end, function()
self.RightMid:SetBtnEquipGuideState(true)
end)
end
-- 关闭周历
function XUiMain:OnHideCalendar()
self:SetSignPanelEnable(true)
self:PlayAnimationWithMask("LeftCalendarDisable")
self:PlayAnimation("LeftUiEnable")
end
-- 打开周历
function XUiMain:OnShowCalendar()
self:SetSignPanelEnable(false)
self.Other:Stop()
self:PlayAnimationWithMask("LeftCalendarEnable")
self:PlayAnimation("LeftUiDisable")
self.Calendar:Show()
end
-- 检查周历界面是否显示
function XUiMain:CheckCalenderShow()
if not self.Calendar then
return false
end
return self.Calendar:CheckIsShow()
end
function XUiMain:SetCacheFight()
if not self.IsFirstSetFight then
self.IsFirstSetFight = true
XDataCenter.SetManager.SetAllyDamageByCache()
XDataCenter.SetManager.SetAllyEffectByCache()
XDataCenter.SetManager.SetOwnFontSizeByCache()
XDataCenter.SetManager.SetDefaultFontSize()
XDataCenter.SetManager.SetScreenOff()
end
end
function XUiMain:SetScreenAdaptorCache()
if XDataCenter.SetManager.IsAdaptorScreen() and not XTool.UObjIsNil(self.SafeAreaContentPane) then
self.SafeAreaContentPane:UpdateSpecialScreenOff()
end
end
-- 设置福利按钮特效可见性
function XUiMain:SetBtnWelfareTagActive(active)
self.LeftBottom:SetBtnWelfareTagActive(active)
end
-- 回到主页按钮
function XUiMain:OnShowMain(playAnimation)
self:SetSignPanelEnable(true)
self:UpdateCamera(CameraIndex.Main)
--终端界面由隐藏变为显示不需要播放动画。重新打开界面则需要播一次
playAnimation = playAnimation or (self.NewOpen and self:IsShowTerminal())
if playAnimation then
self:PlayAnimationWithMask("RightMidSecondDisable")
self:PlayAnimation("RightEnable")
if self:CheckCalenderShow() then
self:PlayAnimation("LeftCalendarEnable")
else
self:PlayAnimation("LeftUiEnable")
end
end
RightMidType = MenuType.Main
end
-- 下一页按钮(主界面二级菜单)
function XUiMain:OnShowTerminal(playAnimation)
self.Other:Stop()
self:SetSignPanelEnable(false)
self:UpdateCamera(CameraIndex.MainRightMidSecondEnter)
--终端界面由隐藏变为显示不需要播放动画。重新打开界面则需要播一次
playAnimation = playAnimation or self.NewOpen
if playAnimation then
self:PlayAnimationWithMask("RightMidSecondEnable")
self:PlayAnimation("RightDisable")
if self:CheckCalenderShow() then
self:PlayAnimation("LeftCalendarDisable")
else
self:PlayAnimation("LeftUiDisable")
end
end
RightMidType = MenuType.Second
self.Terminal:Show()
end
function XUiMain:OnUiSceneLoaded(particleGroupName)
--self:SetGameObject()
self:InitSceneRoot(particleGroupName)
--self.Other.SignBoard = XUiPanelSignBoard.New(self.Other.PanelSignBoard, self, XUiPanelSignBoard.SignBoardOpenType.MAIN)
self.Other:SafeCreateSignBoard()
if XLoginManager.IsFirstOpenMainUi() then
self:SetBtnWelfareTagActive(false)
self:UpdateCamera(CameraIndex.MainEnter)
else
local camera = self:IsShowTerminal() and CameraIndex.MainRightMidSecondEnter or CameraIndex.Main
self:UpdateCamera(camera)
end
end
function XUiMain:IsShowTerminal()
return RightMidType == MenuType.Second
end
function XUiMain:PlayChangeModelEffect()
self.ChangeActionEffect = self.UiModelGo.transform:FindTransform("ChangeActionEffect")
if not self.ChangeActionEffect or XTool.UObjIsNil(self.ChangeActionEffect) then return end
self.ChangeActionEffect.gameObject:SetActiveEx(false)
self.ChangeActionEffect.gameObject:SetActiveEx(true)
end
-- v1.29 预览状态下切换
function XUiMain:OnBackGroupPreview()
if XDataCenter.PhotographManager.GetPreviewState() == XPhotographConfigs.BackGroundState.Full then --满电状态
self:ChangeLowPowerState(self.LowPowerState.Full)
else
self:ChangeLowPowerState(self.LowPowerState.Low)
end
end
-- v1.32 播放角色特殊动作Ui动画
-- ===================================================
function XUiMain:PlayRoleActionUiDisableAnim(signBoardid, stopTime)
XDataCenter.SignBoardManager.StartBreakTimer(stopTime)
-- 关闭福利按钮特效
self:SetBtnWelfareTagActive(false)
if XSignBoardConfigs.CheckIsUseNormalUiAnim(signBoardid, self.Name) then
self:PlayAnimation("UiDisable")
end
end
function XUiMain:PlayRoleActionUiEnableAnim(signBoardid)
-- 检查福利按钮特效
self.LeftBottom:OnRefreshFirstRechargeId()
if XSignBoardConfigs.CheckIsUseNormalUiAnim(signBoardid, self.Name) then
self:PlayAnimationWithMask("UiEnable")
end
end
function XUiMain:PlayRoleActionUiBreakAnim()
self:PlayAnimationWithMask("DarkEnable", function ()
self.Other:Stop()
self:PlayAnimationWithMask("DarkDisable")
-- 检查福利按钮特效
self.LeftBottom:OnRefreshFirstRechargeId()
end)
end
-- 禁用角色动作
function XUiMain:SetSignPanelEnable(enable)
self.Other:SetSignBoardEnable(enable)
end
-- ===================================================
--- 每次返回主界面检查是否需要弹出公告
--------------------------
function XUiMain:UpdateNotice()
if self:IsShowTerminal() or XLoginManager.IsFirstOpenMainUi()
or self.InterceptNotice then
return
end
XDataCenter.NoticeManager.RequestInGameNotice(function()
if XLuaUiManager.GetTopUiName() == "UiMain" then
XDataCenter.NoticeManager.AutoOpenInGameNotice()
end
end)
end
--region ------------------UI主题 start-------------------
function XUiMain:UpdateTheme()
if not XTool.IsNumberValid(self.CurSceneId) then
return
end
local curSceneId = self.CurSceneId
local theme = XUiConfigs.GetUiTheme(curSceneId)
local colors = {}
for _, colorStr in ipairs(theme.Color) do
local color = XUiHelper.Hexcolor2Color(colorStr)
table.insert(colors, color)
end
---@type ThemeData
local themeTemplate = {
Colors = colors,
Backgrounds = theme.Background,
Effects = theme.Effect,
}
self.LeftBottom:UpdateTheme(themeTemplate)
self.LeftTop:UpdateTheme(themeTemplate)
self.Other:UpdateTheme(themeTemplate)
self.RightBottom:UpdateTheme(themeTemplate)
self.RightMid:UpdateTheme(themeTemplate)
self.RightTop:UpdateTheme(themeTemplate)
self.Terminal:UpdateTheme(themeTemplate)
self.Calendar:UpdateTheme(themeTemplate)
end
function XUiMain:InitTheme()
self.LeftBottom:InitTheme()
self.LeftTop:InitTheme()
self.Other:InitTheme()
self.RightBottom:InitTheme()
self.RightMid:InitTheme()
self.RightTop:InitTheme()
self.Terminal:InitTheme()
self.Calendar:InitTheme()
end
--endregion------------------UI主题 finish------------------