--lua端的窗口管理器 LuaViewManager = LuaViewManager or BaseClass(EventDispatcher) local LuaViewManager = LuaViewManager local rawget = rawget local SetGameFrameRate = SetGameFrameRate local Time = Time local IsTableEmpty = IsTableEmpty local math_ceil = math.ceil LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE = "LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE" LuaViewManager.SHORT_CHANGE_MAIN_CANVAS_VISIBLE = "LuaViewManager.SHORT_CHANGE_MAIN_CANVAS_VISIBLE" LuaViewManager.HIDE_ITEM_USE_VIEW = "LuaViewManager.HIDE_ITEM_USE_VIEW" LuaViewManager.PUSH_VIEWS_OUT_SCREEN = "LuaViewManager.PUSH_VIEWS_OUT_SCREEN" LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE = "LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE" function LuaViewManager:__init() LuaViewManager.Instance = self self.maskIdPool = { maxID = 1, list = {}, Pop = function(self) local length = #self.list if length > 0 then local result = self.list[length] table.remove(self.list, length) return result else if self.maxID == 255 then logWarn("MaskID分配已到达上限!!") return nil else self.maxID = self.maxID + 2 return self.maxID - 2 end end end, Push = function(self, mid) table.insert(self.list, mid) end, } self.view_ctl_queue = {} self.view_id = 0 self.view_activity_ctl_queue = {}--活动层级界面堆栈 self.act_view_id = 0 self.all_view_queue = {} --所有界面 self.main_canvas_visible_timer = false --主界面画布,延时显示处理 self.update_main_canvas_time = 0 --资源预加载,场景切完之后 local function scene_load_view_complete() -- if not self.has_load_res then -- self.has_load_res = true self.pre_load_res_list = { {name = "mrsd_xuanzhong_001", is_static = true}, {name = "mrsd_skills_skybox01", is_static = true}, {name = "effect_beibao_1_1", is_static = true}, {name = "effect_beibao_1_2", is_static = true}, {name = "effect_beibao_1_3", is_static = true}, {name = "effect_beibao_2_1", is_static = true}, {name = "effect_beibao_3_1", is_static = true}, {name = "effect_beibao_3_2", is_static = true}, {name = "ui_kaizhan", is_static = true}, {name = "effect_monster_born", is_static = false}, {name = "effect_transmit_flydown2", is_static = false}, {name = "effect_transmit_flydown3", is_static = false}, } local role_level = RoleManager.Instance.mainRoleInfo.level local scene_id = SceneManager:getInstance():GetSceneId() if role_level <= 80 then self.story_res_list = self.story_res_list or { [1001] = { max_level = 20, res_list = { {name = "model_clothe_20010004", is_static = false}, {name = "model_clothe_20030007", is_static = false}, }, }, [1002] = { max_level = 30, res_list = { {name = "model_clothe_20010002", is_static = false}, }, }, [1004] = { max_level = 80, res_list = { {name = "model_clothe_20040004", is_static = false}, }, }, } local scene_cfg = self.story_res_list[scene_id] if scene_cfg and role_level <= scene_cfg.max_level then for k,v in pairs(scene_cfg.res_list) do self.pre_load_res_list[#self.pre_load_res_list+1] = v end end end self.index = self.index or 1 local function on_step( ) local res = self.pre_load_res_list[self.index] if self.index > #self.pre_load_res_list or not res then self.index = 1 if self.pre_load_res_timer then GlobalTimerQuest:CancelQuest(self.pre_load_res_timer) self.pre_load_res_timer = nil end return end if res.is_static and lua_resM.static_obj_name_list[res.name] then --已存在的静态资源就不要重复加载了 else local function load_call_back( objs, is_gameObject ) if objs and objs[0] then local effect_go = is_gameObject and objs[0] or newObject(objs[0]) lua_resM:AddObjToPool(self, res.name, res.name, effect_go) end end if res.is_static then lua_resM:AppendStaticObjName(res.name) end lua_resM:loadPrefab(self, res.name, res.name, load_call_back, true) end self.index = self.index + 1 end if not self.pre_load_res_timer then self.pre_load_res_timer = GlobalTimerQuest:AddPeriodQuest(on_step, 0.1) end -- end end GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, scene_load_view_complete) local function onInitMainCanvasData() if IsNull(self.main_cancas_con) then self.scene_obj_container = panelMgr:GetParent("SceneObjContainer") self.scene_nameboard_obj = panelMgr:GetParent("NameBoard").gameObject self.main_cancas = panelMgr:GetParent("Main") self.main_cancas_con = UiFactory.createChild(self.main_cancas, UIType.EmptyObject, "main_cancas_con").transform self.main_cancas_con_go = self.main_cancas_con.gameObject self.main_cancas_con.localPosition = Vector3.zero self.main_cancas_con.sizeDelta = Vector2(ScreenWidth, ScreenHeight) self.main_cancas_con.gameObject:SetActive(false) self.main_canvas_hideView_list = {} setmetatable(self.main_canvas_hideView_list, {__mode = "k"}) --弱引用 self.main_cancas_last_visible = true end end GlobalEventSystem:Bind(EventName.GAME_UI_LOAD_COMPLETED, onInitMainCanvasData) self.update_visible = false local function onUpdateMainCanvasVisible(view, visible) if self.main_cancas_con == nil then return end if visible then --主界面是否需要显示 if view then self.main_canvas_hideView_list[view] = nil end self.update_main_canvas_time = Time.time + 0.045 else self.main_canvas_hideView_list[view] = true self.update_main_canvas_time = Time.time + 0.03 end self.update_visible = true --DEFAULT场景对象层, if view and view.hide_maincancas then MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.DEFAULT, visible) if self.scene_nameboard_obj then self.scene_nameboard_obj:SetActive(visible) end --显示天空盒时候,不要操作地表 if view.model_activity_bg or view.need_culling_mask_ground then if Scene.getInstance().is_showing_sky_box then MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, true) else MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, visible) end end end end self:Bind(LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, onUpdateMainCanvasVisible) local function onHideItemUseView(bool) if bool then ItemUseModel:getInstance():HideItemUseView() else ItemUseModel:getInstance():ShowItemUseView() end end self:Bind(LuaViewManager.HIDE_ITEM_USE_VIEW, onHideItemUseView) self.is_lock_screen = false local function onScreenBrightDelHandler() self.is_lock_screen = true self:ChangeLockScreenState() -- onUpdateMainCanvasVisible("ScreenBright", false) --SetGameFrameRate(30) end GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_DEL_EVENT, onScreenBrightDelHandler) local function onScreenBrightAddHandler() self.is_lock_screen = false self:ChangeLockScreenState() --SetGameFrameRate() -- onUpdateMainCanvasVisible("ScreenBright", true) end GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_ADD_EVENT, onScreenBrightAddHandler) local function onViewDoAnimHandler(show, target_view) self:DoMoveUIRootAnim(show, target_view) end GlobalEventSystem:Bind(EventName.BASEVIEW_DO_VIEW_ANIM, onViewDoAnimHandler) self.show_loading_view_list = {} --显示loading的界面列表 self.show_loading_step = 0 self.delay_ui_list = Array.New() --延迟加载ui队列 Runner.Instance:AddRunObj(self, 1) end function LuaViewManager:ClearTimer() if self.hide_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id) self.hide_hook_role_timer_id = nil end if self.show_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id) self.show_hook_role_timer_id = nil end end function LuaViewManager:ChangeLockScreenState() if Scene then local main_role = Scene:getInstance():GetMainRole() if self.is_lock_screen then if main_role then if main_role.sprite and not main_role.sprite:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.sprite:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) end if main_role.pet and not main_role.pet:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.pet:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) end if main_role.baby and not main_role.baby:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.baby:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) end if main_role.pokemon and not main_role.pokemon:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.pokemon:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) end local partner_list = Scene.Instance.partner_list for _,partner in pairs(partner_list) do partner:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) end main_role:RemoveLivenessImage() end MainCamera.Instance:SetScreenEffectCamereState(false) GlobalEventSystem:Fire(SceneEventType.HIDE_ALL_MONSTER) local hook_role_list = Scene.Instance.hook_role_list if TableSize(hook_role_list) > 0 then local list = {} for _,hook_role in pairs(hook_role_list) do table.insert(list,hook_role) end if self.hide_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id) self.hide_hook_role_timer_id = nil end local index = 0 local max_index = #list local function onTimer() index = index + 1 local hook_role = list[index] if hook_role then hook_role:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true) hook_role:DoStand() end if index >= max_index then if self.hide_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id) self.hide_hook_role_timer_id = nil end end end self.hide_hook_role_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer,0.1) end else if main_role then if main_role.sprite and main_role.sprite:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.sprite:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end if main_role.pet and main_role.pet:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.pet:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end if main_role.baby and main_role.baby:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.baby:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end if main_role.pokemon and main_role.pokemon:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then main_role.pokemon:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end local partner_list = Scene.Instance.partner_list for _,partner in pairs(partner_list) do partner:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end main_role:ShowLivenessImage() end MainCamera.Instance:SetScreenEffectCamereState(true) GlobalEventSystem:Fire(SceneEventType.SHOW_ALL_MONSTER) local monster_list = Scene.Instance.monster_list for id, mon in pairs(monster_list) do if mon:IsInState(PoseState.MOVE) then mon:UpdateMoveEndPos() else mon:DoStand() end end local hook_role_list = Scene.Instance.hook_role_list if TableSize(hook_role_list) > 0 then local list = {} for _,hook_role in pairs(hook_role_list) do table.insert(list,hook_role) end if self.show_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id) self.show_hook_role_timer_id = nil end local index = 0 local max_index = #list local function onTimer() index = index + 1 local hook_role = list[index] if hook_role then hook_role:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false) end if index >= max_index then if self.show_hook_role_timer_id then GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id) self.show_hook_role_timer_id = nil end end end self.show_hook_role_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer,0.1) end end GlobalEventSystem:Fire(SceneEventType.UPDATE_ROLE_LIMIT) end end --移出屏幕外,还是会渲染 function LuaViewManager:PushViewsOutScreen() --为了解决聊天框表情错乱问题。是由于重设了父对象,没更新网格 ChatModel:getInstance():Fire(ChatModel.HIDE_MIAN_UI_CHAT_VIEW,false) SetLocalPositionY(self.main_cancas_con, 99999) end function LuaViewManager:PopViewsInScreen() SetLocalPositionY(self.main_cancas_con, 0) end LuaViewManager.MAINCANVAS_OUT_ANI_TOGGLE = true function LuaViewManager:ChangeMainCanvasVisible(flag) -- if not IsNull(self.main_cancas_con_go) then -- self.main_cancas_con_go:SetActive(flag) -- end if flag then local len = self.main_cancas_con.childCount - 1 local list = {} for i = 0, len do table.insert(list, self.main_cancas_con:GetChild(i)) end for i, child in ipairs(list) do child:SetParent(self.main_cancas) end else local len = self.main_cancas.childCount - 1 local list = {} for i = 0, len do if self.main_cancas:GetChild(i) == self.main_cancas_con then -- Message.show("==============") else table.insert(list, self.main_cancas:GetChild(i)) end end for i, child in ipairs(list) do child:SetParent(self.main_cancas_con) end end end function LuaViewManager:BocastChangeVisibleEvent( ) self:Fire(LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE,self.main_cancas_last_visible) if self.main_cancas_last_visible then if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then GlobalEventSystem:Fire(EventName.PLAY_MAINUI_MOVIE_CENTER_EVENT) end else if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight and LuaViewManager.MAINCANVAS_OUT_ANI_TOGGLE then GlobalEventSystem:Fire(EventName.PLAY_MAINUI_MOVIE_CENTER_EVENT, true) end end end function LuaViewManager:ChangeSceneObjContainerVisible( flag ) --DEFAULT是场景对象所在的层级 -- MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.DEFAULT, flag) MainCamera:getInstance():SetPostEffectEnable(flag) if flag then local is_empty = IsTableEmpty(self.back_ui_target_table) if is_empty then self:SetUICameraEnable(not flag) --这里只负责统一关闭,开启的话由各个界面加载模型的时候去控制 end end end --放入main层的隐藏父类里 function LuaViewManager:PuskMainCanvasCon(transform) if transform and self.main_cancas_con then transform:SetParent(self.main_cancas_con) end end function LuaViewManager:GetFrameUpdateCount() if self.main_cancas_last_visible then return 1 else return 3 end end function LuaViewManager:getInstance() if LuaViewManager.Instance == nil then LuaViewManager.Instance = LuaViewManager.New() end return LuaViewManager.Instance end --添加进入延迟队列 function LuaViewManager:AddDelayQueue(call_back) self.delay_ui_list:PushBack(call_back) return call_back end --移除 function LuaViewManager:RemoveDelayQueue(call_back) local index = self.delay_ui_list:IndexOf(call_back) if index and index > 0 then self.delay_ui_list:Erase(index - 1) end end function LuaViewManager:NoDependHideView() for k,v in pairs(self.main_canvas_hideView_list) do print("main_canvas_hideView_list k", k) end print("tanar: [LuaViewManager 425]=> IsTableEmpty(self.main_canvas_hideView_list): ",IsTableEmpty(self.main_canvas_hideView_list)) if IsTableEmpty(self.main_canvas_hideView_list) then return true end end function LuaViewManager:Update(now_time, elapse_time) if self.update_visible and now_time - self.update_main_canvas_time > 0 then self.update_visible = false if self:NoDependHideView() then if not self.main_cancas_last_visible then self.main_cancas_last_visible = true self:ChangeMainCanvasVisible(true) self:BocastChangeVisibleEvent() self:ChangeSceneObjContainerVisible(true) --主聊天界面单独处理 先显示后隐藏,不然有bug GlobalEventSystem:Fire(EventName.HIDE_MAIN_CHAT_VIEW, true, MainUIModel and MainUIModel.OTHER_MODE2) GlobalEventSystem:Fire(EventName.HIDE_MAIN_CHAT_VIEW, false, MainUIModel and MainUIModel.OTHER_MODE2) -- if not self.is_lock_screen then -- SetGameFrameRate() -- end end else if self.main_cancas_last_visible then self.main_cancas_last_visible = false self:ChangeMainCanvasVisible(false) self:BocastChangeVisibleEvent() self:ChangeSceneObjContainerVisible(false) if not self.is_lock_screen then SetGameFrameRate() end end end end local size = self.delay_ui_list:GetSize() if size > 0 then local call_back if size <= 10 then call_back = self.delay_ui_list:PopFront() if call_back then call_back() end else size = math_ceil(size * 0.1) for i = 1, size do local call_back = self.delay_ui_list:PopFront() if call_back then call_back() end end end end -- if self.show_loading_step % 13 == 0 then -- self:CheckLoadingState(now_time) -- end -- self.show_loading_step = self.show_loading_step + 1 end --检测loading状态 function LuaViewManager:CheckLoadingState(now_time) local delete_list = nil local show_loading = false now_time = now_time or Status.NowTime for id, info in pairs(self.show_loading_view_list) do if now_time >= info.hide_time then delete_list = delete_list or {} table.insert(delete_list, id) elseif not show_loading and now_time >= info.start_show_time and now_time <= info.hide_time then show_loading = true end end if delete_list then for i, id in ipairs(delete_list) do self.show_loading_view_list[id] = nil end end if show_loading then self:ShowLoading() else self:CloseLoading() end end --显示loading function LuaViewManager:ShowLoading() if not self.loadingView then self.loadingView = LoadingView.New() end if not self.loadingView:HasOpen() then self.loadingView:Open() end end --隐藏loading function LuaViewManager:CloseLoading() if self.loadingView and self.loadingView:HasOpen() == true then self.loadingView:Close() end end --添加需要显示loading进度的界面对象 function LuaViewManager:AddLoadingView(id) local info = {start_show_time = Status.NowTime + 0.6, hide_time = Status.NowTime + 8} self.show_loading_view_list[id] = info end --移除loading界面对象 function LuaViewManager:RemoveLoadingView(id) self.show_loading_view_list[id] = nil self:CheckLoadingState() end function LuaViewManager:LoadView(ref_tar,abName,pfName,layerName,callBack) lua_resM:addRefCount(ref_tar,abName) -- use_local_view UI本地加载,true的话直接加载Hierarchy上的挂着的预设 if ref_tar.use_local_view and (IsNull(ApplicationPlatform) or SystemRuntimePlatform.IsWindowsEditor()) then local root_path = "root/Canvas/" if layerName == "Main" then root_path = "root/BackCanvas/" end local view_path = root_path .. layerName .. "/" .. pfName local go = GameObject.Find(view_path) if go then go.layer = LayerMask.NameToLayer("UI") go.transform.localScale = Vector3.one go.transform.localPosition = Vector3.zero go.gameObject:SetActive(true) callBack(go) else Message.show("找不到本地界面:" .. view_path) ref_tar.use_local_view = false panelMgr:CreateView(abName,pfName,layerName,callBack) end else ref_tar.use_local_view = false panelMgr:CreateView(abName,pfName,layerName,callBack) end end function LuaViewManager:OpenView(ref_tar) self.cur_layout = ref_tar.layout_file --用于引导 self.cur_use_background = ref_tar.use_background self.cur_layer_name = ref_tar.layer_name self.all_view_queue[ref_tar] = true --引导界面打开关闭,不加入队列 if self.cur_layout == "GuidePromptView" then return end --1级界面,自动加入到管理队列里面 if (ref_tar.append_to_ctl_queue or ref_tar.layer_name == "UI") and self.view_ctl_queue[ref_tar] == nil then for view, _ in pairs(self.view_ctl_queue) do view:Hide() end self.view_id = self.view_id + 1 self.view_ctl_queue[ref_tar] = self.view_id end --2级界面,自动加入到管理队列里面 if (not ref_tar.append_to_ctl_queue and ref_tar.layer_name == "Activity" and not ref_tar.force_no_ctl_queue) and self.view_activity_ctl_queue[ref_tar] == nil then for view, _ in pairs(self.view_activity_ctl_queue) do view:Hide() end self.act_view_id = self.act_view_id + 1 self.view_activity_ctl_queue[ref_tar] = self.act_view_id end end function LuaViewManager:CloseView(ref_tar) self.last_use_background = ref_tar.use_background if self.view_ctl_queue[ref_tar] then--不管如何进来有的话就要清掉 self.view_ctl_queue[ref_tar] = nil end if self.view_activity_ctl_queue[ref_tar] then--不管如何进来有的话就要清掉 self.view_activity_ctl_queue[ref_tar] = nil end if self.all_view_queue[ref_tar] then --不管如何进来有的话就要清掉 self.all_view_queue[ref_tar] = nil end --1级界面,自动加入到管理队列里面 if (ref_tar.append_to_ctl_queue or ref_tar.layer_name == "UI") then local max_id = 0 local max_view = nil for view, id in pairs(self.view_ctl_queue) do if id > max_id then max_id = id max_view = view end end if max_view then -- self.view_id = self.view_id - 1 max_view:CancelHide() end end --活动层级相关这里也要加入堆栈 if (not ref_tar.append_to_ctl_queue and ref_tar.layer_name == "Activity" and not ref_tar.force_no_ctl_queue) then local max_id = 0 local max_view = nil for view, id in pairs(self.view_activity_ctl_queue) do if id > max_id then max_id = id max_view = view end end if max_view then -- self.act_view_id = self.act_view_id - 1 max_view:CancelHide() end end if Scene and Scene.Instance and TableSize(self.view_ctl_queue) == 0 then Scene.Instance:ChangeFogEnable(true) end end function LuaViewManager:DestroyView(gameObject) -- panelMgr:CloseView(gameObject) destroy(gameObject, true) end function LuaViewManager:LoadItem(ref_tar,abName,pfName,callBack) lua_resM:addRefCount(ref_tar,abName) if ref_tar.use_local_view and SystemRuntimePlatform.IsWindowsEditor() then local root_path = "root/Canvas/" if layerName == "Main" then root_path = "root/BackCanvas/" end local view_path = root_path .. pfName local go = GameObject.Find(view_path) if go then local item = newObject(go) item.layer = LayerMask.NameToLayer("UI") item.gameObject:SetActive(true) callBack(item) else Message.show("找不到本地界面:" .. view_path) ref_tar.use_local_view = false panelMgr:LoadItem(abName,pfName,callBack) end else ref_tar.use_local_view = false panelMgr:LoadItem(abName,pfName,callBack) end -- local function onLoadItemCallback(objs) -- if not ref_tar._use_delete_method then -- local go = nil -- if objs and objs[0] then -- go = newObject(objs[0]) -- --go.name = assetName; -- go.layer = UIPartical.RenderingOther_List.UI -- --go.transform:SetParent(panelMgr:GetParent(layerName)) -- -- go.transform.localScale = Vector3.one -- -- go.transform.localPosition = Vector3.zero -- end -- if callBack then -- callBack(go) -- end -- -- lua_resM:ImmeUnLoadAB(abName) -- end -- end -- lua_resM:loadPrefab(ref_tar,abName,pfName,onLoadItemCallback, nil, ASSETS_LEVEL.HIGHT) end function LuaViewManager:ClearItem(gameObject) destroy(gameObject) -- panelMgr:ClearItem(gameObject) end function LuaViewManager:GetMaskID() return self.maskIdPool:Pop() end function LuaViewManager:ReleaseMaskID(mid) return self.maskIdPool:Push(mid) end function LuaViewManager:GetViewNum( ) return TableSize(self.view_ctl_queue) end LuaViewManager.BgType = { Base = 1, --Main = 2, } --检测需要在后UI层显示的数据 function LuaViewManager:ShowBackData(data) if not data or not data.target then return end self.back_ui_list = self.back_ui_list or {} self.back_ui_target_table = self.back_ui_target_table or {} local t = false for i,v in ipairs(self.back_ui_list) do if v.target == data.target then t = v end end if t then --合并背景数据 if data.bg_list and #data.bg_list > 0 then --背景需要直接覆盖之前的 t.bg_list = data.bg_list end --合并背景UI节点数据 if data.node_list and #data.node_list > 0 then t.node_list = t.node_list or {} for i,v in ipairs(data.node_list) do table.insert(t.node_list, v) end end --摄像机参数,如果原来是空并且新传入的部位空,才再次赋值 if not t.camera_args and data.camera_args then t.camera_args = data.camera_args end --黑底参数,如果原来是空并且新传入的部位空,才再次赋值 if not t.activity and data.activity then t.activity = data.activity end else t = data self.back_ui_target_table[data.target] = true table.insert(self.back_ui_list, t) end self:LoadUIRes(t) end --处理把毕竟或者UI显示在后UI层 function LuaViewManager:LoadUIRes(data) if not self.is_init_model then self:InitBackModel() end if not data or not data.target then if self.base_empty_activity_bg then self.base_empty_activity_bg.gameObject:SetActive(false) end self.base_activity_bg.gameObject:SetActive(false) self.base_win_bg.gameObject:SetActive(false) self.main_win_bg.gameObject:SetActive(false) return end local bg_list = data.bg_list or {} --local main_table = bg_list[LuaViewManager.BgType.Main] local base_table = bg_list[LuaViewManager.BgType.Base] local activity_table = data.activity or {} local node_list = data.node_list or {} local back_camera_args = data.camera_args -- PrintTable(main_table) -- PrintTable(base_table) -- PrintTable(back_camera_args) -- PrintTable(activity_table) --设置摄像机 self.role_back_camera.gameObject:SetActive(true) self:SetBackCamera(back_camera_args) --黑底处理 local function set_activity_bg(alpha) alpha = alpha or 0.7 self.base_activity_bg.gameObject:SetActive(true) self.base_activity_bg.enabled = true self.base_activity_bg.alpha = alpha end if self.base_empty_activity_bg then self.base_empty_activity_bg.gameObject:SetActive(activity_table and not activity_table.is_show) end if activity_table and activity_table.is_show then set_activity_bg(activity_table.alpha) else self.base_activity_bg.gameObject:SetActive(false) self.base_activity_bg.enabled = false end --UI节点处理 if #node_list > 0 then self:MoveUIBack(node_list) end --一级背景处理(最底下的背景) if base_table then if self.cur_base_res ~= base_table.res then self.cur_base_res = base_table.res local function load_base_bg_callback() if self.cur_base_res then self.base_win_bg.gameObject:SetActive(true) self.base_win_bg.enabled = true else self.base_win_bg.gameObject:SetActive(false) self.base_win_bg.enabled = false end end self:SetArgs(self.base_win_bg, base_table.args) lua_resM:setOutsideRawImage(self, self.base_win_bg, self.cur_base_res, nil, load_base_bg_callback) else self.base_win_bg.gameObject:SetActive(true) self.base_win_bg.enabled = true end else self.base_win_bg.gameObject:SetActive(false) end end function LuaViewManager:SetBackCameraShow( bool ) if self.role_back_camera and self.role_back_camera.gameObject then self.role_back_camera.gameObject:SetActive(bool) end end --设置UI的位置和大小 function LuaViewManager:SetArgs(trans, args) if trans == nil or args == nil then return end SetAnchoredPosition(trans.transform, args.pos.x, args.pos.y) SetSizeDelta(trans.transform, args.size.x, args.size.y) end --初始化分层模块 function LuaViewManager:InitBackModel() self.is_init_model = true self.back_node_list = self.back_node_list or {} self.back_ui_list = self.back_ui_list or {} self.back_ui_target_table = self.back_ui_target_table or {} local back_canvae = GameObject.Find("root").transform:Find("BackCanvas") local bg_canvas = back_canvae.transform:Find("Bg"):GetComponent("Canvas") bg_canvas.sortingOrder = 400 if not self.base_activity_bg then self.base_activity_bg = back_canvae.transform:Find("Bg/BgContain/BaseActivityBg"):GetComponent("ImageExtend") self.base_activity_bg.transform.sizeDelta = Vector2(SrcScreenWidth * 1.2,ScreenHeight * 1.2) end if not self.base_empty_activity_bg then self.base_empty_activity_bg = back_canvae.transform:Find("Bg/BgContain/BaseEmptyActivityBg") if self.base_empty_activity_bg then self.base_empty_activity_bg.transform.sizeDelta = Vector2(SrcScreenWidth * 1.2,ScreenHeight * 1.2) end self.base_empty_activity_bg.gameObject:SetActive(false) end if not self.main_win_bg then self.main_win_bg = back_canvae.transform:Find("Bg/BgContain/MainWinBg"):GetComponent("RawImage") end if not self.base_win_bg then self.base_win_bg = back_canvae.transform:Find("Bg/BgContain/BaseWinBg"):GetComponent("RawImage") end if not self.role_back_camera then self.role_back_camera = GameObject.Find("root").transform:Find("UIBackRoleCamera") self.role_back_camera.transform.localRotation = Quaternion.Euler(Vector3(10,1.86,0)) local cam = self.role_back_camera.transform:GetComponent("Camera") cam.enabled = true cam.allowHDR = true --改为透视摄像机 cam.orthographic = false cam.fieldOfView = 8 cam.farClipPlane = 100 cam.cullingMask = bit.bor(cam.cullingMask, bit.lshift(1,29)) self.role_back_camera_comp = cam self.role_back_camera.gameObject:SetActive(true) self:ApplyUIPostEffect() local function on_delay( ) self:ApplyUIPostEffect() self.role_back_camera.gameObject:SetActive(false) end setTimeout(on_delay, 0.1) end if not self.move_root then self.move_root = back_canvae.transform:Find("Bg/BgContain/MoveUIRoot") if not self.move_root then self.move_root = back_canvae.transform:Find("Bg/BgContain") end self.move_root.sizeDelta = Vector2(ScreenWidth,ScreenHeight) end end function LuaViewManager:ApplyUIPostEffect( ) if not self.bloom_effect then self.bloom_effect = self.role_back_camera:GetComponent(typeof(PostEffect)) end print("tanar: [LuaViewManager 989]=> self.bloom_effect: ",self.bloom_effect) if not IsNull(self.bloom_effect) then -- 低端设备就全关掉 if not self:IsSupportUIEffect() then self.bloom_effect.enabled = false else self.bloom_effect.enabled = true -- 泛光,中高端设备 self.bloom_effect.EnableBloom = true self.bloom_effect.use_dual_bloom = true self.bloom_effect.threshold = 0.8 self.bloom_effect.intensity = 1.5 self.bloom_effect.blurSize = 2.5 self.bloom_effect.blurIterations = 3 self.bloom_effect:ApplyBloomMaterialProperties() print("tanar: LuaViewManager [1005] =========== ") -- 抗锯齿 -- if not self:IsSupportUIFXAA() then self.bloom_effect.EnableFXAA = false -- else -- self.bloom_effect.EnableFXAA = true -- self.bloom_effect.subpixelBlending = 0.4 -- self.bloom_effect.lowQuality = true -- end -- self.bloom_effect:ApplyFXAAMaterialProperties() -- 不需要模糊 self.bloom_effect.EnableBlur = false end end end function LuaViewManager:IsSupportUIEffect( ) if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then return false end return true end function LuaViewManager:IsSupportUIFXAA( ) if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then return true end return false end --切换泛光效果开关 function LuaViewManager:SetUICameraEnable( flag ) if self.last_ui_camera_flag and self.last_ui_camera_flag == flag then self.last_ui_camera_flag = flag return end if self.role_back_camera and self.role_back_camera.gameObject then self.role_back_camera.gameObject:SetActive(flag) end end --切换泛光效果开关脚本 function LuaViewManager:SetUICameraBloomEnable( flag ) if self:IsSupportUIEffect() and self.bloom_effect then self.bloom_effect.enabled = flag end end --清除默认背景 function LuaViewManager:LoadEmptyBgRes() if not self.is_init_model then self:InitBackModel() end self.role_back_camera.gameObject:SetActive(false) self.cur_base_res = nil self.base_activity_bg.gameObject:SetActive(false) if self.base_empty_activity_bg then self.base_empty_activity_bg.gameObject:SetActive(false) end self.base_win_bg.gameObject:SetActive(false) self.main_win_bg.gameObject:SetActive(false) end --隐藏某界面的背景 function LuaViewManager:HideBackData(target) self.back_ui_list = self.back_ui_list or {} self.back_ui_target_table = self.back_ui_target_table or {} if #self.back_ui_list == 0 then return end local idx = -1 for i,v in ipairs(self.back_ui_list) do if v.target == target then idx = i break end end if idx == -1 then return end self.back_ui_target_table[target] = nil if self.back_ui_list[idx] and self.back_ui_list[idx].node_list then self:RemoveUIBack(StartToEnd(self.back_ui_list[idx].node_list)) end table.remove(table.remove(self.back_ui_list, idx)) self:CheckShow() end LuaViewManager.RoleBackCameraPosY = false LuaViewManager.RoleBackCameraSetting = { [1] = {ratio = 1, y = 11.82}, [2] = {ratio = 1.15, y = 11.82}, [3] = {ratio = 1.25, y = 11.82}, [4] = {ratio = 1.3, y = 11.92}, [5] = {ratio = 1.5, y = 12.1}, [6] = {ratio = 1.7, y = 12.1}, } LuaViewManager.CameraArgs = { DepthZero = Vector3(-1.72, 12.1, 446), Depth2K = Vector3(-1.72, 12.1, 446), } --设置模型摄像机 function LuaViewManager:SetBackCamera(args) if not self.is_init_model then self:InitBackModel() end local pos = (args and args.pos) and args.pos or LuaViewManager.CameraArgs.DepthZero --根据屏幕分辨率,调整镜头系数,只要调整Y坐标(不调整镜头会歪) if not LuaViewManager.RoleBackCameraPosY then local t = LuaViewManager.RoleBackCameraSetting local ratio = OriginalResolutionWidth / ResolutionHeight local y = 4.5 if ratio < t[1].ratio then y = t[1].y elseif ratio > t[#t].ratio then y = t[#t].y else for i=#t,1,-1 do if ratio >= t[i].ratio then y = t[i].y break end end end LuaViewManager.RoleBackCameraPosY = y end pos.y = LuaViewManager.RoleBackCameraPosY self.role_back_camera.localPosition = pos --测试 -- if SystemRuntimePlatform.IsAndroid() then -- self.role_back_camera.transform.localPosition = Vector3(0,3.12,476) -- end end --把Ui节点从后背景层,移动到原来的界面 function LuaViewManager:RemoveUIBack(node_list) if not self.is_init_model then self:InitBackModel() end local node_list = node_list or {} for k,v in ipairs(node_list) do if v and self.back_node_list[v] then v.node.transform:SetParent(v.parent) v.node.transform:SetSiblingIndex(v.sibling_idx) self.back_node_list[v] = nil end end end --把Ui节点移到后背景层 function LuaViewManager:MoveUIBack(node_list) if not self.is_init_model then self:InitBackModel() end local node_list = node_list or {} for k,v in pairs(node_list) do if not self.back_node_list[v] then self.back_node_list[v] = true local pos_x, pos_y = GetAnchoredPosition(v.node.transform) v.node.transform:SetParent(self.move_root.transform) SetLocalScale(v.node.transform) SetAnchoredPosition(v.node.transform, pos_x, pos_y) self:SetArgs(v.node.transform, v.args) end end end --检测当前需要显示的背景 function LuaViewManager:CheckShow() if #self.back_ui_list == 0 and TableSize(self.back_node_list) == 0 then self:LoadEmptyBgRes() else local temp = self.back_ui_list[#self.back_ui_list] self:LoadUIRes(temp) end end function LuaViewManager:DoMoveUIRootAnim(show, target_view) if not self.move_root then return end if not self.back_ui_target_table[target_view] then return end local function scale_anim_callback() if not show then SetLocalScale(self.move_root, 1, 1,1) end end local tween_type = show and TweenFunc.EASE_OUT_BACK or TweenFunc.EASE_IN_BACK local cfg = show and BaseView.OpenCloseScaleCfg[1] or BaseView.OpenCloseScaleCfg[2] local cur_scale = Vector3.New(cfg.start_scale, cfg.start_scale, cfg.start_scale) local target_scale = Vector3.New(cfg.end_scale, cfg.end_scale, cfg.end_scale) local time = cfg.time SetLocalScale(self.move_root, cur_scale.x, cur_scale.y, cur_scale.z) if self.scale_anim_id then TweenLite.Stop(self.scale_anim_id) self.scale_anim_id = nil end self.scale_anim_id = TweenLite.to(self, self.move_root, TweenLite.UiAnimationType.SCALE, target_scale, time, scale_anim_callback, tween_type) end --是否当前有带遮罩或者全屏界面 function LuaViewManager:IsHaveFullScreenViewOrMaskBgView() local b = false for view,v in pairs(self.all_view_queue) do if view.use_background or view.hide_maincancas then b = true break end end return b end