源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1223 lines
37 KiB

  1. --lua端的窗口管理器
  2. LuaViewManager = LuaViewManager or BaseClass(EventDispatcher)
  3. local LuaViewManager = LuaViewManager
  4. local rawget = rawget
  5. local SetGameFrameRate = SetGameFrameRate
  6. local Time = Time
  7. local IsTableEmpty = IsTableEmpty
  8. local math_ceil = math.ceil
  9. LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE = "LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE"
  10. LuaViewManager.SHORT_CHANGE_MAIN_CANVAS_VISIBLE = "LuaViewManager.SHORT_CHANGE_MAIN_CANVAS_VISIBLE"
  11. LuaViewManager.HIDE_ITEM_USE_VIEW = "LuaViewManager.HIDE_ITEM_USE_VIEW"
  12. LuaViewManager.PUSH_VIEWS_OUT_SCREEN = "LuaViewManager.PUSH_VIEWS_OUT_SCREEN"
  13. LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE = "LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE"
  14. function LuaViewManager:__init()
  15. LuaViewManager.Instance = self
  16. self.maskIdPool = {
  17. maxID = 1,
  18. list = {},
  19. Pop = function(self)
  20. local length = #self.list
  21. if length > 0 then
  22. local result = self.list[length]
  23. table.remove(self.list, length)
  24. return result
  25. else
  26. if self.maxID == 255 then
  27. logWarn("MaskID分配已到达上限!!")
  28. return nil
  29. else
  30. self.maxID = self.maxID + 2
  31. return self.maxID - 2
  32. end
  33. end
  34. end,
  35. Push = function(self, mid)
  36. table.insert(self.list, mid)
  37. end,
  38. }
  39. self.view_ctl_queue = {}
  40. self.view_id = 0
  41. self.view_activity_ctl_queue = {}--活动层级界面堆栈
  42. self.act_view_id = 0
  43. self.all_view_queue = {} --所有界面
  44. self.main_canvas_visible_timer = false --主界面画布,延时显示处理
  45. self.update_main_canvas_time = 0
  46. --资源预加载,场景切完之后
  47. local function scene_load_view_complete()
  48. -- if not self.has_load_res then
  49. -- self.has_load_res = true
  50. self.pre_load_res_list = {
  51. {name = "mrsd_xuanzhong_001", is_static = true},
  52. {name = "mrsd_skills_skybox01", is_static = true},
  53. {name = "effect_beibao_1_1", is_static = true},
  54. {name = "effect_beibao_1_2", is_static = true},
  55. {name = "effect_beibao_1_3", is_static = true},
  56. {name = "effect_beibao_2_1", is_static = true},
  57. {name = "effect_beibao_3_1", is_static = true},
  58. {name = "effect_beibao_3_2", is_static = true},
  59. {name = "ui_kaizhan", is_static = true},
  60. {name = "effect_monster_born", is_static = false},
  61. {name = "effect_transmit_flydown2", is_static = false},
  62. {name = "effect_transmit_flydown3", is_static = false},
  63. }
  64. local role_level = RoleManager.Instance.mainRoleInfo.level
  65. local scene_id = SceneManager:getInstance():GetSceneId()
  66. if role_level <= 80 then
  67. self.story_res_list = self.story_res_list or {
  68. [1001] = {
  69. max_level = 20,
  70. res_list = {
  71. {name = "model_clothe_20010004", is_static = false},
  72. {name = "model_clothe_20030007", is_static = false},
  73. },
  74. },
  75. [1002] = {
  76. max_level = 30,
  77. res_list = {
  78. {name = "model_clothe_20010002", is_static = false},
  79. },
  80. },
  81. [1004] = {
  82. max_level = 80,
  83. res_list = {
  84. {name = "model_clothe_20040004", is_static = false},
  85. },
  86. },
  87. }
  88. local scene_cfg = self.story_res_list[scene_id]
  89. if scene_cfg and role_level <= scene_cfg.max_level then
  90. for k,v in pairs(scene_cfg.res_list) do
  91. self.pre_load_res_list[#self.pre_load_res_list+1] = v
  92. end
  93. end
  94. end
  95. self.index = self.index or 1
  96. local function on_step( )
  97. local res = self.pre_load_res_list[self.index]
  98. if self.index > #self.pre_load_res_list or not res then
  99. self.index = 1
  100. if self.pre_load_res_timer then
  101. GlobalTimerQuest:CancelQuest(self.pre_load_res_timer)
  102. self.pre_load_res_timer = nil
  103. end
  104. return
  105. end
  106. if res.is_static and lua_resM.static_obj_name_list[res.name] then
  107. --已存在的静态资源就不要重复加载了
  108. else
  109. local function load_call_back( objs, is_gameObject )
  110. if objs and objs[0] then
  111. local effect_go = is_gameObject and objs[0] or newObject(objs[0])
  112. lua_resM:AddObjToPool(self, res.name, res.name, effect_go)
  113. end
  114. end
  115. if res.is_static then
  116. lua_resM:AppendStaticObjName(res.name)
  117. end
  118. lua_resM:loadPrefab(self, res.name, res.name, load_call_back, true)
  119. end
  120. self.index = self.index + 1
  121. end
  122. if not self.pre_load_res_timer then
  123. self.pre_load_res_timer = GlobalTimerQuest:AddPeriodQuest(on_step, 0.1)
  124. end
  125. -- end
  126. end
  127. GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, scene_load_view_complete)
  128. local function onInitMainCanvasData()
  129. if IsNull(self.main_cancas_con) then
  130. self.scene_obj_container = panelMgr:GetParent("SceneObjContainer")
  131. self.scene_nameboard_obj = panelMgr:GetParent("NameBoard").gameObject
  132. self.main_cancas = panelMgr:GetParent("Main")
  133. self.main_cancas_con = UiFactory.createChild(self.main_cancas, UIType.EmptyObject, "main_cancas_con").transform
  134. self.main_cancas_con_go = self.main_cancas_con.gameObject
  135. self.main_cancas_con.localPosition = Vector3.zero
  136. self.main_cancas_con.sizeDelta = Vector2(ScreenWidth, ScreenHeight)
  137. self.main_cancas_con.gameObject:SetActive(false)
  138. self.main_canvas_hideView_list = {}
  139. setmetatable(self.main_canvas_hideView_list, {__mode = "k"}) --弱引用
  140. self.main_cancas_last_visible = true
  141. end
  142. end
  143. GlobalEventSystem:Bind(EventName.GAME_UI_LOAD_COMPLETED, onInitMainCanvasData)
  144. self.update_visible = false
  145. local function onUpdateMainCanvasVisible(view, visible)
  146. if self.main_cancas_con == nil then return end
  147. if visible then --主界面是否需要显示
  148. if view then
  149. self.main_canvas_hideView_list[view] = nil
  150. end
  151. self.update_main_canvas_time = Time.time + 0.045
  152. else
  153. self.main_canvas_hideView_list[view] = true
  154. self.update_main_canvas_time = Time.time + 0.03
  155. end
  156. self.update_visible = true
  157. --DEFAULT场景对象层,
  158. if view and view.hide_maincancas then
  159. MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.DEFAULT, visible)
  160. if self.scene_nameboard_obj then
  161. self.scene_nameboard_obj:SetActive(visible)
  162. end
  163. --显示天空盒时候,不要操作地表
  164. if view.model_activity_bg or view.need_culling_mask_ground then
  165. if Scene.getInstance().is_showing_sky_box then
  166. MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, true)
  167. else
  168. MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, visible)
  169. end
  170. end
  171. end
  172. end
  173. self:Bind(LuaViewManager.CHANGE_MAIN_CANVAS_VISIBLE, onUpdateMainCanvasVisible)
  174. local function onHideItemUseView(bool)
  175. if bool then
  176. ItemUseModel:getInstance():HideItemUseView()
  177. else
  178. ItemUseModel:getInstance():ShowItemUseView()
  179. end
  180. end
  181. self:Bind(LuaViewManager.HIDE_ITEM_USE_VIEW, onHideItemUseView)
  182. self.is_lock_screen = false
  183. local function onScreenBrightDelHandler()
  184. self.is_lock_screen = true
  185. self:ChangeLockScreenState()
  186. -- onUpdateMainCanvasVisible("ScreenBright", false)
  187. --SetGameFrameRate(30)
  188. end
  189. GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_DEL_EVENT, onScreenBrightDelHandler)
  190. local function onScreenBrightAddHandler()
  191. self.is_lock_screen = false
  192. self:ChangeLockScreenState()
  193. --SetGameFrameRate()
  194. -- onUpdateMainCanvasVisible("ScreenBright", true)
  195. end
  196. GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_ADD_EVENT, onScreenBrightAddHandler)
  197. local function onViewDoAnimHandler(show, target_view)
  198. self:DoMoveUIRootAnim(show, target_view)
  199. end
  200. GlobalEventSystem:Bind(EventName.BASEVIEW_DO_VIEW_ANIM, onViewDoAnimHandler)
  201. self.show_loading_view_list = {} --显示loading的界面列表
  202. self.show_loading_step = 0
  203. self.delay_ui_list = Array.New() --延迟加载ui队列
  204. Runner.Instance:AddRunObj(self, 1)
  205. end
  206. function LuaViewManager:ClearTimer()
  207. if self.hide_hook_role_timer_id then
  208. GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id)
  209. self.hide_hook_role_timer_id = nil
  210. end
  211. if self.show_hook_role_timer_id then
  212. GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id)
  213. self.show_hook_role_timer_id = nil
  214. end
  215. end
  216. function LuaViewManager:ChangeLockScreenState()
  217. if Scene then
  218. local main_role = Scene:getInstance():GetMainRole()
  219. if self.is_lock_screen then
  220. if main_role then
  221. if main_role.sprite and not main_role.sprite:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  222. main_role.sprite:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  223. end
  224. if main_role.pet and not main_role.pet:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  225. main_role.pet:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  226. end
  227. if main_role.baby and not main_role.baby:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  228. main_role.baby:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  229. end
  230. if main_role.pokemon and not main_role.pokemon:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  231. main_role.pokemon:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  232. end
  233. local partner_list = Scene.Instance.partner_list
  234. for _,partner in pairs(partner_list) do
  235. partner:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  236. end
  237. main_role:RemoveLivenessImage()
  238. end
  239. MainCamera.Instance:SetScreenEffectCamereState(false)
  240. GlobalEventSystem:Fire(SceneEventType.HIDE_ALL_MONSTER)
  241. local hook_role_list = Scene.Instance.hook_role_list
  242. if TableSize(hook_role_list) > 0 then
  243. local list = {}
  244. for _,hook_role in pairs(hook_role_list) do
  245. table.insert(list,hook_role)
  246. end
  247. if self.hide_hook_role_timer_id then
  248. GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id)
  249. self.hide_hook_role_timer_id = nil
  250. end
  251. local index = 0
  252. local max_index = #list
  253. local function onTimer()
  254. index = index + 1
  255. local hook_role = list[index]
  256. if hook_role then
  257. hook_role:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, true)
  258. hook_role:DoStand()
  259. end
  260. if index >= max_index then
  261. if self.hide_hook_role_timer_id then
  262. GlobalTimerQuest:CancelQuest(self.hide_hook_role_timer_id)
  263. self.hide_hook_role_timer_id = nil
  264. end
  265. end
  266. end
  267. self.hide_hook_role_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer,0.1)
  268. end
  269. else
  270. if main_role then
  271. if main_role.sprite and main_role.sprite:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  272. main_role.sprite:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  273. end
  274. if main_role.pet and main_role.pet:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  275. main_role.pet:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  276. end
  277. if main_role.baby and main_role.baby:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  278. main_role.baby:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  279. end
  280. if main_role.pokemon and main_role.pokemon:HasModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2) then
  281. main_role.pokemon:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  282. end
  283. local partner_list = Scene.Instance.partner_list
  284. for _,partner in pairs(partner_list) do
  285. partner:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  286. end
  287. main_role:ShowLivenessImage()
  288. end
  289. MainCamera.Instance:SetScreenEffectCamereState(true)
  290. GlobalEventSystem:Fire(SceneEventType.SHOW_ALL_MONSTER)
  291. local monster_list = Scene.Instance.monster_list
  292. for id, mon in pairs(monster_list) do
  293. if mon:IsInState(PoseState.MOVE) then
  294. mon:UpdateMoveEndPos()
  295. else
  296. mon:DoStand()
  297. end
  298. end
  299. local hook_role_list = Scene.Instance.hook_role_list
  300. if TableSize(hook_role_list) > 0 then
  301. local list = {}
  302. for _,hook_role in pairs(hook_role_list) do
  303. table.insert(list,hook_role)
  304. end
  305. if self.show_hook_role_timer_id then
  306. GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id)
  307. self.show_hook_role_timer_id = nil
  308. end
  309. local index = 0
  310. local max_index = #list
  311. local function onTimer()
  312. index = index + 1
  313. local hook_role = list[index]
  314. if hook_role then
  315. hook_role:SetModelHideFlag(SceneObj.ModelHideFlag.IndependentHide2, false)
  316. end
  317. if index >= max_index then
  318. if self.show_hook_role_timer_id then
  319. GlobalTimerQuest:CancelQuest(self.show_hook_role_timer_id)
  320. self.show_hook_role_timer_id = nil
  321. end
  322. end
  323. end
  324. self.show_hook_role_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer,0.1)
  325. end
  326. end
  327. GlobalEventSystem:Fire(SceneEventType.UPDATE_ROLE_LIMIT)
  328. end
  329. end
  330. --移出屏幕外,还是会渲染
  331. function LuaViewManager:PushViewsOutScreen()
  332. --为了解决聊天框表情错乱问题。是由于重设了父对象,没更新网格
  333. ChatModel:getInstance():Fire(ChatModel.HIDE_MIAN_UI_CHAT_VIEW,false)
  334. SetLocalPositionY(self.main_cancas_con, 99999)
  335. end
  336. function LuaViewManager:PopViewsInScreen()
  337. SetLocalPositionY(self.main_cancas_con, 0)
  338. end
  339. LuaViewManager.MAINCANVAS_OUT_ANI_TOGGLE = true
  340. function LuaViewManager:ChangeMainCanvasVisible(flag)
  341. -- if not IsNull(self.main_cancas_con_go) then
  342. -- self.main_cancas_con_go:SetActive(flag)
  343. -- end
  344. if flag then
  345. local len = self.main_cancas_con.childCount - 1
  346. local list = {}
  347. for i = 0, len do
  348. table.insert(list, self.main_cancas_con:GetChild(i))
  349. end
  350. for i, child in ipairs(list) do
  351. child:SetParent(self.main_cancas)
  352. end
  353. else
  354. local len = self.main_cancas.childCount - 1
  355. local list = {}
  356. for i = 0, len do
  357. if self.main_cancas:GetChild(i) == self.main_cancas_con then
  358. -- Message.show("==============")
  359. else
  360. table.insert(list, self.main_cancas:GetChild(i))
  361. end
  362. end
  363. for i, child in ipairs(list) do
  364. child:SetParent(self.main_cancas_con)
  365. end
  366. end
  367. end
  368. function LuaViewManager:BocastChangeVisibleEvent( )
  369. self:Fire(LuaViewManager.BOCAST_MAIN_CANVAS_LAST_STATE,self.main_cancas_last_visible)
  370. if self.main_cancas_last_visible then
  371. if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then
  372. GlobalEventSystem:Fire(EventName.PLAY_MAINUI_MOVIE_CENTER_EVENT)
  373. end
  374. else
  375. if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight and LuaViewManager.MAINCANVAS_OUT_ANI_TOGGLE then
  376. GlobalEventSystem:Fire(EventName.PLAY_MAINUI_MOVIE_CENTER_EVENT, true)
  377. end
  378. end
  379. end
  380. function LuaViewManager:ChangeSceneObjContainerVisible( flag )
  381. --DEFAULT是场景对象所在的层级
  382. -- MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.DEFAULT, flag)
  383. MainCamera:getInstance():SetPostEffectEnable(flag)
  384. if flag then
  385. local is_empty = IsTableEmpty(self.back_ui_target_table)
  386. if is_empty then
  387. self:SetUICameraEnable(not flag) --这里只负责统一关闭,开启的话由各个界面加载模型的时候去控制
  388. end
  389. end
  390. end
  391. --放入main层的隐藏父类里
  392. function LuaViewManager:PuskMainCanvasCon(transform)
  393. if transform and self.main_cancas_con then
  394. transform:SetParent(self.main_cancas_con)
  395. end
  396. end
  397. function LuaViewManager:GetFrameUpdateCount()
  398. if self.main_cancas_last_visible then
  399. return 1
  400. else
  401. return 3
  402. end
  403. end
  404. function LuaViewManager:getInstance()
  405. if LuaViewManager.Instance == nil then
  406. LuaViewManager.Instance = LuaViewManager.New()
  407. end
  408. return LuaViewManager.Instance
  409. end
  410. --添加进入延迟队列
  411. function LuaViewManager:AddDelayQueue(call_back)
  412. self.delay_ui_list:PushBack(call_back)
  413. return call_back
  414. end
  415. --移除
  416. function LuaViewManager:RemoveDelayQueue(call_back)
  417. local index = self.delay_ui_list:IndexOf(call_back)
  418. if index and index > 0 then
  419. self.delay_ui_list:Erase(index - 1)
  420. end
  421. end
  422. function LuaViewManager:NoDependHideView()
  423. for k,v in pairs(self.main_canvas_hideView_list) do
  424. print("main_canvas_hideView_list k", k)
  425. end
  426. print("tanar: [LuaViewManager 425]=> IsTableEmpty(self.main_canvas_hideView_list): ",IsTableEmpty(self.main_canvas_hideView_list))
  427. if IsTableEmpty(self.main_canvas_hideView_list) then
  428. return true
  429. end
  430. end
  431. function LuaViewManager:Update(now_time, elapse_time)
  432. if self.update_visible and now_time - self.update_main_canvas_time > 0 then
  433. self.update_visible = false
  434. if self:NoDependHideView() then
  435. if not self.main_cancas_last_visible then
  436. self.main_cancas_last_visible = true
  437. self:ChangeMainCanvasVisible(true)
  438. self:BocastChangeVisibleEvent()
  439. self:ChangeSceneObjContainerVisible(true)
  440. --主聊天界面单独处理 先显示后隐藏,不然有bug
  441. GlobalEventSystem:Fire(EventName.HIDE_MAIN_CHAT_VIEW, true, MainUIModel and MainUIModel.OTHER_MODE2)
  442. GlobalEventSystem:Fire(EventName.HIDE_MAIN_CHAT_VIEW, false, MainUIModel and MainUIModel.OTHER_MODE2)
  443. -- if not self.is_lock_screen then
  444. -- SetGameFrameRate()
  445. -- end
  446. end
  447. else
  448. if self.main_cancas_last_visible then
  449. self.main_cancas_last_visible = false
  450. self:ChangeMainCanvasVisible(false)
  451. self:BocastChangeVisibleEvent()
  452. self:ChangeSceneObjContainerVisible(false)
  453. if not self.is_lock_screen then
  454. SetGameFrameRate()
  455. end
  456. end
  457. end
  458. end
  459. local size = self.delay_ui_list:GetSize()
  460. if size > 0 then
  461. local call_back
  462. if size <= 10 then
  463. call_back = self.delay_ui_list:PopFront()
  464. if call_back then
  465. call_back()
  466. end
  467. else
  468. size = math_ceil(size * 0.1)
  469. for i = 1, size do
  470. local call_back = self.delay_ui_list:PopFront()
  471. if call_back then
  472. call_back()
  473. end
  474. end
  475. end
  476. end
  477. -- if self.show_loading_step % 13 == 0 then
  478. -- self:CheckLoadingState(now_time)
  479. -- end
  480. -- self.show_loading_step = self.show_loading_step + 1
  481. end
  482. --检测loading状态
  483. function LuaViewManager:CheckLoadingState(now_time)
  484. local delete_list = nil
  485. local show_loading = false
  486. now_time = now_time or Status.NowTime
  487. for id, info in pairs(self.show_loading_view_list) do
  488. if now_time >= info.hide_time then
  489. delete_list = delete_list or {}
  490. table.insert(delete_list, id)
  491. elseif not show_loading and now_time >= info.start_show_time and now_time <= info.hide_time then
  492. show_loading = true
  493. end
  494. end
  495. if delete_list then
  496. for i, id in ipairs(delete_list) do
  497. self.show_loading_view_list[id] = nil
  498. end
  499. end
  500. if show_loading then
  501. self:ShowLoading()
  502. else
  503. self:CloseLoading()
  504. end
  505. end
  506. --显示loading
  507. function LuaViewManager:ShowLoading()
  508. if not self.loadingView then
  509. self.loadingView = LoadingView.New()
  510. end
  511. if not self.loadingView:HasOpen() then
  512. self.loadingView:Open()
  513. end
  514. end
  515. --隐藏loading
  516. function LuaViewManager:CloseLoading()
  517. if self.loadingView and self.loadingView:HasOpen() == true then
  518. self.loadingView:Close()
  519. end
  520. end
  521. --添加需要显示loading进度的界面对象
  522. function LuaViewManager:AddLoadingView(id)
  523. local info = {start_show_time = Status.NowTime + 0.6, hide_time = Status.NowTime + 8}
  524. self.show_loading_view_list[id] = info
  525. end
  526. --移除loading界面对象
  527. function LuaViewManager:RemoveLoadingView(id)
  528. self.show_loading_view_list[id] = nil
  529. self:CheckLoadingState()
  530. end
  531. function LuaViewManager:LoadView(ref_tar,abName,pfName,layerName,callBack)
  532. lua_resM:addRefCount(ref_tar,abName)
  533. -- use_local_view UI本地加载,true的话直接加载Hierarchy上的挂着的预设
  534. if ref_tar.use_local_view and (IsNull(ApplicationPlatform) or SystemRuntimePlatform.IsWindowsEditor()) then
  535. local root_path = "root/Canvas/"
  536. if layerName == "Main" then
  537. root_path = "root/BackCanvas/"
  538. end
  539. local view_path = root_path .. layerName .. "/" .. pfName
  540. local go = GameObject.Find(view_path)
  541. if go then
  542. go.layer = LayerMask.NameToLayer("UI")
  543. go.transform.localScale = Vector3.one
  544. go.transform.localPosition = Vector3.zero
  545. go.gameObject:SetActive(true)
  546. callBack(go)
  547. else
  548. Message.show("找不到本地界面:" .. view_path)
  549. ref_tar.use_local_view = false
  550. panelMgr:CreateView(abName,pfName,layerName,callBack)
  551. end
  552. else
  553. ref_tar.use_local_view = false
  554. panelMgr:CreateView(abName,pfName,layerName,callBack)
  555. end
  556. end
  557. function LuaViewManager:OpenView(ref_tar)
  558. self.cur_layout = ref_tar.layout_file --用于引导
  559. self.cur_use_background = ref_tar.use_background
  560. self.cur_layer_name = ref_tar.layer_name
  561. self.all_view_queue[ref_tar] = true
  562. --引导界面打开关闭,不加入队列
  563. if self.cur_layout == "GuidePromptView" then return end
  564. --1级界面,自动加入到管理队列里面
  565. if (ref_tar.append_to_ctl_queue or ref_tar.layer_name == "UI") and self.view_ctl_queue[ref_tar] == nil then
  566. for view, _ in pairs(self.view_ctl_queue) do
  567. view:Hide()
  568. end
  569. self.view_id = self.view_id + 1
  570. self.view_ctl_queue[ref_tar] = self.view_id
  571. end
  572. --2级界面,自动加入到管理队列里面
  573. 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
  574. for view, _ in pairs(self.view_activity_ctl_queue) do
  575. view:Hide()
  576. end
  577. self.act_view_id = self.act_view_id + 1
  578. self.view_activity_ctl_queue[ref_tar] = self.act_view_id
  579. end
  580. end
  581. function LuaViewManager:CloseView(ref_tar)
  582. self.last_use_background = ref_tar.use_background
  583. if self.view_ctl_queue[ref_tar] then--不管如何进来有的话就要清掉
  584. self.view_ctl_queue[ref_tar] = nil
  585. end
  586. if self.view_activity_ctl_queue[ref_tar] then--不管如何进来有的话就要清掉
  587. self.view_activity_ctl_queue[ref_tar] = nil
  588. end
  589. if self.all_view_queue[ref_tar] then --不管如何进来有的话就要清掉
  590. self.all_view_queue[ref_tar] = nil
  591. end
  592. --1级界面,自动加入到管理队列里面
  593. if (ref_tar.append_to_ctl_queue or ref_tar.layer_name == "UI") then
  594. local max_id = 0
  595. local max_view = nil
  596. for view, id in pairs(self.view_ctl_queue) do
  597. if id > max_id then
  598. max_id = id
  599. max_view = view
  600. end
  601. end
  602. if max_view then
  603. -- self.view_id = self.view_id - 1
  604. max_view:CancelHide()
  605. end
  606. end
  607. --活动层级相关这里也要加入堆栈
  608. if (not ref_tar.append_to_ctl_queue and ref_tar.layer_name == "Activity" and not ref_tar.force_no_ctl_queue) then
  609. local max_id = 0
  610. local max_view = nil
  611. for view, id in pairs(self.view_activity_ctl_queue) do
  612. if id > max_id then
  613. max_id = id
  614. max_view = view
  615. end
  616. end
  617. if max_view then
  618. -- self.act_view_id = self.act_view_id - 1
  619. max_view:CancelHide()
  620. end
  621. end
  622. if Scene and Scene.Instance and TableSize(self.view_ctl_queue) == 0 then
  623. Scene.Instance:ChangeFogEnable(true)
  624. end
  625. end
  626. function LuaViewManager:DestroyView(gameObject)
  627. -- panelMgr:CloseView(gameObject)
  628. destroy(gameObject, true)
  629. end
  630. function LuaViewManager:LoadItem(ref_tar,abName,pfName,callBack)
  631. lua_resM:addRefCount(ref_tar,abName)
  632. if ref_tar.use_local_view and SystemRuntimePlatform.IsWindowsEditor() then
  633. local root_path = "root/Canvas/"
  634. if layerName == "Main" then
  635. root_path = "root/BackCanvas/"
  636. end
  637. local view_path = root_path .. pfName
  638. local go = GameObject.Find(view_path)
  639. if go then
  640. local item = newObject(go)
  641. item.layer = LayerMask.NameToLayer("UI")
  642. item.gameObject:SetActive(true)
  643. callBack(item)
  644. else
  645. Message.show("找不到本地界面:" .. view_path)
  646. ref_tar.use_local_view = false
  647. panelMgr:LoadItem(abName,pfName,callBack)
  648. end
  649. else
  650. ref_tar.use_local_view = false
  651. panelMgr:LoadItem(abName,pfName,callBack)
  652. end
  653. -- local function onLoadItemCallback(objs)
  654. -- if not ref_tar._use_delete_method then
  655. -- local go = nil
  656. -- if objs and objs[0] then
  657. -- go = newObject(objs[0])
  658. -- --go.name = assetName;
  659. -- go.layer = UIPartical.RenderingOther_List.UI
  660. -- --go.transform:SetParent(panelMgr:GetParent(layerName))
  661. -- -- go.transform.localScale = Vector3.one
  662. -- -- go.transform.localPosition = Vector3.zero
  663. -- end
  664. -- if callBack then
  665. -- callBack(go)
  666. -- end
  667. -- -- lua_resM:ImmeUnLoadAB(abName)
  668. -- end
  669. -- end
  670. -- lua_resM:loadPrefab(ref_tar,abName,pfName,onLoadItemCallback, nil, ASSETS_LEVEL.HIGHT)
  671. end
  672. function LuaViewManager:ClearItem(gameObject)
  673. destroy(gameObject)
  674. -- panelMgr:ClearItem(gameObject)
  675. end
  676. function LuaViewManager:GetMaskID()
  677. return self.maskIdPool:Pop()
  678. end
  679. function LuaViewManager:ReleaseMaskID(mid)
  680. return self.maskIdPool:Push(mid)
  681. end
  682. function LuaViewManager:GetViewNum( )
  683. return TableSize(self.view_ctl_queue)
  684. end
  685. LuaViewManager.BgType =
  686. {
  687. Base = 1,
  688. --Main = 2,
  689. }
  690. --检测需要在后UI层显示的数据
  691. function LuaViewManager:ShowBackData(data)
  692. if not data or not data.target then return end
  693. self.back_ui_list = self.back_ui_list or {}
  694. self.back_ui_target_table = self.back_ui_target_table or {}
  695. local t = false
  696. for i,v in ipairs(self.back_ui_list) do
  697. if v.target == data.target then
  698. t = v
  699. end
  700. end
  701. if t then
  702. --合并背景数据
  703. if data.bg_list and #data.bg_list > 0 then
  704. --背景需要直接覆盖之前的
  705. t.bg_list = data.bg_list
  706. end
  707. --合并背景UI节点数据
  708. if data.node_list and #data.node_list > 0 then
  709. t.node_list = t.node_list or {}
  710. for i,v in ipairs(data.node_list) do
  711. table.insert(t.node_list, v)
  712. end
  713. end
  714. --摄像机参数,如果原来是空并且新传入的部位空,才再次赋值
  715. if not t.camera_args and data.camera_args then
  716. t.camera_args = data.camera_args
  717. end
  718. --黑底参数,如果原来是空并且新传入的部位空,才再次赋值
  719. if not t.activity and data.activity then
  720. t.activity = data.activity
  721. end
  722. else
  723. t = data
  724. self.back_ui_target_table[data.target] = true
  725. table.insert(self.back_ui_list, t)
  726. end
  727. self:LoadUIRes(t)
  728. end
  729. --处理把毕竟或者UI显示在后UI层
  730. function LuaViewManager:LoadUIRes(data)
  731. if not self.is_init_model then
  732. self:InitBackModel()
  733. end
  734. if not data or not data.target then
  735. if self.base_empty_activity_bg then
  736. self.base_empty_activity_bg.gameObject:SetActive(false)
  737. end
  738. self.base_activity_bg.gameObject:SetActive(false)
  739. self.base_win_bg.gameObject:SetActive(false)
  740. self.main_win_bg.gameObject:SetActive(false)
  741. return
  742. end
  743. local bg_list = data.bg_list or {}
  744. --local main_table = bg_list[LuaViewManager.BgType.Main]
  745. local base_table = bg_list[LuaViewManager.BgType.Base]
  746. local activity_table = data.activity or {}
  747. local node_list = data.node_list or {}
  748. local back_camera_args = data.camera_args
  749. -- PrintTable(main_table)
  750. -- PrintTable(base_table)
  751. -- PrintTable(back_camera_args)
  752. -- PrintTable(activity_table)
  753. --设置摄像机
  754. self.role_back_camera.gameObject:SetActive(true)
  755. self:SetBackCamera(back_camera_args)
  756. --黑底处理
  757. local function set_activity_bg(alpha)
  758. alpha = alpha or 0.7
  759. self.base_activity_bg.gameObject:SetActive(true)
  760. self.base_activity_bg.enabled = true
  761. self.base_activity_bg.alpha = alpha
  762. end
  763. if self.base_empty_activity_bg then
  764. self.base_empty_activity_bg.gameObject:SetActive(activity_table and not activity_table.is_show)
  765. end
  766. if activity_table and activity_table.is_show then
  767. set_activity_bg(activity_table.alpha)
  768. else
  769. self.base_activity_bg.gameObject:SetActive(false)
  770. self.base_activity_bg.enabled = false
  771. end
  772. --UI节点处理
  773. if #node_list > 0 then
  774. self:MoveUIBack(node_list)
  775. end
  776. --一级背景处理(最底下的背景)
  777. if base_table then
  778. if self.cur_base_res ~= base_table.res then
  779. self.cur_base_res = base_table.res
  780. local function load_base_bg_callback()
  781. if self.cur_base_res then
  782. self.base_win_bg.gameObject:SetActive(true)
  783. self.base_win_bg.enabled = true
  784. else
  785. self.base_win_bg.gameObject:SetActive(false)
  786. self.base_win_bg.enabled = false
  787. end
  788. end
  789. self:SetArgs(self.base_win_bg, base_table.args)
  790. lua_resM:setOutsideRawImage(self, self.base_win_bg, self.cur_base_res, nil, load_base_bg_callback)
  791. else
  792. self.base_win_bg.gameObject:SetActive(true)
  793. self.base_win_bg.enabled = true
  794. end
  795. else
  796. self.base_win_bg.gameObject:SetActive(false)
  797. end
  798. end
  799. function LuaViewManager:SetBackCameraShow( bool )
  800. if self.role_back_camera and self.role_back_camera.gameObject then
  801. self.role_back_camera.gameObject:SetActive(bool)
  802. end
  803. end
  804. --设置UI的位置和大小
  805. function LuaViewManager:SetArgs(trans, args)
  806. if trans == nil or args == nil then
  807. return
  808. end
  809. SetAnchoredPosition(trans.transform, args.pos.x, args.pos.y)
  810. SetSizeDelta(trans.transform, args.size.x, args.size.y)
  811. end
  812. --初始化分层模块
  813. function LuaViewManager:InitBackModel()
  814. self.is_init_model = true
  815. self.back_node_list = self.back_node_list or {}
  816. self.back_ui_list = self.back_ui_list or {}
  817. self.back_ui_target_table = self.back_ui_target_table or {}
  818. local back_canvae = GameObject.Find("root").transform:Find("BackCanvas")
  819. local bg_canvas = back_canvae.transform:Find("Bg"):GetComponent("Canvas")
  820. bg_canvas.sortingOrder = 400
  821. if not self.base_activity_bg then
  822. self.base_activity_bg = back_canvae.transform:Find("Bg/BgContain/BaseActivityBg"):GetComponent("ImageExtend")
  823. self.base_activity_bg.transform.sizeDelta = Vector2(SrcScreenWidth * 1.2,ScreenHeight * 1.2)
  824. end
  825. if not self.base_empty_activity_bg then
  826. self.base_empty_activity_bg = back_canvae.transform:Find("Bg/BgContain/BaseEmptyActivityBg")
  827. if self.base_empty_activity_bg then
  828. self.base_empty_activity_bg.transform.sizeDelta = Vector2(SrcScreenWidth * 1.2,ScreenHeight * 1.2)
  829. end
  830. self.base_empty_activity_bg.gameObject:SetActive(false)
  831. end
  832. if not self.main_win_bg then
  833. self.main_win_bg = back_canvae.transform:Find("Bg/BgContain/MainWinBg"):GetComponent("RawImage")
  834. end
  835. if not self.base_win_bg then
  836. self.base_win_bg = back_canvae.transform:Find("Bg/BgContain/BaseWinBg"):GetComponent("RawImage")
  837. end
  838. if not self.role_back_camera then
  839. self.role_back_camera = GameObject.Find("root").transform:Find("UIBackRoleCamera")
  840. self.role_back_camera.transform.localRotation = Quaternion.Euler(Vector3(10,1.86,0))
  841. local cam = self.role_back_camera.transform:GetComponent("Camera")
  842. cam.enabled = true
  843. cam.allowHDR = true
  844. --改为透视摄像机
  845. cam.orthographic = false
  846. cam.fieldOfView = 8
  847. cam.farClipPlane = 100
  848. cam.cullingMask = bit.bor(cam.cullingMask, bit.lshift(1,29))
  849. self.role_back_camera_comp = cam
  850. self.role_back_camera.gameObject:SetActive(true)
  851. self:ApplyUIPostEffect()
  852. local function on_delay( )
  853. self:ApplyUIPostEffect()
  854. self.role_back_camera.gameObject:SetActive(false)
  855. end
  856. setTimeout(on_delay, 0.1)
  857. end
  858. if not self.move_root then
  859. self.move_root = back_canvae.transform:Find("Bg/BgContain/MoveUIRoot")
  860. if not self.move_root then
  861. self.move_root = back_canvae.transform:Find("Bg/BgContain")
  862. end
  863. self.move_root.sizeDelta = Vector2(ScreenWidth,ScreenHeight)
  864. end
  865. end
  866. function LuaViewManager:ApplyUIPostEffect( )
  867. if not self.bloom_effect then
  868. self.bloom_effect = self.role_back_camera:GetComponent(typeof(PostEffect))
  869. end
  870. print("tanar: [LuaViewManager 989]=> self.bloom_effect: ",self.bloom_effect)
  871. if not IsNull(self.bloom_effect) then
  872. -- 低端设备就全关掉
  873. if not self:IsSupportUIEffect() then
  874. self.bloom_effect.enabled = false
  875. else
  876. self.bloom_effect.enabled = true
  877. -- 泛光,中高端设备
  878. self.bloom_effect.EnableBloom = true
  879. self.bloom_effect.use_dual_bloom = true
  880. self.bloom_effect.threshold = 0.8
  881. self.bloom_effect.intensity = 1.5
  882. self.bloom_effect.blurSize = 2.5
  883. self.bloom_effect.blurIterations = 3
  884. self.bloom_effect:ApplyBloomMaterialProperties()
  885. print("tanar: LuaViewManager [1005] =========== ")
  886. -- 抗锯齿
  887. -- if not self:IsSupportUIFXAA() then
  888. self.bloom_effect.EnableFXAA = false
  889. -- else
  890. -- self.bloom_effect.EnableFXAA = true
  891. -- self.bloom_effect.subpixelBlending = 0.4
  892. -- self.bloom_effect.lowQuality = true
  893. -- end
  894. -- self.bloom_effect:ApplyFXAAMaterialProperties()
  895. -- 不需要模糊
  896. self.bloom_effect.EnableBlur = false
  897. end
  898. end
  899. end
  900. function LuaViewManager:IsSupportUIEffect( )
  901. if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
  902. return false
  903. end
  904. return true
  905. end
  906. function LuaViewManager:IsSupportUIFXAA( )
  907. if SystemMemoryLevel.Cur == SystemMemoryLevel.Hight then
  908. return true
  909. end
  910. return false
  911. end
  912. --切换泛光效果开关
  913. function LuaViewManager:SetUICameraEnable( flag )
  914. if self.last_ui_camera_flag and self.last_ui_camera_flag == flag then
  915. self.last_ui_camera_flag = flag
  916. return
  917. end
  918. if self.role_back_camera and self.role_back_camera.gameObject then
  919. self.role_back_camera.gameObject:SetActive(flag)
  920. end
  921. end
  922. --切换泛光效果开关脚本
  923. function LuaViewManager:SetUICameraBloomEnable( flag )
  924. if self:IsSupportUIEffect() and self.bloom_effect then
  925. self.bloom_effect.enabled = flag
  926. end
  927. end
  928. --清除默认背景
  929. function LuaViewManager:LoadEmptyBgRes()
  930. if not self.is_init_model then
  931. self:InitBackModel()
  932. end
  933. self.role_back_camera.gameObject:SetActive(false)
  934. self.cur_base_res = nil
  935. self.base_activity_bg.gameObject:SetActive(false)
  936. if self.base_empty_activity_bg then
  937. self.base_empty_activity_bg.gameObject:SetActive(false)
  938. end
  939. self.base_win_bg.gameObject:SetActive(false)
  940. self.main_win_bg.gameObject:SetActive(false)
  941. end
  942. --隐藏某界面的背景
  943. function LuaViewManager:HideBackData(target)
  944. self.back_ui_list = self.back_ui_list or {}
  945. self.back_ui_target_table = self.back_ui_target_table or {}
  946. if #self.back_ui_list == 0 then return end
  947. local idx = -1
  948. for i,v in ipairs(self.back_ui_list) do
  949. if v.target == target then
  950. idx = i
  951. break
  952. end
  953. end
  954. if idx == -1 then return end
  955. self.back_ui_target_table[target] = nil
  956. if self.back_ui_list[idx] and self.back_ui_list[idx].node_list then
  957. self:RemoveUIBack(StartToEnd(self.back_ui_list[idx].node_list))
  958. end
  959. table.remove(table.remove(self.back_ui_list, idx))
  960. self:CheckShow()
  961. end
  962. LuaViewManager.RoleBackCameraPosY = false
  963. LuaViewManager.RoleBackCameraSetting =
  964. {
  965. [1] = {ratio = 1, y = 11.82},
  966. [2] = {ratio = 1.15, y = 11.82},
  967. [3] = {ratio = 1.25, y = 11.82},
  968. [4] = {ratio = 1.3, y = 11.92},
  969. [5] = {ratio = 1.5, y = 12.1},
  970. [6] = {ratio = 1.7, y = 12.1},
  971. }
  972. LuaViewManager.CameraArgs =
  973. {
  974. DepthZero = Vector3(-1.72, 12.1, 446),
  975. Depth2K = Vector3(-1.72, 12.1, 446),
  976. }
  977. --设置模型摄像机
  978. function LuaViewManager:SetBackCamera(args)
  979. if not self.is_init_model then
  980. self:InitBackModel()
  981. end
  982. local pos = (args and args.pos) and args.pos or LuaViewManager.CameraArgs.DepthZero
  983. --根据屏幕分辨率,调整镜头系数,只要调整Y坐标(不调整镜头会歪)
  984. if not LuaViewManager.RoleBackCameraPosY then
  985. local t = LuaViewManager.RoleBackCameraSetting
  986. local ratio = OriginalResolutionWidth / ResolutionHeight
  987. local y = 4.5
  988. if ratio < t[1].ratio then
  989. y = t[1].y
  990. elseif ratio > t[#t].ratio then
  991. y = t[#t].y
  992. else
  993. for i=#t,1,-1 do
  994. if ratio >= t[i].ratio then
  995. y = t[i].y
  996. break
  997. end
  998. end
  999. end
  1000. LuaViewManager.RoleBackCameraPosY = y
  1001. end
  1002. pos.y = LuaViewManager.RoleBackCameraPosY
  1003. self.role_back_camera.localPosition = pos
  1004. --测试
  1005. -- if SystemRuntimePlatform.IsAndroid() then
  1006. -- self.role_back_camera.transform.localPosition = Vector3(0,3.12,476)
  1007. -- end
  1008. end
  1009. --把Ui节点从后背景层,移动到原来的界面
  1010. function LuaViewManager:RemoveUIBack(node_list)
  1011. if not self.is_init_model then
  1012. self:InitBackModel()
  1013. end
  1014. local node_list = node_list or {}
  1015. for k,v in ipairs(node_list) do
  1016. if v and self.back_node_list[v] then
  1017. v.node.transform:SetParent(v.parent)
  1018. v.node.transform:SetSiblingIndex(v.sibling_idx)
  1019. self.back_node_list[v] = nil
  1020. end
  1021. end
  1022. end
  1023. --把Ui节点移到后背景层
  1024. function LuaViewManager:MoveUIBack(node_list)
  1025. if not self.is_init_model then
  1026. self:InitBackModel()
  1027. end
  1028. local node_list = node_list or {}
  1029. for k,v in pairs(node_list) do
  1030. if not self.back_node_list[v] then
  1031. self.back_node_list[v] = true
  1032. local pos_x, pos_y = GetAnchoredPosition(v.node.transform)
  1033. v.node.transform:SetParent(self.move_root.transform)
  1034. SetLocalScale(v.node.transform)
  1035. SetAnchoredPosition(v.node.transform, pos_x, pos_y)
  1036. self:SetArgs(v.node.transform, v.args)
  1037. end
  1038. end
  1039. end
  1040. --检测当前需要显示的背景
  1041. function LuaViewManager:CheckShow()
  1042. if #self.back_ui_list == 0 and TableSize(self.back_node_list) == 0 then
  1043. self:LoadEmptyBgRes()
  1044. else
  1045. local temp = self.back_ui_list[#self.back_ui_list]
  1046. self:LoadUIRes(temp)
  1047. end
  1048. end
  1049. function LuaViewManager:DoMoveUIRootAnim(show, target_view)
  1050. if not self.move_root then return end
  1051. if not self.back_ui_target_table[target_view] then return end
  1052. local function scale_anim_callback()
  1053. if not show then
  1054. SetLocalScale(self.move_root, 1, 1,1)
  1055. end
  1056. end
  1057. local tween_type = show and TweenFunc.EASE_OUT_BACK or TweenFunc.EASE_IN_BACK
  1058. local cfg = show and BaseView.OpenCloseScaleCfg[1] or BaseView.OpenCloseScaleCfg[2]
  1059. local cur_scale = Vector3.New(cfg.start_scale, cfg.start_scale, cfg.start_scale)
  1060. local target_scale = Vector3.New(cfg.end_scale, cfg.end_scale, cfg.end_scale)
  1061. local time = cfg.time
  1062. SetLocalScale(self.move_root, cur_scale.x, cur_scale.y, cur_scale.z)
  1063. if self.scale_anim_id then
  1064. TweenLite.Stop(self.scale_anim_id)
  1065. self.scale_anim_id = nil
  1066. end
  1067. self.scale_anim_id = TweenLite.to(self, self.move_root, TweenLite.UiAnimationType.SCALE, target_scale, time, scale_anim_callback, tween_type)
  1068. end
  1069. --是否当前有带遮罩或者全屏界面
  1070. function LuaViewManager:IsHaveFullScreenViewOrMaskBgView()
  1071. local b = false
  1072. for view,v in pairs(self.all_view_queue) do
  1073. if view.use_background or view.hide_maincancas then
  1074. b = true
  1075. break
  1076. end
  1077. end
  1078. return b
  1079. end