BaseView = BaseView or BaseClass(UIPartical) local BaseView = BaseView local LuaViewManager = LuaViewManager local lua_viewM = lua_viewM local GlobalTimerQuest = GlobalTimerQuest local SetLocalScale = SetLocalScale local destroy = destroy local GameObject = GameObject local UiFactory = UiFactory local UIZDepth = UIZDepth local GlobalEventSystem = GlobalEventSystem local AddClickEvent = AddClickEvent local EventSystem = EventSystem local GetChildTransforms = GetChildTransforms local GetChildGameObjects = GetChildGameObjects local GetChildImages = GetChildImages local GetChildTexts = GetChildTexts BaseView.Class_Type = "BaseView" BaseView.OpenEvent = "BaseView.OpenEvent" BaseView.CloseEvent = "BaseView.CloseEvent" BaseView.DestroyEvent = "BaseView.DestroyEvent" BaseView.CreateView = "BaseView.CreateView" BaseView.ChangeVisible = "BaseView.ChangeVisible" --3D模型背景资源 BaseView.ModelBgRes = { [1] = "effect_beibao_1_1", --蓝色网格 [2] = "effect_beibao_1_2", --青色网格 [3] = "effect_beibao_1_3", --紫色网格 [4] = "effect_beibao_2_1", --青色方块 [5] = "effect_beibao_3_1", --蓝色线条 [6] = "effect_beibao_3_2", --紫色线条 } --界面打开/关闭界面缩放参数 BaseView.OpenCloseScaleCfg = { --打开界面缩放动画参数 [1] = {start_scale = 0.9, end_scale = 1, time = 0.3}, --关闭界面缩放动画参数 [2] = {start_scale = 1, end_scale = 0.9, time = 0.3}, } OpenMode = { OpenOnly = 1, OpenToggle = 2, OpenDefault = 1, } BaseView.LittleMoveDir = { Top = 1, Bottom = 2, Left = 3, Right = 4, } CloseMode = { CloseVisible = 1, CloseDestroy = 2, CloseDefault = 2, } BaseView.ShowAnimType = { Fading = 1, -- 淡入淡出 -- BlackScreen = 2, -- 黑屏切换 } function BaseView:__init() GlobalEventSystem:FireNextFrame(BaseView.CreateView,self) end function BaseView:__defineVar() return { _class_type = self, -- 界面类型,通过判断_class_type.Class_Type识别baseview baseitem _iid = _in_obj_ins_id, -- 界面对象标识id _use_delete_method = false, -- 是否调用过delete函数 _need_wait_blur_bg_loaded = false, -- 是否需要等待模糊背景加载完毕 base_file = "" , -- 模块资源名称 layout_file = "", -- 界面预设名字 preLoad_list = false, -- 打开界面之前需要预加载的资源,除了本模块UI资源外的 hide_maincancas = false, -- 是否隐藏主界面 use_background = false, -- 窗口背景,用灰色半透明背景 background_alpha = 0.85, -- 窗口背景的透明度 click_bg_toClose = false, -- 点击背景是否关闭该窗口 background_wnd = false, -- 背景蒙版窗口 destroy_imm = true, -- 销毁窗口时采用立即销毁模式 delay_delete_time = 3, -- 非立即销毁的界面,关闭后延迟销毁的等待时间 change_scene_close = false, -- 切换场景是否关闭 reenter_scene_close = false, -- 重新进入场景是否关闭 change_scene_hide = false, -- 切换场景是否隐藏(不与change_scene_close、reenter_scene_close同时使用) preparing_res = false, -- 异步加载进行中 is_delete = false , -- 是否已经删除 is_set_order_sorting = true, -- 是否需要设置深度,自动管理 canvas.sortingOrder is_set_zdepth = false, -- 是否设置z深度,当需要盖住下层的UI界面上的模型时,要设true open_mode = OpenMode.OpenDefault, -- 打开模式 close_mode = CloseMode.CloseDefault, -- 关闭模式 hide_item_use_view = false, -- 打开的时候是否关闭itemuseview isPop = false, -- 是否可见 wait_for_hide = false, -- 等待加载完隐藏 layer_name = "UI", -- 窗口层次 append_to_ctl_queue = false, -- 添加进入控制队列,打开下层界面时自动关闭上层,关闭下层自动打开上层 is_delay_callback = true, -- 是否延迟调用load_callback和open_callback load_callback = false, -- 加载的回调函数 open_callback = false, -- 窗口打开时回调 close_callback = false, -- 窗口关闭时回调 destroy_callback = false, -- 销毁的回调函数 show_loading = false, -- 是否显示加载界面 is_loaded = false, -- 是否已经加载完 cache_findChild = false, -- 缓存FindChild的接口 gameObject = false, -- ugui窗口对象 transform = false, -- 窗口transform use_local_view = false, -- 使用本地界面模式,将预设挂接在编辑器对应的canva层次上才能开启 is_guide_module = false, --是否是新手引导模块 is_hide_skill_black_bg = false, --是否隐藏羁绊技能的黑色遮罩 ReOpen_callback = nil, --重新打开界面,刷新事件 close_fog = nil, --开启界面的时候是否关闭场景FOG效果(如果出现场景中模型or特效和UI上效果显示不一样,开启)使用时候需要 use_background == true blur_activity_bg = false, -- UI背景遮罩的高斯模糊效果 blur_camera_type = false, -- 模糊背景的摄像机类型 blur_screenshot = nil, -- 模糊背景截图 nil:使用通用黑色蒙版 false:等待渲染返回 成功会返回Texture图片,而不是Sprite blur_anim_time = 0.2, -- 模糊动画时间 full_screen = false, --全屏模式 -- 界面打开后的内部布局动画 ani_right = false, --右侧动画 ani_left = false, --左侧动画 adjust_mid = false, --中间布局调整 ani_list = false, -- 打开/关闭界面时的展示动画 use_show_anim = false, --是否启用打开界面的切换动画 use_hide_anim = false, --是否启用关闭界面的切换动画 ignore_use_anim = false, --是否忽略动换动画 do_show_animation = false , --当前已经处理过了动画的状态,true表示处理过show动画, false表示处理过close动画 ------------------------- mask_open_sound = false,--是否屏蔽开界面声音 mask_close_sound = false,--是否屏蔽关界面声音 move_node_list = false, --移动到背景节点列表 show_back_camera = false, --打开后渲染摄像机 back_item_contaner_list = false, --处理view下面的item的back ui 显示和隐藏 fire_change_visible_event = false, --用于界面显示隐藏通知,常用于模型动作修正 need_movie_type = true, -- 是否需要播放开启关闭界面动画(针对非黑屏大界面的) jump_close = false,--用于某些界面跳转了之后就需要关掉界面 model_activity_bg = false, -- 3d背景模式,带镜面反射,一级全屏界面才需要 model_activity_bg_pos = false, -- 3d背景的偏移坐标,默认是居中的,如果你的模型不是居中的话就要调整坐标 model_activity_bg_type = 2, -- 3d背景的默认样式类型 little_move_tween_list = false, --界面4方向缓动动画数组 little_move_event = false, --界面4方向缓事件监听 little_move_table = false, --界面4方向缓动动画数据 little_move_load_view_time_id = false, --界面打开时,缓动处理延时定时器 little_move_is_show_anim = false, --界面打开时,是否已经显示过进入动画 hide_clear_role_model = true, --隐藏时删除模型 need_culling_mask_ground = false, --打开界面是否需要摄像机剔除ground层(加载模型较多的界面可加上,取消渲染ground稍微增加性能) force_no_ctl_queue = false,--强制不加入堆栈 open_guide_close = false, --打开引导界面时(功能开放界面),是否关闭界面(复用change_scene_close的设置) } end --打开界面之前需要预加载的资源 function BaseView:AddPreLoadList(abName, assetNameList, type) if not self.preLoad_list then self.preLoad_list = {} end table.insert(self.preLoad_list,{type, abName, assetNameList}) end --[[ 获取子对象的transform 特别注意此方法是从根节点开始搜寻子对象 所以要写全路径 比如:"input/Text" ]] function BaseView:GetChild(name) if self.cache_findChild and self.transform then return self.cache_findChild(self.transform,name) end end function BaseView:GetChildComponent(name,com) return self:GetChild(name):GetComponent(com) end --获取多个孩子transform function BaseView:GetChildTransforms(names) return GetChildTransforms(self.transform, names) end --获取多个孩子go function BaseView:GetChildGameObjects(names) return GetChildGameObjects(self.transform, names) end --获取多个孩子image function BaseView:GetChildImages(names) return GetChildImages(self.transform, names) end --获取多个孩子text function BaseView:GetChildTexts(names) return GetChildTexts(self.transform, names) end --是否真正打开 判断依据是调用了open以及资源加载已经完成 function BaseView:HasOpen() return self.isPop and self.is_loaded and not self.wait_for_hide end function BaseView:Open() print("[ BaseView Open ]: source = ",self._class_type._source, "layout_file = ",self.layout_file) self.isPop = true self.wait_for_hide = false self.is_in_close_anim = false self._use_delete_method = false self:RemoveDestroyTimer() -- -- 如果设备不支持高斯模糊后处理,则强制不渲染 -- if self.blur_activity_bg then -- if MainCamera.Instance:GetRenderSupport() then -- self.blur_screenshot = false -- local function blur_screenshot_callback(screenshot) -- self.blur_screenshot = screenshot -- self:SetBackgroundWnd() -- end -- MainCamera.Instance:GetCameraBlurScreenShot(blur_screenshot_callback, self.blur_camera_type) -- else -- self.blur_screenshot = false -- self.blur_activity_bg = false -- end -- end if self.open_mode == OpenMode.OpenOnly then BaseView.OpenOnly(self) elseif self.open_mode == OpenMode.OpenToggle then BaseView.OpenToggle(self) end local auto_close_view = function() self:Close() end local auto_change_scene_close_view = function() if SceneManager:getInstance():IsDailyCircleDungeon() then--如果现实进入镜像场景,则关掉该界面 self.is_in_daily_circle_dungeon = true elseif self.is_in_daily_circle_dungeon then --如果当前场景不是镜像场景,并且又是镜像场景出来的。也不关掉界面 self.is_in_daily_circle_dungeon = false else self:Close() end end if self.change_scene_close and not self.change_scene_close_event_id then self.change_scene_close_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.SCENE_CHANGED,auto_change_scene_close_view) end --复用切场景关闭的设置(或者是有背景的界面, 或者是全屏界面) self.open_guide_close = ( self.use_background and self.open_guide_close ~= nil) or self.open_guide_close or (self.open_guide_close ~= nil and self.change_scene_close or false) if self.open_guide_close and not self.open_guide_close_id then self.open_guide_close_id = EventSystem.Bind(GlobalEventSystem,EventName.OPEN_GUIDE_CLOSE_VIEW,auto_close_view) end if self.reenter_scene_close and not self.reenter_close_event_id then self.reenter_close_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.SCENE_REENTER,auto_close_view) end if not self.change_scene_close and not self.change_scene_close and self.change_scene_hide and not self.change_scene_hide_event_id and not self.change_scene_complete_event_id then local auto_hide_view = function() self:Hide() end local auto_show_view = function() self:CancelHide() end self.change_scene_hide_event_id = EventSystem.Bind(GlobalEventSystem,SceneEventType.OPEN_SCENE_LOAD_VIEW,auto_hide_view) self.change_scene_complete_event_id = EventSystem.Bind(GlobalEventSystem,EventName.SCENE_LOAD_VIEW_COMPLETE,auto_show_view) end if self.use_background and self.hide_maincancas and not self.all_close_event_id then self.all_close_event_id = EventSystem.Bind(GlobalEventSystem,EventName.CLOSE_ALL_VIEW,auto_close_view) end local function on_jump_close() if self._use_delete_method then return end self:Close() end if self.jump_close and not self.jump_close_event_id then self.jump_close_event_id = EventSystem.Bind(GlobalEventSystem,EventName.JUMP_CLOSE_EVENT,on_jump_close) end local function onOrientationChange( ) self:SetIpxMode() end if not self.orientation_change_id then self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange) end if self.is_guide_module and not self.trigger_guide_id then local function onTriggerGuideHandler() if not self.is_loaded then return end if self.AddToStageHandler then self:AddToStageHandler() end end self.trigger_guide_id = EventSystem.Bind(GlobalEventSystem,EventName.TRIGGER_GUIDE_TYPE,onTriggerGuideHandler) end EventSystem.Fire(GlobalEventSystem,BaseView.OpenEvent, self.layer_name, self) -- if (self.key_back_to_close == true or (self.use_background and self.hide_maincancas)) and self.key_back_to_close_id == nil then -- local function on_force_close( ) -- if BaseView.LastTabIndex and BaseView.LastTabIndex > 0 then -- GlobalEventSystem:Fire(EventName.KEY_BACK_CHANGE) -- else -- self:Close() -- end -- end -- BaseView.KeyBackWinCount = BaseView.KeyBackWinCount and BaseView.KeyBackWinCount + 1 or 1 -- self.key_back_to_close_id = GlobalEventSystem:Bind(EventName.KEY_BACK_CLOSE, on_force_close) -- end end function BaseView:OpenOnly() self.is_delete = false if self.preparing_res then return end -- 打开的时候界面还在缓存中 if self.gameObject then BaseView.AfterOpen(self) if not self.destroy_imm then --如果是非立即销毁的界面,要重新设置父节点 self.transform:SetParent(panelMgr:GetParent(self.layer_name)) end return end self:AsnycLoadLayout() if self.layer_name ~= "Main" and not self.mask_open_sound then lua_soundM:PlayUIEffectSound(LuaSoundManager.SOUND_UI.OPEN) end end function BaseView:AsnycLoadLayout() local preLoad_index = 0 local preLoad_list_len = 0 if self.show_loading then LuaViewManager.AddLoadingView(lua_viewM, self._iid) end local function preLoadCallback() preLoad_index = preLoad_index + 1 if preLoad_list_len == 0 or preLoad_index == preLoad_list_len then local res_load_finish = function(obj) self:DoCreateWindowIndeed(obj) end if self.base_file == "" then -- 没有预设体的界面,直接创建空对象 local go = UiFactory.createChild(panelMgr:GetParent(self.layer_name), UIType.EmptyObject, LuaMemManager.GetLastStr(self._class_type._source,"/")) res_load_finish(go) else LuaViewManager.LoadView(lua_viewM, self,self.base_file, self.layout_file, self.layer_name, res_load_finish) end end end -- 先加载额外的依赖资源包 self.preparing_res = true self.is_loaded = false if self.load_time_out_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id) self.load_time_out_id = nil end local function onCheckTimeOut() if self.layer_name == "UI" then self.preparing_res = false self:Close() end end -- 15秒都打不开界面则自动触发关闭流程,避免影响后续操作 self.load_time_out_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, onCheckTimeOut, 15) if self.preLoad_list then local vo = nil preLoad_list_len = #self.preLoad_list for i = 1, preLoad_list_len do vo = self.preLoad_list[i] lua_resM:LoadRes(self, vo[1], vo[2], vo[3], preLoadCallback) end self.preLoad_list = nil else preLoadCallback() end end function BaseView:DoCreateWindowIndeed(obj) --iphone低端机强制设立即销毁 if SystemMemoryLevel.Cur == SystemMemoryLevel.Low and SystemRuntimePlatform.IsIphone() then self.destroy_imm = true end if self.load_time_out_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id) self.load_time_out_id = false end --资源下载或加载失败 if obj == nil then self.preparing_res = false self:Close() return end self.gameObject = obj if self.isPop == false then --如果加载回来时,外部已经调用了关闭流程,则直接销毁界面 self:Destroy() return end -- 缓存频繁访问的对象 self.transform = obj.transform self.cache_findChild = self.transform.Find --统一处理是否显示界面打开/关闭动画 self.use_show_anim = not self.ignore_use_anim and (self.use_background and not self.model_activity_bg) or self.use_show_anim self.use_hide_anim = not self.ignore_use_anim and (self.use_background and not self.model_activity_bg) or self.use_hide_anim if not ClientConfig.view_scale_ani_mode then self.use_show_anim = false self.use_hide_anim = false end if self.use_show_anim then local cfg = BaseView.OpenCloseScaleCfg[1] SetLocalScale(self.transform, cfg.start_scale, cfg.start_scale, cfg.start_scale) else SetLocalScale(self.transform) end self:InitViewAnimation() if self.show_loading then LuaViewManager.RemoveLoadingView(lua_viewM, self._iid) end -- 设置背景的逻辑封装成一个函数 self:SetBackgroundWnd() if self.show_back_camera then self:ShowBackModeCamera() end self.base_view_closeBtn = self.transform:Find("Window/windowCloseBtn") or self.transform:Find("Window2/windowCloseBtn") if self.base_view_closeBtn then self.base_view_closeBtn:GetComponent("Image"):SetNativeSize() local function onCloseHandler() self:Close() end AddClickEvent(self.base_view_closeBtn.gameObject,onCloseHandler, nil, true ) self.base_view_titleText = self.transform:Find("Window/windowTitleCon/windowTitleText") or self.transform:Find("Window2/windowTitleCon/windowTitleText") end -- self.base_view_bg = self.transform:Find("Window") or self.transform:Find("Window2") -- if self.base_view_bg then -- local img = self.base_view_bg:GetComponent("Image") -- if img then -- img.raycastTarget = true -- end -- end -- --main层的UI都挂在main_cancas_con,以实现显示隐藏修改的需要 -- if self.layer_name == "Main" and not self.hide_maincancas then -- LuaViewManager.PuskMainCanvasCon(lua_viewM, self.transform) -- end if not self._need_wait_blur_bg_loaded then BaseView.CreateMainWindow(self) self.preparing_res = false end end function BaseView:SetBackgroundWnd( ) -- 未加载完则不处理 if not self.gameObject then return end self.blur_activity_bg = false if self.use_background and self.model_activity_bg then self.close_fog = true end local function create_background_wnd() if self.blur_screen_time_out_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id) self.blur_screen_time_out_id = nil end if self.model_activity_bg then local function on_delay( ) self:UpdateModelBg() end setTimeout(on_delay, 0.1) else self.background_wnd = self.background_wnd or UiFactory.createChild(self.transform, UIType.Background,"activity_bg") self.background_wnd_raw = self.background_wnd:GetComponent("RawImageExtend") if self.blur_screenshot == nil then -- 不使用模糊背景 self.background_wnd_raw.alpha = self.background_alpha elseif self.blur_screenshot == false then -- 等待模糊背景返回 self.background_wnd_raw.alpha = 0 elseif self.blur_screenshot then self.background_wnd_raw.color = ColorUtilValue.BLURGRAY self.background_wnd_raw.texture = self.blur_screenshot end if self.use_show_anim then local cfg = BaseView.OpenCloseScaleCfg[1] if cfg and cfg.start_scale ~= 0 then self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth / cfg.start_scale, ScreenHeight/cfg.start_scale) else self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight) end else self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight) end self.background_wnd.transform:SetAsFirstSibling() SetAnchoredPosition(self.background_wnd.transform, 0, 0) if self.background_wnd and self.click_bg_toClose then local function onClickHandler() self:Close() end AddClickEvent(self.background_wnd,onClickHandler,nil,false) end end -- 不管有没有模糊都要尝试执行这块逻辑,这种写法也包含了模糊逻辑超时之后打开界面的处理 if self._need_wait_blur_bg_loaded then BaseView.CreateMainWindow(self) self.preparing_res = false end end if self.use_background then if self.model_activity_bg then self.blur_activity_bg = false end self.on_blur_screen_finish = false --记录高斯模糊完成标识,超时的话则创建普通背景,避免异常情况界面无法关闭 -- 如果设备不支持高斯模糊后处理,则强制不渲染 -- if self.blur_activity_bg then -- if MainCamera.Instance:GetRenderSupport() then -- self.blur_screenshot = false -- -- 需要等待模糊图返回才打开界面 -- self._need_wait_blur_bg_loaded = true -- -- 如果要使用打开或关闭动画,则需要动态添加CanvasGroup组件 -- if self.use_show_anim or self.use_hide_anim then -- local canvas_group = self.gameObject:GetComponent(typeof(UnityEngine.CanvasGroup)) -- if not canvas_group then -- canvas_group = self.gameObject:AddComponent(typeof(UnityEngine.CanvasGroup)) -- end -- canvas_group.alpha = 0 -- end -- -- 创建回调用来接收RenderTexture -- local function blur_screenshot_callback(renderTexture) -- self.on_blur_screen_finish = true -- self.blur_screenshot = renderTexture -- if self._use_delete_method then -- 如果已经在执行销毁了,则立即回收rt -- MainCamera.Instance:ClearScreenShotCache(self.blur_screenshot) -- return -- end -- create_background_wnd() -- if self.bg_back_func then--背景放到后面回调 具体参考EquipGemstoneAutoUpView -- self.bg_back_func() -- end -- end -- MainCamera.Instance:GetCameraBlurScreenShot(blur_screenshot_callback, self.blur_camera_type) -- if self.click_bg_toClose then -- local function onBlurTimeout( ) -- if not self.on_blur_screen_finish then -- self.blur_activity_bg = false -- create_background_wnd() -- end -- end -- if self.blur_screen_time_out_id then -- TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id) -- self.blur_screen_time_out_id = nil -- end -- self.blur_screen_time_out_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, onBlurTimeout, 3) -- end -- else -- self.blur_activity_bg = nil -- create_background_wnd() -- end -- else create_background_wnd() -- end end end -- 更新3D模型背景 function BaseView:UpdateModelBg( bg_type ) if IsNull(self.gameObject) then return end self.model_activity_bg_type = bg_type or self.model_activity_bg_type --过滤重复 if self.last_model_bg_type and self.last_model_bg_type == self.model_activity_bg_type then return end self.last_model_bg_type = self.model_activity_bg_type --先从缓存池取 self.model_activity_bg_objs = self.model_activity_bg_objs or {} for k,v in pairs(self.model_activity_bg_objs) do local obj = v.obj if not IsNull(obj) then obj:SetActive(false) end end local cache_model_bg = self.model_activity_bg_objs[self.model_activity_bg_type] if cache_model_bg and cache_model_bg.obj and not IsNull(cache_model_bg.obj) then cache_model_bg.obj:SetActive(false) cache_model_bg.obj:SetActive(true) return end --再去加载 local cur_res_name = BaseView.ModelBgRes[self.model_activity_bg_type] or BaseView.ModelBgRes[1] local function load_finish_func(objs, is_gameObject) if self._use_delete_method then return end if not objs or not objs[0] then return end local go = is_gameObject and objs[0] or newObject(objs[0]) local go_name = go.name local new_res_type, new_res_name = self:GetModelBgName(go_name) if new_res_name ~= cur_res_name then --当前加载完成的不是最新的,则回收 self:DeleteModelBg(new_res_name, go) return end self.model_activity_bg_objs = self.model_activity_bg_objs or {} if self.model_activity_bg_objs[new_res_type] then destroy(go) return end self.model_activity_bg_objs[new_res_type] = {name = new_res_name, obj = go} go.transform:SetParent(self.transform) go:SetActive(false) go:SetActive(true) if self.model_activity_bg_pos then SetLocalPosition(go.transform, self.model_activity_bg_pos.x, self.model_activity_bg_pos.y, -50000) else SetLocalPosition(go.transform, 0, 0, -50000) end SetLocalRotation(go.transform) SetLocalScale(go.transform, 100) end local function bg_load_delay_func( ... ) lua_resM:loadPrefab(self, cur_res_name, cur_res_name, load_finish_func, false, ASSETS_LEVEL.HIGHT) end self.model_bg_time_id = setTimeout(bg_load_delay_func,0.01) end function BaseView:GetModelBgName( obj_name ) local res_type, res_name for k,v in pairs(BaseView.ModelBgRes) do if string.find(obj_name, v, 1, true) then res_type = k res_name = v break end end return res_type, res_name end function BaseView:DeleteModelBg( name, obj ) --指定回收 if name and not IsNull(obj) then lua_resM:AddObjToPool(self, name, name, obj) return end --全部回收 if self.model_activity_bg_objs then for k,v in pairs(self.model_activity_bg_objs) do local temp_name, temp_obj = v.name, v.obj if not IsNull(temp_obj) then lua_resM:AddObjToPool(self, temp_name, temp_name, temp_obj) end end self.model_activity_bg_objs = false end end function BaseView:CreateMainWindow() if self.is_delay_callback and self.hide_maincancas then --大界面才需要延迟callback local function onLoad() self.is_loaded = true self:BeforeLoad() if self.load_callback and not self.is_delete and self.gameObject then self.load_callback() end end if self._base_delay_load_id then LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id) self._base_delay_load_id = false end self._base_delay_load_id = LuaViewManager.AddDelayQueue(lua_viewM, onLoad) else self.is_loaded = true self:BeforeLoad() if self.load_callback then self.load_callback() end end -- 重置等待变量 self._need_wait_blur_bg_loaded = false BaseView.AfterOpen(self) end function BaseView:AfterOpen() if not self.gameObject then return end if self.isPop then BaseView.PlayOpenMovie(self) local function onOpen() if self.open_callback then self.open_callback() end if self.use_background and self.close_fog == true then Scene.Instance:ChangeFogEnable(false) end if self.is_guide_module then if self.AddToStageHandler then self:AddToStageHandler() end end if self.hide_item_use_view then LuaViewManager.Fire(lua_viewM, LuaViewManager.HIDE_ITEM_USE_VIEW, true) end if self.is_hide_skill_black_bg then SkillManager:getInstance():AddHideBlackViews(self.layout_file) HideBlackGround() end if self.change_scene_hide and not Scene:getInstance():IsSceneProloadFinish() then self:Hide() end self:DoOpenAni() --self:DoShowViewAnimation(true) self:DoShowViewScaleAnimation(true) end if self.wait_for_hide then self.gameObject:SetActive(false) if self.is_set_zdepth then UIZDepth.ResetUIZDepth(self) end if self.hide_maincancas then LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true ) end elseif self.wait_for_hide == false then if self.hide_maincancas then LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, false) end if not self.gameObject.activeSelf then self.gameObject:SetActive(true) end end self.wait_for_hide = false if self.is_set_order_sorting then self:SetUIDepth(self.gameObject) end local curr_zdepth_count = nil if self.is_set_zdepth then curr_zdepth_count = self:AddUIZDepth() end if self.layer_name == "Main" and not lua_viewM.main_cancas_last_visible then LuaViewManager.PuskMainCanvasCon(lua_viewM, self.transform) end if self.is_delay_callback and self.hide_maincancas then --大界面才需要延迟callback local function onDelayOpen() if not self.is_delete and self.isPop and self.gameObject then onOpen() if curr_zdepth_count then UIZDepth.SetUIZDepth(self, curr_zdepth_count) end end end if self.delay_open_id then LuaViewManager.RemoveDelayQueue(lua_viewM, self.delay_open_id) self.delay_open_id = false end self.delay_open_id = LuaViewManager.AddDelayQueue(lua_viewM, onDelayOpen) else onOpen() end LuaViewManager.OpenView(lua_viewM, self) else self:Close() end end function BaseView:AfterClose() if self.layout_file ~= "GuidePromptView" then LuaViewManager.CloseView(lua_viewM, self) end --下面这句话要放在clse_callback前面 因为有些是在close_callback 关掉界面 会导致重新调用cancelhide 导致主界面被隐藏 -- LuaViewManager.CloseView(lua_viewM, self) UIPartical.ClearAllEffect(self) if self.close_callback and self.is_loaded then self.close_callback() end -- if self.use_background and self.close_fog == true and not self.append_to_ctl_queue then --改到 luaViewManager 中开启 -- Scene.Instance:ChangeFogEnable(true) -- end end function BaseView:OpenToggle() if self.gameObject and self.isPop then self:Close() else self:OpenOnly() end end function BaseView:Close(called_by_mgr) self.isPop = false local function close_callback() if self.close_mode == CloseMode.CloseVisible then BaseView.CloseVisible(self) elseif self.close_mode == CloseMode.CloseDestroy then BaseView.CloseDestroy(self) end end if self.use_hide_anim then -- if not self.is_in_close_anim then --self:DoShowViewAnimation(false) self:DoShowViewScaleAnimation(false, close_callback) -- self.is_in_close_anim = true -- else -- close_callback() -- end else close_callback() end ------------------------- if self.layer_name ~= "Main" and not self.mask_close_sound then lua_soundM:PlayUIEffectSound(LuaSoundManager.SOUND_UI.CLOSE) end ------------------------- end --隐藏 function BaseView:Hide() if self.gameObject then if self.hide_maincancas then LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true) end self.gameObject:SetActive(false) self.wait_for_hide = nil self:SetBackUIVisible(false) if self.fire_change_visible_event then GlobalEventSystem:Fire(BaseView.ChangeVisible, false) end else self.wait_for_hide = true end if self.HideChangeCall then --有的界面需要在显隐的时候调用函数 self:HideChangeCall(false) end end --取消隐藏 function BaseView:CancelHide() self.isPop = true self.wait_for_hide = false BaseView.RemoveDestroyTimer(self) if self.hide_maincancas then LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, false) end -- -- 重新添加背景模糊特效 -- if self.blur_activity_bg then -- MainCamera.Instance:EnableBlurEffect(self.blur_camera_type, self.blur_anim_time) -- end --self:DoShowViewAnimation(true) --self:DoShowViewScaleAnimation(true) self:SetBackUIVisible(true) if self.gameObject then if IsNull(self.gameObject) then local str = "base view CancelHide is nil " .. tostring(self.layout_file) GameError.Instance:SendErrorMsg(str) else self.gameObject:SetActive(true) if self.ReOpen_callback then self:ReOpen_callback() end if self.fire_change_visible_event then GlobalEventSystem:Fire(BaseView.ChangeVisible, true) end end end local cache_model_bg = self.model_activity_bg_objs and self.model_activity_bg_objs[self.model_activity_bg_type] if cache_model_bg and cache_model_bg.obj and not IsNull(cache_model_bg.obj) then cache_model_bg.obj:SetActive(false) cache_model_bg.obj:SetActive(true) return end if self.HideChangeCall then --有的界面需要在显隐的时候调用函数 self:HideChangeCall(true) end end function BaseView:CloseVisible() if self.gameObject then if IsNull(self.gameObject) or IsNull(self.transform) then if self.layout_file ~= "GuidePromptView" then local str = "base view CloseVisible is nil " .. tostring(self.layout_file) GameError.Instance:SendErrorMsg(str) end else if self.close_mode == CloseMode.CloseDestroy and self.destroy_imm and not self.use_local_view then self.transform:SetParent(UiFactory.GetSceneCanvas()) else self.gameObject:SetActive(false) end end end self:StopLittleMoveAnim() if self.key_back_to_close_id then if BaseView.KeyBackWinCount and BaseView.KeyBackWinCount > 0 then BaseView.KeyBackWinCount = BaseView.KeyBackWinCount - 1 end GlobalEventSystem:UnBind(self.key_back_to_close_id) self.key_back_to_close_id=nil end if self.change_scene_close_event_id then EventSystem.UnBind(GlobalEventSystem,self.change_scene_close_event_id) self.change_scene_close_event_id=nil end if self.open_guide_close_id then EventSystem.UnBind(GlobalEventSystem,self.open_guide_close_id) self.open_guide_close_id=nil end if self.change_scene_hide_event_id then EventSystem.UnBind(GlobalEventSystem,self.change_scene_hide_event_id) self.change_scene_hide_event_id=nil end if self.change_scene_complete_event_id then EventSystem.UnBind(GlobalEventSystem,self.change_scene_complete_event_id) self.change_scene_complete_event_id=nil end if self.all_close_event_id then EventSystem.UnBind(GlobalEventSystem,self.all_close_event_id) self.all_close_event_id = nil end if self.jump_close_event_id then EventSystem.UnBind(GlobalEventSystem,self.jump_close_event_id) self.jump_close_event_id = nil end if self.orientation_change_id then EventSystem.UnBind(GlobalEventSystem,self.orientation_change_id) self.orientation_change_id = nil end if self.reenter_close_event_id then EventSystem.UnBind(GlobalEventSystem,self.reenter_close_event_id) self.reenter_close_event_id = nil end if self.delay_open_id then LuaViewManager.RemoveDelayQueue(lua_viewM, self.delay_open_id) self.delay_open_id = nil end if self.load_time_out_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.load_time_out_id) self.load_time_out_id = nil end if self.is_hide_skill_black_bg then SkillManager:getInstance():RemoveHideBlackViews(self.layout_file) end if self.hide_maincancas then LuaViewManager.Fire(lua_viewM,LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true) end self:ClearOpenMovieId() if self.hide_item_use_view then LuaViewManager.Fire(lua_viewM, LuaViewManager.HIDE_ITEM_USE_VIEW, false) end --隐藏时自动删掉挂接的模型,需要在对应界面的opencallback后重新创建 if self.hide_clear_role_model then lua_resM:clearRoleMode(self) end if self.is_set_zdepth and not IsNull(self.transform) then UIZDepth.ResetUIZDepth(self) end -- 如果存在模糊背景图,则需要传到C#中销毁 if self.blur_screenshot then MainCamera.Instance:ClearScreenShotCache(self.blur_screenshot) end if self.blur_screen_time_out_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.blur_screen_time_out_id) self.blur_screen_time_out_id = nil end BaseView.AfterClose(self) end function BaseView:CloseDestroy() self:CloseVisible() if self.destroy_imm then BaseView.Destroy(self) else BaseView.AddDestroyTimer(self) end end function BaseView:RemoveDestroyTimer() if self.destroy_timer then TimerQuest.CancelQuest(GlobalTimerQuest, self.destroy_timer) self.destroy_timer = false end end function BaseView:AddDestroyTimer() BaseView.RemoveDestroyTimer(self) local destroy_callback = function() self.destroy_timer = false self:Destroy() end self.destroy_timer = TimerQuest.AddDelayQuest(GlobalTimerQuest, destroy_callback, self.delay_delete_time) end function BaseView:Destroy() if self.is_delete or not self.gameObject then return end if self.model_bg_time_id then GlobalTimerQuest:CancelQuest(self.model_bg_time_id) self.model_bg_time_id = nil end if self._base_delay_load_id then LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id) self._base_delay_load_id = false end if self.trigger_guide_id then EventSystem.UnBind(GlobalEventSystem, self.trigger_guide_id) self.trigger_guide_id = false end if self.orientation_id then EventSystem.UnBind(GlobalEventSystem, self.orientation_id) self.orientation_id = false end if self.ui_camera_flag_change_id then EventSystem.UnBind(GlobalEventSystem, self.ui_camera_flag_change_id) self.ui_camera_flag_change_id = false end -- -- 去除模糊效果 -- if self.blur_activity_bg then -- MainCamera.Instance:DisableBlurEffect(self.blur_anim_time) -- end -- 确认清除掉了界面动画效果 if self.fading_anim_id then TweenLite.Stop(self.fading_anim_id) self.fading_anim_id = nil end if self.scale_anim_id then TweenLite.Stop(self.scale_anim_id) self.scale_anim_id = nil end if self.autoDeleteList then for i,v in ipairs(self.autoDeleteList) do if v ~= nil then v:DeleteMe() end end self.autoDeleteList = nil end self.is_delete = true UI.BindEventComp.UnBindAll(self) if self.action_nodes then for k,v in pairs(self.action_nodes) do cc.ActionManager:getInstance():removeAllActionsFromTarget(v) end self.action_nodes = nil end if self.effect_nodes then for k,v in pairs(self.effect_nodes) do self:ClearUIEffect(v) end end self:AfterDestroy() BaseView.RemoveDestroyTimer(self) if self.destroy_callback and self.is_loaded then self.destroy_callback() end if self.show_loading then LuaViewManager.RemoveLoadingView(lua_viewM, self._iid) end self.preparing_res = false self.is_loaded = false self.popChild = nil self.parent_wnd = nil self.transform = nil self.cache_findChild = nil self.preLoad_list = nil self.back_item_contaner_list = false self:DeleteModelBg() self:DeleteMe() LuaViewManager.DestroyView(lua_viewM,self.gameObject) self.gameObject = nil EventSystem.Fire(GlobalEventSystem,BaseView.DestroyEvent,self) end function BaseView:__delete() self:RemoveUIFromBack() if not self.is_delete then self:CloseDestroy() end end -- 显示子窗口 function BaseView:PopUpChild(win) if win then if self.popChild ~= nil and self.popChild ~= win then self.popChild:SetVisible(false, true) end self.popChild = win self.popChild:SetVisible(true, true) if self.fire_change_visible_event then GlobalEventSystem:Fire(BaseView.ChangeVisible, true) end end end function BaseView:GetBaseFile() return self.base_file end function BaseView:GetChildren( names ) GetChildren(self, names) end --自销毁事件 function BaseView:BindEvent( bindDispather, eventName, handleFunc ) return UI.BindEventComp.BindEvent(self, bindDispather, eventName, handleFunc) end --关闭界面时销毁该节点 function BaseView:AutoDelete( deleteNode ) self.autoDeleteList = self.autoDeleteList or {} table.insert(self.autoDeleteList, deleteNode) end --自销毁节点 function BaseView:CreateItem( class_name, parent, layer_name, ... ) if class_name and parent then local item = class_name.New(parent, nil, layer_name, ... ) self:AutoDelete( item ) return item end end --自销毁动作 function BaseView:AddAction( action, node ) self.action_nodes = self.action_nodes or {} self.action_nodes[node] = node --table.insert(self.action_nodes, node) cc.ActionManager:getInstance():addAction(action, node) end --自销毁特效 function BaseView:CreateUIEffect( config ) if not config or not config.uiTranform then return end self.effect_nodes = self.effect_nodes or {} self:AddUIEffectConfig( config ) table.insert(self.effect_nodes, config.uiTranform) end --移出屏幕(隐藏,用于频繁调用显示隐藏的对象,减少setActive的调用次数) function BaseView:MoveOutOfScreen( transform ) transform = transform or self.transform if transform then self.base_move_from_pos_y = self.base_move_from_pos_y or GetLocalPositionY(transform) SetLocalPositionY(transform, -99999) end end --移回屏幕(显示,用于频繁调用显示隐藏的对象,减少setActive的调用次数) function BaseView:MoveInToScreen( transform ) transform = transform or self.transform if transform and self.base_move_from_pos_y then SetLocalPositionY(transform, self.base_move_from_pos_y) self.base_move_from_pos_y = false end end function BaseView:InitViewAnimation() if self.full_screen or self.ani_left or self.ani_right then --处理刘海屏的位移偏移 local width, offset = self:GetIpxOffset() --右侧 self.ani_right_trans = self:GetChild("right") if self.ani_right_trans then self.ani_right_obj = self:GetChild("right").gameObject self.old_ani_right_pos = self.ani_right_trans.anchoredPosition if self.ani_right and ClientConfig.view_ani_mode == true then SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + 600, self.old_ani_right_pos.y) else SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y) end end --左侧 self.ani_left_trans = self:GetChild("left") if self.ani_left_trans then self.ani_left_obj = self:GetChild("left").gameObject self.old_ani_left_pos = self.ani_left_trans.anchoredPosition if self.ani_left and ClientConfig.view_ani_mode == true then SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x - 600 , self.old_ani_left_pos.y) else SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset , self.old_ani_left_pos.y) end end --中间 self:ResetMidNode() --设置界面大小 local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width) local rt = self.gameObject:GetComponent("RectTransform") rt.sizeDelta = Vector2(MaxScreenWidth, ScreenHeight) end end --播放界面入场动画 function BaseView:DoOpenAni(tab_id) tab_id = tab_id or 1 self.ani_list = self.ani_list or {} if not self.is_loaded or self.ani_list[tab_id] then return end self.ani_list[tab_id] = true self:DoOpenViewAnimation() end --处理界面动画 function BaseView:DoOpenViewAnimation() local width, offset = self:GetIpxOffset() if self.ani_right and self.ani_right_trans and ClientConfig.view_ani_mode == true then cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans) SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + self.ani_right - offset, self.old_ani_right_pos.y) local moveActionRight = cc.MoveTo.createAnchoredType(1, self.old_ani_right_pos.x - offset, self.ani_right_trans.anchoredPosition.y) moveActionRight = cc.EaseExponentialOut.New(moveActionRight) self:AddAction(moveActionRight, self.ani_right_trans) end if self.ani_left and self.ani_left_trans and ClientConfig.view_ani_mode == true then cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans) SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + self.ani_left + offset, self.old_ani_left_pos.y) local moveActionLeft = cc.MoveTo.createAnchoredType(1, self.old_ani_left_pos.x + offset, self.ani_left_trans.anchoredPosition.y) moveActionLeft = cc.EaseExponentialOut.New(moveActionLeft) self:AddAction(moveActionLeft, self.ani_left_trans) end end --获取刘海屏位移 function BaseView:GetIpxOffset() local width, offset = 0, 0 if ClientConfig.iphone_x_offset_left ~= 0 then offset = ClientConfig.iphone_x_offset_left /2 width = ClientConfig.iphone_x_offset_left elseif ClientConfig.iphone_x_offset_right then offset = -ClientConfig.iphone_x_offset_right /2 width = ClientConfig.iphone_x_offset_right end return width, offset end --处理中间节点 function BaseView:ResetMidNode() if self.adjust_mid then local width, offset = self:GetIpxOffset() local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width) self.mid_trans = self:GetChild("mid") if self.mid_trans then self.adjust_mid.left = self.adjust_mid.left or 0 self.adjust_mid.right = self.adjust_mid.right or 0 local x = MaxScreenWidth - self.adjust_mid.left - self.adjust_mid.right x = x / 2 SetAnchoredPosition(self.mid_trans, - (MaxScreenWidth / 2) + self.adjust_mid.left + x + offset, self.mid_trans.anchoredPosition.y) end end end --处理刘海屏,旋转屏幕 function BaseView:SetIpxMode() self:ResetMidNode() local width, offset = self:GetIpxOffset() if self.ani_right_trans then cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans) SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y) end if self.ani_left_trans then cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans) SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset, self.old_ani_left_pos.y) end end -- 进行打开界面的展示动画(淡入淡出) -- close_callback:关闭界面的关闭回调 function BaseView:DoShowViewAnimation(show, close_callback, open_callback) -- if not self.use_show_anim then return end if not self.gameObject or not self.background_wnd_raw then return end if (show and not self.use_show_anim) or (not show and not self.use_hide_anim) then -- canvas_group.alpha = show and 1 or 0 return end local time = show and 0.1 or 0.1 self.background_wnd_raw.alpha = show and 0 or self.background_alpha local target_alpha = show and self.background_alpha or 0 local function fading_anim_callback() end -- 关闭回调覆盖 if not show and close_callback then fading_anim_callback = close_callback end self.fading_anim_id = TweenLite.to(self, self.background_wnd_raw, TweenLite.UiAnimationType.ALPHA, target_alpha, time, fading_anim_callback) end -- 进行打开界面的展示动画(缩放) -- close_callback:关闭界面的关闭回调 function BaseView:DoShowViewScaleAnimation(show, close_callback, open_callback) if self.do_show_animation == show then if show then if open_callback then open_callback() end else if close_callback then close_callback() end end return end self.do_show_animation = show if not self.gameObject then return end if (show and not self.use_show_anim) or (not show and not self.use_hide_anim) then return end local function scale_anim_callback() if show and self.background_wnd then self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth, ScreenHeight) 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 if self.background_wnd then local scale = show and cfg.start_scale or cfg.end_scale if scale ~= 0 then self.background_wnd.transform.sizeDelta = Vector2(SrcScreenWidth / scale, ScreenHeight/scale) end end SetLocalScale(self.gameObject.transform, cur_scale.x, cur_scale.y, cur_scale.z) -- 关闭回调覆盖 if not show and close_callback then scale_anim_callback = close_callback end 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.gameObject.transform, TweenLite.UiAnimationType.SCALE, target_scale, time, scale_anim_callback, tween_type) if not show then GlobalEventSystem:Fire(EventName.BASEVIEW_DO_VIEW_ANIM, show, self) end end --把界面的UI节点移动到背景层 function BaseView:MoveUIToBack(node, args, camera_args,activity_args) self.move_node_list = self.move_node_list or {} if self.background_wnd and not self.blur_activity_bg then--没有高斯模糊才这样设置 --self.background_wnd:GetComponent("RawImageExtend").alpha = 0 end if node then local t = {node = node, args = args, parent = node.transform.parent, sibling_idx = node.transform:GetSiblingIndex()} table.insert(self.move_node_list, t) LuaViewManager:getInstance():ShowBackData({ target = self, node_list ={[1] = t}, camera_args = camera_args, activity = activity_args, }) if #self.move_node_list == 1 and self.use_show_anim then GlobalEventSystem:Fire(EventName.BASEVIEW_DO_VIEW_ANIM, true, self) end end end --显示后模型摄像机 function BaseView:ShowBackModeCamera(camera_args) if self.background_wnd and not self.blur_activity_bg then--没有高斯模糊才这样设置 self.background_wnd:GetComponent("RawImageExtend").alpha = 0 end camera_args = camera_args or LuaViewManager.CameraArgs.DepthZero self.show_back_camera = true LuaViewManager:getInstance():ShowBackData({ target = self, camera_args = camera_args, }) end --把界面的UI节点从背景层中移除 function BaseView:RemoveUIFromBack() self.move_node_list = self.move_node_list or {} if #self.move_node_list > 0 or self.show_back_camera then LuaViewManager:getInstance():HideBackData(self) end end --根据界面状态显示隐藏在背景层中的UI function BaseView:SetBackUIVisible(state) if self.move_node_list then for k,v in pairs(self.move_node_list) do if state == true then if v.is_hide_form_view then v.node.gameObject:SetActive(true) v.is_hide_form_view = nil end else if v.node.gameObject and v.node.gameObject.activeSelf == true then v.node.gameObject:SetActive(false) v.is_hide_form_view = true end end end end if self.back_item_contaner_list then for k,v in pairs(self.back_item_contaner_list) do v:SetBackUIVisible(state, true) end end end --设置界面的子页签(针对挂模型的界面) function BaseView:AppendToBackContainer(child_item) if child_item then self.back_item_contaner_list = self.back_item_contaner_list or {} table.insert(self.back_item_contaner_list, child_item) end end --做界面打开动画(缩放动画) function BaseView:PlayOpenMovie() do return false end -- print("huangcong:BaseView当前帧率", SceneManager and SceneManager:getInstance().curr_frame_rate or 0) -- print("huangcong:BaseView帧率上限 :", lua_settingM:GetFrameRate()) -- print("huangcong:BaseView是否开启开启界面动画 :", self.need_movie_type) -- print("huangcong:BaseView是否销毁监听:",self.open_tween_id_2) if (SceneManager and SceneManager:getInstance().curr_frame_rate > 52) --当前帧率 and lua_settingM:GetFrameRate() > 51 --帧率上限 and self.transform and self.use_background and self.hide_maincancas and (self.need_movie_type or lua_viewM.main_cancas_last_visible) and not self.open_tween_id_2 then self.has_played_open_movie = true SetLocalScale(self.transform, 0.90, 0.90, 0.90) local function onComplete() self.open_tween_id_2 = nil end self.open_tween_id_2 = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, Vector3.one ,0.1, onComplete) end end function BaseView:ClearOpenMovieId() if self.open_tween_id_1 then TweenLite.Stop(self.open_tween_id_1) self.open_tween_id_1 = nil end if self.open_tween_id_2 then TweenLite.Stop(self.open_tween_id_2) self.open_tween_id_2 = nil end end --做界面关闭动画(暂时不需要) function BaseView:PlayCloseMovie() do return false end if self.transform and self.has_played_open_movie and not self.close_tween_id_1 then self.has_played_open_movie = false LuaViewManager.Fire(lua_viewM, LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, self, true) local function onComplete() self:ClearCloseMovieId() self:CloseVisible() if self.destroy_imm then self:Destroy() else BaseView.AddDestroyTimer(self) end end if lua_viewM:GetViewNum() >= 2 or (SceneManager and SceneManager:getInstance().curr_frame_rate < 50) then onComplete() return end if not self.close_tween_id_1 then --先清理模型 if self.popChild then lua_resM:clearRoleMode(self.popChild) end local canvas_group = self.transform:GetComponent("CanvasGroup") if not canvas_group then canvas_group = self.gameObject:AddComponent(typeof(UnityEngine.CanvasGroup)) end self.close_tween_id_1 = TweenLite.to(self, canvas_group, TweenLite.UiAnimationType.ALPHA, 0.1, 0.13) self.close_tween_id_2 = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, Vector3.one * 0.88, 0.14, onComplete) end return true else return false end end function BaseView:ClearCloseMovieId() if self.close_tween_id_1 then TweenLite.Stop(self.close_tween_id_1) self.close_tween_id_1 = nil end if self.close_tween_id_2 then TweenLite.Stop(self.close_tween_id_2) self.close_tween_id_2 = nil end end function BaseView:BindLittleMove(node_trans, dir, target_pos) if not node_trans or not dir or not target_pos then return end if not self.little_move_event then self.little_move_event = true local function onLittleMove(is_out) if not self.little_move_is_show_anim and not is_out then self.little_move_is_show_anim = true end self:BaseViewLittleMove(is_out) self.is_out = is_out end self:BindEvent(GlobalEventSystem, EventName.PLAY_MAINUI_MOVIE_EVENT, onLittleMove) end self.little_move_table = self.little_move_table or {} table.insert(self.little_move_table, {node_trans = node_trans, dir = dir, target_pos = target_pos}) --如果不做动画,则直接调整刘海适配 if not ClientConfig.can_little_move then local function onOrientationChange() if self.is_loaded and not self._use_delete_method then self:BaseViewOrientationChange() end end if not self.orientation_id then self.orientation_id = self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange) end local x, y = GetAnchoredPosition( node_trans) if dir == BaseView.LittleMoveDir.Left then node_trans.anchoredPosition = Vector2( target_pos + ClientConfig.iphone_x_offset_left , y) elseif dir == BaseView.LittleMoveDir.Right then node_trans.anchoredPosition = Vector2( target_pos - ClientConfig.iphone_x_offset_right, y) elseif dir == BaseView.LittleMoveDir.Top then node_trans.anchoredPosition = Vector2( x, target_pos) else node_trans.anchoredPosition = Vector2( x, target_pos) end return end --初始化节点的位置 local x, y = GetAnchoredPosition(node_trans) if dir == BaseView.LittleMoveDir.Left then node_trans.anchoredPosition = Vector2(target_pos + ClientConfig.iphone_x_offset_left-MainUIModel.LITTLE_MOVE_DIST, y) elseif dir == BaseView.LittleMoveDir.Right then node_trans.anchoredPosition = Vector2(target_pos - ClientConfig.iphone_x_offset_right+MainUIModel.LITTLE_MOVE_DIST , y) elseif dir == BaseView.LittleMoveDir.Top then node_trans.anchoredPosition = Vector2( x,target_pos+MainUIModel.LITTLE_MOVE_DIST) else node_trans.anchoredPosition = Vector2( x,target_pos-MainUIModel.LITTLE_MOVE_DIST) end if self.little_move_load_view_time_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.little_move_load_view_time_id) self.little_move_load_view_time_id = false end local function open_view_little_move_func() if not self.little_move_is_show_anim then self:BaseViewLittleMove() end end self.little_move_is_show_anim = false self.little_move_load_view_time_id = TimerQuest.AddDelayQuest(GlobalTimerQuest, open_view_little_move_func, 0.1) local function onOrientationChange() if self.is_loaded and not self._use_delete_method and self.littleMove_is_anim then self:BaseViewLittleMoveOrientationChange() end end if not self.orientation_id then self.orientation_id = self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange) end end function BaseView:StopLittleMoveAnim() if self.little_move_tween_list and #self.little_move_tween_list > 0 then for i,v in ipairs(self.little_move_tween_list) do TweenLite.Stop(v) end self.little_move_tween_list = false end if self.little_move_load_view_time_id then TimerQuest.CancelQuest(GlobalTimerQuest, self.little_move_load_view_time_id) self.little_move_load_view_time_id = false end end --屏幕翻转 function BaseView:BaseViewLittleMoveOrientationChange( ) if self.is_out then for i,v in ipairs(self.little_move_table) do local x, y = GetAnchoredPosition( v.node_trans) if v.dir == BaseView.LittleMoveDir.Left then v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left - MainUIModel.LITTLE_MOVE_OUT_DIST, y) elseif v.dir == BaseView.LittleMoveDir.Right then v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right + MainUIModel.LITTLE_MOVE_OUT_DIST, y) elseif v.dir == BaseView.LittleMoveDir.Top then v.node_trans.anchoredPosition = Vector2( x, v.target_pos + MainUIModel.LITTLE_MOVE_OUT_DIST) else v.node_trans.anchoredPosition = Vector2( x, v.target_pos - MainUIModel.LITTLE_MOVE_OUT_DIST) end end else self:BaseViewOrientationChange() end end --屏幕翻转时,位置纠正 function BaseView:BaseViewOrientationChange( ) for i,v in ipairs(self.little_move_table) do local x, y = GetAnchoredPosition( v.node_trans) if v.dir == BaseView.LittleMoveDir.Left then v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left , y) elseif v.dir == BaseView.LittleMoveDir.Right then v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right, y) elseif v.dir == BaseView.LittleMoveDir.Top then v.node_trans.anchoredPosition = Vector2( x, v.target_pos) else v.node_trans.anchoredPosition = Vector2( x, v.target_pos) end end end function BaseView:BaseViewLittleMove( is_out ) if not self.little_move_table or #self.little_move_table <= 0 then return end self:StopLittleMoveAnim() self.little_move_tween_list = {} self.littleMove_is_anim = true local function end_func( ... ) self.littleMove_is_anim = false end if is_out then for i,v in ipairs(self.little_move_table) do local x, y = GetAnchoredPosition( v.node_trans) if v.dir == BaseView.LittleMoveDir.Left then v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left, y) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos + ClientConfig.iphone_x_offset_left - MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME, end_func) elseif v.dir == BaseView.LittleMoveDir.Right then v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right, y) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos - ClientConfig.iphone_x_offset_right + MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func) elseif v.dir == BaseView.LittleMoveDir.Top then v.node_trans.anchoredPosition = Vector2( x, v.target_pos) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos + MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func) else v.node_trans.anchoredPosition = Vector2( x, v.target_pos) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos - MainUIModel.LITTLE_MOVE_OUT_DIST, MainUIModel.LITTLE_MOVE_OUT_TIME,end_func) end end else for i,v in ipairs(self.little_move_table) do local x, y = GetAnchoredPosition( v.node_trans) if v.dir == BaseView.LittleMoveDir.Left then v.node_trans.anchoredPosition = Vector2( v.target_pos + ClientConfig.iphone_x_offset_left-MainUIModel.LITTLE_MOVE_DIST, y) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos + ClientConfig.iphone_x_offset_left , MainUIModel.LITTLE_MOVE_TIME,end_func) elseif v.dir == BaseView.LittleMoveDir.Right then v.node_trans.anchoredPosition = Vector2( v.target_pos - ClientConfig.iphone_x_offset_right+MainUIModel.LITTLE_MOVE_DIST , y) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSX, v.target_pos - ClientConfig.iphone_x_offset_right, MainUIModel.LITTLE_MOVE_TIME,end_func) elseif v.dir == BaseView.LittleMoveDir.Top then v.node_trans.anchoredPosition = Vector2( x, v.target_pos+MainUIModel.LITTLE_MOVE_DIST) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos , MainUIModel.LITTLE_MOVE_TIME,end_func) else v.node_trans.anchoredPosition = Vector2( x, v.target_pos-MainUIModel.LITTLE_MOVE_DIST) self.little_move_tween_list[i] = TweenLite.to(self, v.node_trans, TweenLite.UiAnimationType.ANCHORED_POSY, v.target_pos , MainUIModel.LITTLE_MOVE_TIME,end_func) end end end end -- 绑定主界面聊天UI的展开(展开时被遮挡的UI绑定这个事件后会隐藏掉UI) function BaseView:BindMainUIExpandEvent( con_tran ) if not con_tran or (not con_tran.gameObject) then return end self.main_ui_func_btn_con_list = self.main_ui_func_btn_con_list or {} if TableSize(self.main_ui_func_btn_con_list) <= 0 then local function set_func_btn_show() self:SetFuncBtnShow() end self:BindEvent(GlobalEventSystem, EventName.MAIN_UI_CON_EXPAND, set_func_btn_show) end table.insert(self.main_ui_func_btn_con_list, con_tran) -- 初始化一次 self:SetFuncBtnShow() end -- 设置fun_btn的显示状态 function BaseView:SetFuncBtnShow( ) local main_ui_is_expand = MainUIModel:getInstance():MainChatUIIsExpand() for k,v in pairs(self.main_ui_func_btn_con_list) do v.gameObject:SetActive(not main_ui_is_expand) end end