public void OpenEnforceWindow(UIEnforceWindows windowKey) { //var windowKey = data.windowKey; //var args = data.args; // if (enforceWindowStack.Count != 0) // { // SetVisible(enforceWindowStack[enforceWindowStack.Count - 1].gameObject, false); // } // 注意释放该window变量 var window = GetEnforceWindow(windowKey, null); // TODO UI转换效果 var canvasGroup = window.GetComponent <CanvasGroup>(); if (canvasGroup != null) { canvasGroup.alpha = 0; DOTween.To(() => canvasGroup.alpha, x => canvasGroup.alpha = x, 1f, 0.0f); } var requestWindow = window.GetComponent <UIEnforceWindow>(); if (_enforceWindowStack.Contains(requestWindow)) { _enforceWindowStack.Remove(requestWindow); } _enforceWindowStack.Add(requestWindow); }
private GameObject GetEnforceWindow(UIEnforceWindows windowKey, object args) { if (_enforceWindowPool == null) { _enforceWindowPool = new List <UIEnforceWindow>(); } UIEnforceWindow requesetWindow = null; // 如果缓存池中有,则直接加载 for (var i = 0; i < _enforceWindowPool.Count; i++) { if (_enforceWindowPool[i].windowKey == windowKey) { requesetWindow = _enforceWindowPool[i]; requesetWindow.lastOpenTime = DateTime.Now; break; } } if (requesetWindow != null) { SetVisible(requesetWindow.gameObject, true); requesetWindow.Set(args); } else { // 如果缓存池中没有,则从硬盘加载 var windowName = Enum.GetName(typeof(UIEnforceWindows), windowKey); var resourcePath = UIEnforcewindowDir; var resourceName = resourcePath + windowName; // requesetWindow = GameObject.Instantiate(ResourceLoader.GetObjectDirectly<GameObject>(resourceName)).GetComponent<UIEnforceWindow>(); requesetWindow = (Instantiate(Resources.Load(resourceName, typeof(GameObject))) as GameObject) .GetComponent <UIEnforceWindow>(); // windowObj.window = GameObject.Instantiate(ResourceLoader.GetObjectDirectly<UnityEngine.Object>(resourceName)) as GameObject; requesetWindow.transform.SetParent(UIRoot.transform); // 设置camera var canvases = requesetWindow.transform.GetComponentsInChildren <Canvas>(); for (var i = 0; i < canvases.Length; i++) { canvases[i].worldCamera = UICamera; } var rect = requesetWindow.GetComponent <RectTransform>(); rect.pivot = new Vector2(0.5f, 0.5f); rect.localPosition = Vector3.zero; rect.localScale = Vector3.one; rect.sizeDelta = Vector2.zero; requesetWindow.Init(args); requesetWindow.lastOpenTime = DateTime.Now; _enforceWindowPool.Add(requesetWindow); // 如果超出缓存容量,删除最早打开的window if (_enforceWindowPool.Count > _poolCapacity) { var forDestroyWindow = _enforceWindowPool[0]; for (var i = 1; i < _enforceWindowPool.Count; i++) { if (_enforceWindowPool[i].lastOpenTime < forDestroyWindow.lastOpenTime) { forDestroyWindow = _enforceWindowPool[i]; } } LogManager.Log("Remove Window:" + forDestroyWindow.gameObject.name); _enforceWindowPool.Remove(forDestroyWindow); TryUnloadAtlas(forDestroyWindow); Destroy(forDestroyWindow.gameObject); } } return(requesetWindow.gameObject); }