//先尝试从缓存中打开,如果失败则打开一个新的 private void ShowViewFromCacheOrCreateNew(SO_UIViewConfig config, params object[] args) { //先尝试从缓存区中读取 UIViewBase view = GetViewFromCache(config); //缓存区内没有,打开新的 if (view == null) { view = ShowNewView(config); } if (view != null) { PushViewToLayer(view, args); } else { UtilityHelper.LogError(string.Format("Show view failed -> {0}", config.viewName)); } }
//完全打开一个新的 private UIViewBase ShowNewView(SO_UIViewConfig config) { if (!viewDic.ContainsKey(config.viewLayer)) { UtilityHelper.LogError("Show new view failed. Layer error."); return(null); } //加载 UIViewBase view = CreateUIView(config); if (view) { //创建完毕,初始化 view.Init(); view.transform.SetParent(viewDic[config.viewLayer].transform); view.GetComponent <RectTransform>().Normalize(); } return(view); }
//从池中获取界面 private UIViewBase GetViewFromCache(SO_UIViewConfig config) { if (config == null) { return(null); } UIViewBase view = null; List <UIViewBase> cache = null; switch (config.cacheScheme) { case UIViewCacheScheme.Cache: cache = screenUICache; break; case UIViewCacheScheme.TempCache: cache = screenUITempCache; break; default: break; } if (cache != null) { for (int i = 0; i < cache.Count; ++i) { if (cache[i].config.viewName == config.viewName) { view = cache[i]; //从缓冲区中移除 cache.RemoveAt(i); break; } } } return(view); }
//读入界面 private UIViewBase CreateUIView(SO_UIViewConfig config) { GameObject obj = null; #if UNITY_EDITOR obj = UnityEditor.AssetDatabase.LoadAssetAtPath <GameObject>(string.Format("Assets/{0}/{1}.prefab", EGameConstL.GameName, config.BundleName)); if (obj != null) { obj = Instantiate(obj); } #endif if (obj) { obj.transform.CleanName(); var viewBase = obj.GetComponent <UIViewBase>(); return(viewBase); } UtilityHelper.LogError(string.Format("Load view error: no view : {0}", config.assetName)); return(null); }
//初始化界面配置 private void InitViewConfig() { Object[] config = GetAssetsFromBundle("scriptableobjects/uiview.unity3d", typeof(SO_UIViewConfig)); if (config != null) { for (int i = 0; i < config.Length; ++i) { SO_UIViewConfig uvConfig = config[i] as SO_UIViewConfig; if (uvConfig == null) { continue; } if (uvConfig.cacheScheme == UIViewCacheScheme.Cache) { uvConfig.unique = true; } uiViewConfig.Add(uvConfig.viewName, uvConfig); } } MgrLog("View config inited."); }