using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using JCUnityLib; public class ViewMgr : ViewManager { protected override void OnInited() { //设置视图组 SetViewGroup(1); //场景监听 SceneManager.sceneLoaded += (scene, mode) => { if (scene.name == "Home") { ResumeViews(dontDestroyViews); } }; SceneManager.sceneUnloaded += (scene) => { if (scene.name == "Home") { DestroyAllViewsExcludeDontDestroy(); HideViews(dontDestroyViews); } }; } //以下名称的预制体通过SceneResourceManager获取 HashSet scenePrefabs = new HashSet(new string[] { //Home "TopBarView", "HomeView", "GameStartView", "ChallengeOptionView", "PKGameOptionView", "PKMatchView", "RoleSelectView" }); protected override GameObject LoadViewPrefab(string viewName) { if (scenePrefabs.Contains(viewName)) return SceneResourceManager.Instance.GetPrefab(viewName); return base.LoadViewPrefab("Home/" + viewName); } //以下名称的界面不会随场景销毁而销毁 HashSet dontDestroyViews = new HashSet(new string[] { //Home "GameStartView", "ChallengeOptionView", "RoleSelectView", "PKGameOptionView", "PKMatchView" }); protected override void ShowView(ViewBase viewBase, object[] args) { base.ShowView(viewBase, args); string viewName = viewBase.GetType().Name; //主要是为了删除名称中的(Clone) viewBase.gameObject.name = viewName; //某些界面设置为不销毁 if (dontDestroyViews.Contains(viewName)) viewBase.dontDestroy = true; //旧版ui适配新ui框架 RectTransform rectTransform = (RectTransform) viewBase.transform; rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.pivot = Vector2.one / 2; rectTransform.localScale = Vector3.one; var canvasScaler = rectTransform.GetComponent(); if (canvasScaler) Destroy(canvasScaler); //特殊处理 if (viewName == "HomeView") rectTransform.SetSiblingIndex(0); } public void ResumeViews(IEnumerable viewNames, params object[] args) { foreach (var viewName in viewNames) { ViewBase viewBase; if (viewDict.TryGetValue(viewName, out viewBase)) { ShowView(viewBase, args); } } } public void HideViews(IEnumerable viewNames, params object[] args) { foreach (var viewName in viewNames) { ViewBase viewBase; if (viewDict.TryGetValue(viewName, out viewBase)) { HideView(viewBase, false, args); } } } }