PGRData/Resources/Scripts/XManager/XLuaUiManager.lua
2022-12-26 14:06:01 +05:30

612 lines
No EOL
18 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.

-------------------------------------------------------------------------------------------------------------
CsXUiType = CS.XUiType
-- CsXUiResType = CS.XUiResType
CsXUiManager = CS.XUiManager
-- CsIBaseEventListener = CS.IBaseEventListener
CsXGameEventManager = CS.XGameEventManager
-- CsXLuaEventProxy = CS.XLuaEventProxy
-- CsXUi = CS.XUi
-- CsXChildUi = CS.XChildUi
-- CsXGameUi = CS.XGameUi
-- CsXMaskManager = CS.XMaskManager
-- CsXUguiEventListener = CS.XUguiEventListener
-- CsXUiData = CS.XUiData
-- CsXUiStackContainer = CS.XUiStackContainer
-- CsXUiListContainer = CS.XUiListContainer
-- CsXUiChildContainer = CS.XUiChildContainer
CsXUiHelper = CS.XUiHelper
CsXTextManagerGetText = CS.XTextManager.GetText
CSXTextManagerGetText = CsXTextManagerGetText
------------------------------------------------LuaUI---------------------------------------------------------
XLuaUi = XClass(nil, "XLuaUi")
function XLuaUi:Ctor(name, uiProxy)
self.Name = name
self.UiProxy = uiProxy
self.Ui = uiProxy.Ui
-- 页面自动关闭时间id
self.AutoCloseTimerId = nil
self.OpenAutoClose = false
self.AutoCloseEndTime = 0
self.AutoCloseCallback = nil
self.AutoCloseIntervalTime = nil
self.AutoCloseDelayTime = nil
end
-- PS:如果页面重写了OnEnable和OnDisable使用时必须在OnEnable和OnDisable调用下父类方法
-- XXX.Super.OnEnable(self)
-- interval : 间隔多少毫秒执行,默认是一秒
-- delay : 初次延迟多少毫秒执行,默认是一秒
function XLuaUi:SetAutoCloseInfo(endTime, callback, interval, delay)
interval = interval or XScheduleManager.SECOND
delay = delay or XScheduleManager.SECOND
self.OpenAutoClose = true
self.AutoCloseEndTime = endTime
self.AutoCloseCallback = callback
self.AutoCloseIntervalTime = interval
self.AutoCloseDelayTime = delay
end
function XLuaUi:SetGameObject()
self.Transform = self.Ui.Transform
self.GameObject = self.Ui.GameObject
self.UiAnimation = self.Ui.UiAnimation
self.UiSceneInfo = self.Ui.UiSceneInfo
self.UiModelGo = self.Ui.UiModelGo
self.UiModel = self.Ui.UiModel
self:InitUiObjects()
end
function XLuaUi:OnAwake()
end
function XLuaUi:OnStart()
end
function XLuaUi:OnEnable()
if self.OpenAutoClose then
self:_StartAutoCloseTimer()
end
end
function XLuaUi:OnDisable()
if self.OpenAutoClose then
self:_StopAutoCloseTimer()
end
end
function XLuaUi:OnDestroy()
end
function XLuaUi:_StartAutoCloseTimer()
self.AutoCloseTimerId = XScheduleManager.ScheduleForever(function()
local time = XTime.GetServerNowTimestamp()
if time > self.AutoCloseEndTime then
if self.AutoCloseCallback then
self.AutoCloseCallback(true)
end
self:_StopAutoCloseTimer()
else
if self.AutoCloseCallback then
self.AutoCloseCallback(false)
end
end
-- PS:-1 * self.AutoCloseIntervalTime 这么处理是因为XScheduleManager.ScheduleForever里计算时间自动叠加多一次Interval
end, self.AutoCloseIntervalTime, self.AutoCloseDelayTime + -1 * self.AutoCloseIntervalTime)
end
function XLuaUi:_StopAutoCloseTimer()
if self.AutoCloseTimerId then
XScheduleManager.UnSchedule(self.AutoCloseTimerId)
self.AutoCloseTimerId = nil
end
end
function XLuaUi:OnReleaseInstOnly()
XLuaUiManager.SetUiData(self.Name, self:OnReleaseInst())
end
function XLuaUi:OnReleaseInst()
end
function XLuaUi:OnResumeUi()
self:OnResume(XLuaUiManager.GetUiData(self.Name))
XLuaUiManager.RemoveUiData(self.Name)
end
function XLuaUi:OnResume()
end
--用于释放lua的内存
function XLuaUi:OnRelease()
--self.Name = nil
self.UiProxy = nil
self.Ui = nil
self.Transform = nil
self.GameObject = nil
self.UiAnimation = nil
self.UiSceneInfo = nil
self.UiModelGo = nil
self.UiModel = nil
if self.Obj and self.Obj:Exist() then
local nameList = self.Obj.NameList
for _, v in pairs(nameList) do
self[v] = nil
end
self.Obj = nil
end
for k, v in pairs(self) do
local t = type(v)
if t == 'userdata' and CsXUiHelper.IsUnityObject(v) then
self[k] = nil
end
end
end
--CS.XEventId.EVENT_UI_ALLOWOPERATE 允许UI操作事件可以理解为动画播放完成后的回调
function XLuaUi:OnNotify(evt, ...)
end
function XLuaUi:OnGetEvents()
end
function XLuaUi:SetUiSprite(image, spriteName, callBack)
self.UiProxy:SetUiSprite(image, spriteName, callBack)
end
--快捷隐藏界面(不建议使用)
function XLuaUi:SetActive(active)
local temp = active and true or false
self.UiProxy:SetActive(temp)
end
--快捷关闭界面
function XLuaUi:Close()
if self.UiProxy == nil then
XLog.Error(self.Name .. "重复Close")
else
self.UiProxy:Close()
end
end
--快捷移除UI,移除的UI不会播放进场、退场动画
--不允许用于移除栈顶的UI 使用时注意!!!
function XLuaUi:Remove()
if self.UiProxy then
self.UiProxy:Remove()
end
end
--注册点击事件
function XLuaUi:RegisterClickEvent(button, handle, clear)
clear = clear and true or false
self.UiProxy:RegisterClickEvent(button, function(eventData)
if handle then
handle(self, eventData)
end
end, clear)
end
--返回指定名字的子节点的Component
--@name 子节点名称
--@type Component类型
function XLuaUi:FindComponent(name, type)
return self.UiProxy:FindComponent(name, type)
end
--通过名字查找GameObject 例如:A/B/C
--@name 要查找的名字
function XLuaUi:FindGameObject(name)
return self.UiProxy:FindGameObject(name)
end
--通过名字查找Transfrom 例如:A/B/C
--@name 要查找的名字
function XLuaUi:FindTransform(name)
return self.UiProxy:FindTransform(name)
end
--打开一个子UI
--@childUIName 子UI名字
--@... 传到OnStart的参数
function XLuaUi:OpenChildUi(childUIName, ...)
self.UiProxy:OpenChildUi(childUIName, ...)
end
--打开一个子UI,会关闭其他已显示的子UI
--@childUIName 子UI名字
--@... 传到OnStart的参数
function XLuaUi:OpenOneChildUi(childUIName, ...)
self.UiProxy:OpenOneChildUi(childUIName, ...)
--self.UiProxy:OpenOneChildUi(childUIName, ...)
end
--关闭子UI
--@childUIName 子UI名字
function XLuaUi:CloseChildUi(childUIName)
self.UiProxy:CloseChildUi(childUIName)
end
--查找子窗口对应的lua对象
--@childUiName 子窗口名字
function XLuaUi:FindChildUiObj(childUiName)
local childUi = self.UiProxy:FindChildUi(childUiName)
if childUi then
return childUi.UiProxy.UiLuaTable
end
end
function XLuaUi:InitUiObjects()
self.Obj = self.Transform:GetComponent("UiObject")
if self.Obj ~= nil then
for i = 0, self.Obj.NameList.Count - 1 do
self[self.Obj.NameList[i]] = self.Obj.ObjList[i]
end
end
end
function XLuaUi:InitChildUis()
if self.Ui == nil then
return
end
if not self.Ui.UiData.HasChildUi then
return
end
local childUis = self.Ui:GetAllChildUis()
if childUis == nil then
return
end
--子UI初始化完成后可在父UI通过self.Child+子UI名称的方式直接获取句柄
local childUiName
for k, v in pairs(childUis) do
childUiName = "Child" .. k
if self[childUiName] then
XLog.Error(string.format("%s该名字已被占用", childUiName))
else
self[childUiName] = v.UiProxy.UiLuaTable
end
end
end
--播放动画只支持Timeline模式
-- 符合以下命名的动画将会自动播放无须手动调用AnimStart、AnimEnable、AnimDisable、AnimDestroy
function XLuaUi:PlayAnimation(animName, callback, beginCallback, wrapMode)
self.UiProxy:PlayAnimation(animName, callback, beginCallback, wrapMode or CS.UnityEngine.Playables.DirectorWrapMode.Hold)
end
--播放动画只支持Timeline模式, 增加Mask阻止操作打断动画
function XLuaUi:PlayAnimationWithMask(animName, callback, beginCallback, wrapMode)
self.UiProxy:PlayAnimation(animName, function(state)
XLuaUiManager.SetMask(false)
if callback then callback(state) end
end, function()
XLuaUiManager.SetMask(true)
if beginCallback then beginCallback() end
end, wrapMode or CS.UnityEngine.Playables.DirectorWrapMode.Hold)
end
--获取Open传递的参数
function XLuaUi:GetArgs()
return self.UiProxy:GetArgs()
end
-- 加载(切换)ui场景
function XLuaUi:LoadUiScene(sceneUrl, modelUrl, cb, force)
if force == nil then
force = true
end
self.Ui:LoadUiScene(sceneUrl, modelUrl, force)
if cb then
cb(sceneUrl, modelUrl)
end
end
-- 根据名字查找虚拟相机位置
function XLuaUi:FindVirtualCamera(virtualCamName)
local virtualCamTrans = nil
local sceneVirtualCamRoot = self.UiSceneInfo.Transform:FindTransform("UiCamContainer")
if sceneVirtualCamRoot then
virtualCamTrans = sceneVirtualCamRoot:FindTransform(virtualCamName)
if virtualCamTrans then
return virtualCamTrans
end
end
virtualCamTrans = self.UiModelGo:FindTransform(virtualCamName)
return virtualCamTrans
end
-- 默认ui场景路径
function XLuaUi:GetDefaultSceneUrl()
return self.Ui.UiData.SceneUrl
end
-- 默认ui场景模型路径
function XLuaUi:GetDefaultUiModelUrl()
return self.Ui.UiData.UiModelUrl
end
-- 绑定帮助按钮
function XLuaUi:BindHelpBtn(btn, helpDataKey, cb)
if not btn then
XLog.Error("XLuaUi.BindHelpBtn Error: Buttton Is Nil")
return
end
if not helpDataKey then
XLog.Error("XLuaUi.BindHelpBtn Error: HelpDataKey Is Nil")
return
end
if CS.XTool.ConfirmObjectType(btn, "XUiButton") then
btn.CallBack = function() XUiManager.ShowHelpTip(helpDataKey, cb) end
return
end
if CS.XTool.ConfirmObjectType(btn, "Button") then
self:RegisterClickEvent(btn, function() XUiManager.ShowHelpTip(helpDataKey, cb) end)
return
end
XLog.Error("XLuaUi.BindHelpBtn Faild")
end
function XLuaUi:BindHelpBtnNew(btn, getHelpDataFunc, cb)
if not btn then
XLog.Error("XLuaUi.BindHelpBtn Error: Buttton Is Nil")
return
end
if not getHelpDataFunc then
XLog.Error("XLuaUi.BindHelpBtn Error: GetHelpDataFunc Is Nil")
return
end
if CS.XTool.ConfirmObjectType(btn, "XUiButton") then
btn.CallBack = function() XUiManager.ShowHelpTipNew(getHelpDataFunc, cb) end
return
end
if CS.XTool.ConfirmObjectType(btn, "Button") then
self:RegisterClickEvent(btn, function() XUiManager.ShowHelpTipNew(getHelpDataFunc, cb) end)
return
end
XLog.Error("XLuaUi.BindHelpBtnNew Faild")
end
function XLuaUi:BindHelpBtnOnly(btn)
-- TODO 对帮助按钮进行统一隐藏
end
-- function XLuaUi:GetUiModelRoot()
-- return self.UiModel.UiModelParent
-- end
------------------------------------------------------------------------------------------------------------------------
XLuaUiManager = XClass(nil, "XLuaUiManager")
local UiData = {}
local ClassType = {}
--注册UI
-- @super 父类
-- @uiName UI名字
function XLuaUiManager.Register(super, uiName)
super = super or XLuaUi
local uiObject = XClass(super, uiName)
ClassType[uiName] = uiObject
return uiObject
end
--创建一个LuaUI的实例
--@name LuaUI脚本名字
--@gameUI C#的GameUI
function XLuaUiManager.New(uiName, uiProxy)
local baseName = uiName
local class = ClassType[baseName]
if not class then
baseName = string.match(baseName, '%w*[^(%d)$*]') -- 解析包含数字后缀的界面
class = ClassType[baseName]
if not class then
XLog.Error("XLuaUiManager.New error, class not exist, name: " .. uiName)
return nil
end
end
local obj = class.New(uiName, uiProxy)
uiProxy:SetLuaTable(obj)
return obj
end
--打开UI
--@uiName 打开的UI名字
function XLuaUiManager.Open(uiName, ...)
CsXUiManager.Instance:Open(uiName, ...)
end
--打开UI完成后执行回调
--@uiName 打开的UI名称
--@callback 打开完成回调
--@... 传递到OnStart的参数
function XLuaUiManager.OpenWithCallback(uiName, callback, ...)
CsXUiManager.Instance:OpenWithCallback(uiName, callback, ...)
end
--关闭UI完成后执行回调
--@uiName 打开的UI名称
--@callback 打开完成回调
function XLuaUiManager.CloseWithCallback(uiName, callback)
CsXUiManager.Instance:CloseWithCallback(uiName, callback)
end
--针对Normal类型的管理关闭上一个界面然后打开下一个界面无缝切换
--@uiName 需要打开的UI名字
--@... 传递到OnStart的参数
function XLuaUiManager.PopThenOpen(uiName, ...)
CsXUiManager.Instance:PopThenOpen(uiName, ...)
end
--针对Normal类型的管理关闭栈中所有界面然后打开下一个界面无缝切换
--@uiName 需要打开的UI名字
--@... 传递到OnStart的参数
function XLuaUiManager.PopAllThenOpen(uiName, ...)
CsXUiManager.Instance:PopAllThenOpen(uiName, ...)
end
--关闭UI
--@uiName 关闭的UI名字(只能关闭当前显示的UI)
function XLuaUiManager.Close(uiName)
CsXUiManager.Instance:Close(uiName)
end
--移除UI,移除的UI不会播放进场、退场动画
--@uiName 关闭的UI名字可以关闭非当前显示UI
function XLuaUiManager.Remove(uiName)
CsXUiManager.Instance:Remove(uiName)
end
--某个UI是否显示
function XLuaUiManager.IsUiShow(uiName)
return CsXUiManager.Instance:IsUiShow(uiName)
end
--某个UI是否已经加载
function XLuaUiManager.IsUiLoad(uiName)
return CsXUiManager.Instance:IsUiLoad(uiName)
end
--设置maskvisible=true时不能操作
function XLuaUiManager.SetMask(visible)
visible = visible and true or false
CsXUiManager.Instance:SetMask(visible)
end
--设置animationMasktag标签,visible=true时不能操作delay(默认2秒)后会展示菊花
function XLuaUiManager.SetAnimationMask(tag, visible, delay)
visible = visible and true or false
CsXUiManager.Instance:SetAnimationMask(tag, visible, delay)
end
function XLuaUiManager.ClearMask(resetMaskCount)
resetMaskCount = resetMaskCount and true or false
CsXUiManager.Instance:ClearMask(resetMaskCount)
end
function XLuaUiManager.ClearAnimationMask()
CsXUiManager.Instance:ClearAnimationMask()
end
function XLuaUiManager.ClearAllMask(resetMaskCount)
XLuaUiManager.ClearMask(resetMaskCount)
CsXUiManager.Instance:ClearAnimationMask()
end
--返回主界面
function XLuaUiManager.RunMain(notDialogTip)
if XDataCenter.RoomManager.RoomData then
if notDialogTip then
XDataCenter.RoomManager.Quit(function()
CsXUiManager.Instance:RunMain()
end)
return
end
-- 如果在房间中,需要先弹确认框
local title = CsXTextManagerGetText("TipTitle")
local cancelMatchMsg
local stageId = XDataCenter.RoomManager.RoomData.StageId
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then
cancelMatchMsg = CsXTextManagerGetText("ArenaOnlineInstanceQuitRoom")
else
cancelMatchMsg = CsXTextManagerGetText("OnlineInstanceQuitRoom")
end
XUiManager.DialogTip(title, cancelMatchMsg, XUiManager.DialogType.Normal, nil, function()
XDataCenter.RoomManager.Quit(function()
CsXUiManager.Instance:RunMain()
end)
end)
elseif XDataCenter.RoomManager.Matching then
if notDialogTip then
XDataCenter.RoomManager.CancelMatch(function()
CsXUiManager.Instance:RunMain()
end)
return
end
local title = CsXTextManagerGetText("TipTitle")
local cancelMatchMsg = CsXTextManagerGetText("OnlineInstanceCancelMatch")
XUiManager.DialogTip(title, cancelMatchMsg, XUiManager.DialogType.Normal, nil, function()
XDataCenter.RoomManager.CancelMatch(function()
CsXUiManager.Instance:RunMain()
end)
end)
else
local unionFightData = XDataCenter.FubenUnionKillRoomManager.GetUnionRoomData()
local unionInfo = XDataCenter.FubenUnionKillManager.GetUnionKillInfo()
local inActivity = false
if unionInfo and unionInfo.Id and unionInfo.Id > 0 then
inActivity = XFubenUnionKillConfigs.UnionKillInActivity(unionInfo.Id)
end
if inActivity and unionFightData and unionFightData.Id then
local title = CsXTextManagerGetText("TipTitle")
local cancelMatchMsg = CsXTextManagerGetText("UnionKillExitRoom")
XUiManager.DialogTip(title, cancelMatchMsg, XUiManager.DialogType.Normal, nil, function()
XDataCenter.FubenUnionKillRoomManager.LeaveUnionTeamRoom(function()
CsXUiManager.Instance:RunMain()
end)
end)
else
if XLoginManager.IsFirstOpenMainUi() then
CS.XCustomUi.Instance:GetData()
end
CsXUiManager.Instance:RunMain()
end
end
end
function XLuaUiManager.ShowTopUi()
CsXUiManager.Instance:ShowTopUi()
end
--获取ui状态
function XLuaUiManager.GetUiData(uiName)
if UiData then
return UiData[uiName]
end
end
--缓存ui状态
function XLuaUiManager.SetUiData(uiName, data)
UiData = UiData and UiData or {}
UiData[uiName] = data
end
function XLuaUiManager.RemoveUiData(uiName)
if UiData then
UiData[uiName] = nil
end
end