local tableUnpack = table.unpack XUi = XClass(nil, "XUi") function XUi:Ctor(name, ui) self.Name = name self.CsUi = ui self.Transform = ui.Transform self.GameObject = ui.GameObject self.UiAnimation = ui.UiAnimation end function XUi:OnOpen() end function XUi:OnClose() end function XUi:OnShow() end function XUi:OnHide() end function XUi:SetUiSprite(image, name, callBack) if not XTool.UObjIsNil(self.CsUi) then self.CsUi:SetUiSprite(image, name, callBack) end end local TipMsgQueue --重复弹条提示队列 local ClearMsgEvent local CurrentTipState -- 弹条状态 local TipState = { IDLE = 1, SHOWING = 2, LOCK = 3 } XUiManager = XUiManager or {} function XUiManager.Init() CurrentTipState = TipState.IDLE TipMsgQueue = XQueue.New() XUiManager.IsHideFunc = CS.XRemoteConfig.IsHideFunc end local ClassTable = {} local ClassObj = {} function XUiManager.Register(name, super) super = super or XUi --CS.XUiManager.Register(name) local class = XClass(super, name) ClassTable[name] = class return class end function XUiManager.FindClassType(name) for k, v in pairs(ClassObj) do if k == name then return v end end return nil end function XUiManager.RemoveClassType(name) for k, _ in pairs(ClassObj) do if k == name then ClassObj[k] = nil end end end function XUiManager.New(name, ui) local baseName = name local class = ClassTable[baseName] if not class then baseName = string.match(baseName, '%w*[^(%d)$*]') -- 解析包含数字后缀的界面 class = ClassTable[baseName] if not class then XLog.Error("XUiManager.New error, class not exist, name: " .. name) return nil end end local obj = class.New(name, ui) ClassObj[name] = obj return obj end --XUiManager.XUiEvent = { -- Show = 1, -- Hide = 2, -- Open = 3, -- Close = 4, --} XUiManager.UiTipType = { Tip = 1, Wrong = 2, Success = 3, } XUiManager.DialogType = { Normal = "Normal", OnlyClose = "OnlyClose", OnlySure = "OnlySure", NoBtn = "NoBtn", NormalAndNoBtnTanchuangClose = "NormalAndNoBtnTanchuangClose", Passport = "Passport",--海外新增,因为日服要显示购买二级弹窗链接 } XUiManager.IsHideFunc = false function XUiManager.ClearTipMsgQueue() CurrentTipState = TipState.IDLE TipMsgQueue:Clear() end function XUiManager.TipMsgEnqueue(msg, type, cb, hideCloseMark) if CurrentTipState == TipState.IDLE then XUiManager.TipMsg(msg, type, cb, hideCloseMark) else local msgData = { msg, type, cb, hideCloseMark } TipMsgQueue:Enqueue(msgData) ClearMsgEvent = ClearMsgEvent or XEventManager.AddEventListener(XEventId.EVENT_MAINUI_ENABLE, XUiManager.ClearTipMsgQueue) end end function XUiManager.TipMsgDequeue() if CurrentTipState == TipState.SHOWING then return end local msgData = TipMsgQueue:Dequeue() if msgData then XUiManager.TipMsg(tableUnpack(msgData)) else XEventManager.RemoveEventListener(XEventId.EVENT_MAINUI_ENABLE, XUiManager.ClearTipMsgQueue) ClearMsgEvent = nil end end function XUiManager.TipMsg(msg, type, cb, hideCloseMark) if not msg then XLog.Error("XUiManager.TipMsg error, msg is nil") return end if not type then type = XUiManager.UiTipType.Tip end if CurrentTipState == TipState.SHOWING then return end CurrentTipState = TipState.SHOWING CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Tip_small) local callback = function() if cb then cb() end CurrentTipState = TipState.IDLE XUiManager.TipMsgDequeue() end --CS.XUiManager.TipsManager:Push("UiTipLayer", true, true, msg, type) XLuaUiManager.Open("UiTipLayer", msg, type, callback, hideCloseMark) end function XUiManager.TipText(key, type, isEnqueue, ...) if not type then type = XUiManager.UiTipType.Wrong end local text = XUiHelper.GetText(key, ...) if isEnqueue then XUiManager.TipMsgEnqueue(text, type) else XUiManager.TipMsg(text, type) end end function XUiManager.TipSuccess(msg, hideCloseMark) XUiManager.TipMsg(msg, XUiManager.UiTipType.Success, nil, hideCloseMark) end function XUiManager.TipError(msg) XUiManager.TipMsg(msg, XUiManager.UiTipType.Wrong) end function XUiManager.TipErrorWithKey(key, ...) XUiManager.TipError(XUiHelper.GetText(key, ...)) end function XUiManager.TipCode(code, ...) local text = CS.XTextManager.GetCodeText(code, ...) if code == XCode.Success then XUiManager.TipSuccess(text) else XUiManager.TipError(text) end end function XUiManager.DialogTip(title, content, dialogType, closeCallback, sureCallback, extraData) if not title and not content then XLog.Error("XUiManager.DialogTip error, title and content is nil") return end dialogType = dialogType or XUiManager.DialogType.Normal CsXGameEventManager.Instance:Notify(XEventId.EVENT_UIDIALOG_VIEW_ENABLE) CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Tip_Big) --CS.XUiManager.DialogManager:Push("UiDialog", true, true, title, content, dialogType, closeCallback, sureCallback) XLuaUiManager.Open("UiDialog", title, content, dialogType, closeCallback, sureCallback, extraData) end function XUiManager.DialogDragTip(title, content, dialogType, closeCallback, sureCallback, extraData) if not title and not content then XLog.Error("XUiManager.DialogTip error, title and content is nil") return end dialogType = dialogType or XUiManager.DialogType.Normal CsXGameEventManager.Instance:Notify(XEventId.EVENT_UIDIALOG_VIEW_ENABLE) CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Tip_Big) XLuaUiManager.Open("UiDialogDrag", title, content, dialogType, closeCallback, sureCallback, extraData) end --带今日内不再提示选项的提示框 function XUiManager.DialogHintTip(title, content, content2, closeCallback, sureCallback, hintInfo) CsXGameEventManager.Instance:Notify(XEventId.EVENT_UIDIALOG_VIEW_ENABLE) CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Tip_Big) XLuaUiManager.Open("UiCueMark", title, content, content2, closeCallback, sureCallback, hintInfo) end --弹出系统提示 function XUiManager.SystemDialogTip(title, content, dialogType, closeCallback, sureCallback) if not title or not content then XLog.Error("XUiManager.SystemDialogTip error, title or content is nil") return end if not XUiManager.DialogType[dialogType] then XLog.Error("XUiManager.SystemDialogTip error, dialogType is error") return end CsXGameEventManager.Instance:Notify(XEventId.EVENT_UIDIALOG_VIEW_ENABLE) CS.XAudioManager.PlaySound(XSoundManager.UiBasicsMusic.Tip_Big) XLuaUiManager.Open("UiSystemDialog", title, content, dialogType, closeCallback, sureCallback) end -- 显示帮助界面 -- Param:cb 关闭帮助界面时执行的回调 function XUiManager.ShowHelpTip(helpDataKey, cb) local config = XHelpCourseConfig.GetHelpCourseTemplateByFunction(helpDataKey) if not config then return end if config.IsShowCourse == 1 then XLuaUiManager.Open("UiHelp", config, cb) else XUiManager.UiFubenDialogTip(config.Name, config.Describe) end end function XUiManager.ShowHelpTipNew(getHelpDataFunc, cb) if not getHelpDataFunc then XLog.Error("XUiManager.ShowHelpTipNew Error: GetHelpDataFunc is Nil") return end local helpData = getHelpDataFunc() if not helpData or not next(helpData) then return end XLuaUiManager.Open("UiHelpNew", helpData, cb) end function XUiManager.UiFubenDialogTip(title, content, closeCallback, sureCallback) if not title or not content then XLog.Error("XUiManager.UiFubenDialog error, title or content is nil") return end CS.XAudioManager.PlaySound(1100) XLuaUiManager.Open("UiFubenDialog", title, content, closeCallback, sureCallback) end function XUiManager.OpenBuyAssetPanel(id, successCallback) XDataCenter.ItemManager.SelectBuyAssetType(id, successCallback, nil, nil) end function XUiManager.OpenUiObtain(data, title, closeCallback, sureCallback, horizontalNormalizedPosition) XLuaUiManager.Open("UiObtain", data, title, closeCallback, sureCallback, horizontalNormalizedPosition) end function XUiManager.OpenUiTipReward(data, title, closeCallback, sureCallback) XLuaUiManager.Open("UiTipReward", data, title, closeCallback, sureCallback) end function XUiManager.OpenUiTipRewardByRewardId(id, title, closeCallback, sureCallback, extraTip) local data = XRewardManager.GetRewardList(id) if not data then return end XLuaUiManager.Open("UiTipReward", data, title, closeCallback, sureCallback, extraTip) end function XUiManager.OpenMainUi() local guideFight = XDataCenter.GuideManager.GetNextGuideFight() if guideFight then XLuaUiManager.Close("UiGuide") XDataCenter.FubenManager.EnterGuideFight(guideFight.Id, guideFight.StageId, guideFight.NpcId, guideFight.Weapon) else XLuaUiManager.RunMain() end end function XUiManager.CheckTopUi(type, name) local ui = CsXUiManager.Instance:GetTopUi(type) return ui.UiData.UiName == name end function XUiManager.OpenPopWebview(url, title) --如果是PC正常使用URL跳转,手机平台才用WEB VIEW打开 if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsEditor or CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer then CS.UnityEngine.Application.OpenURL(url) else XLuaUiManager.Open("UiLoginNotice", { HtmlUrl = url, Title = title and XUiHelper.RichTextToTextString(title) or CS.XTextManager.GetText("Agreement"), isFullUrl = true }) end end function XUiManager.OpenGoodDetailUi(goodId, fromUiName, customData, hideSkipBtn) -- 匹配中 if XDataCenter.FubenUnionKillRoomManager.IsMatching() then return end local goodsShowParams = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(goodId) local uiType = XLuaUiManager.FindTopUi(fromUiName).UiProxy.Ui.UiData.UiType if goodsShowParams.RewardType == XRewardManager.XRewardType.Character then --从Tips的ui跳转需要关闭Tips的UI if uiType == CsXUiType.Tips then XLuaUiManager.Close(fromUiName) end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() XLuaUiManager.Open("UiCharacterDetail", goodId) elseif goodsShowParams.RewardType == XRewardManager.XRewardType.Equip then XLuaUiManager.Open("UiEquipDetail", goodId, true) --从Tips的ui跳转需要关闭Tips的UI if uiType == CsXUiType.Tips then XLuaUiManager.Close(fromUiName) end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() elseif goodsShowParams.RewardType == XRewardManager.XRewardType.Furniture then local cfg = XFurnitureConfigs.GetFurnitureReward(goodId) local furnitureRewardId = goodId local configId = cfg.FurnitureId XLuaUiManager.Open("UiFurnitureDetail", customData.InstanceId, configId, furnitureRewardId, nil, true) elseif goodsShowParams.RewardType == XRewardManager.XRewardType.Fashion then local buyData if customData and customData.ItemCount and customData.ItemIcon and customData.BuyCallBack then buyData = {} local isHave, isLimitTime = XRewardManager.CheckRewardOwn(goodsShowParams.RewardType, goodsShowParams.TemplateId) buyData.IsHave = isHave and not isLimitTime buyData.ItemIcon = customData.ItemIcon buyData.ItemCount = customData.ItemCount buyData.BuyCallBack = customData.BuyCallBack end XLuaUiManager.Open("UiFashionDetail", goodId, false, buyData) elseif goodsShowParams.RewardType == XRewardManager.XRewardType.Partner then --从Tips的ui跳转需要关闭Tips的UI if uiType == CsXUiType.Tips then XLuaUiManager.Close(fromUiName) end -- 暂停自动弹窗 XDataCenter.AutoWindowManager.StopAutoWindow() local partnerData = { Id = 0, TemplateId = goodId } local partner = XDataCenter.PartnerManager.CreatePartnerEntityByPartnerData(partnerData, true) XLuaUiManager.Open("UiPartnerPreview", partner) elseif XDataCenter.ItemManager.IsWeaponFashion(goodId) then local weaponFashionId = XDataCenter.ItemManager.GetWeaponFashionId(goodId) XLuaUiManager.Open("UiFashionDetail", weaponFashionId, true) elseif goodsShowParams.RewardType == XRewardManager.XRewardType.Nameplate then XLuaUiManager.Open("UiNameplateTip", goodId, true, true) else XLuaUiManager.Open("UiTip", customData and customData or goodId, hideSkipBtn, fromUiName) end end XUiManager.Init()