源战役客户端
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

1224 lignes
37 KiB

--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