/// <summary> /// 检查缓存区~如果超过最大上限值,则进行清理,如果链存在不进行清理,一般情况下,链的长度不会超过缓存大小 /// </summary> private void CheckCach() { if (cacheWndDict.Count < MAX_CACH_WND) { return; } else { int minDepth = MAX_CACH_WND; UIWndBase wnd = null; foreach (KeyValuePair <WindowID, UIWndBase> pair in cacheWndDict) { if (pair.Value.Depth < minDepth && !backStack.Contains(pair.Value)) { minDepth = pair.Value.Depth; wnd = pair.Value; } } if (wnd != null) { Destroy(wnd.gameObject); cacheWndDict.Remove(wnd.wndID); } } }
void RegisterWindow(UIWndBase wnd) { wnd.Show(); Type t = wnd.GetType(); mWindowDic[t] = wnd; wnd.DestroyWndHandler = (wd, e) => { RemoveWindow(wd); }; }
/// <summary> /// 销毁窗口 /// </summary> /// <returns></returns> public void DestroyWindow <T>() where T : UIWndBase { if (mWindowDic.ContainsKey(typeof(T))) { UIWndBase wnd = mWindowDic[typeof(T)]; RemoveWindow <T>(); wnd.Destroy(); } }
/// <summary> /// 从字典移除窗口 /// </summary> /// <returns></returns> public UIWndBase RemoveWindow <T>() where T : UIWndBase { UIWndBase wnd = null; if (mWindowDic.ContainsKey(typeof(T))) { wnd = mWindowDic[typeof(T)]; mWindowDic.Remove(typeof(T)); } return(wnd); }
/// <summary> /// 向指定窗口发送消息 /// </summary> public void SendMsg(WindowID wndId, WindowMsgID msgId, object param) { if (cacheWndDict.ContainsKey(wndId)) { UIWndBase wnd = cacheWndDict [wndId]; wnd.OnMsg(msgId, param); } else { Debug.Log("窗口不在缓存中, 事件更新失败"); } }
/// <summary> /// 隐藏窗口 /// </summary> /// <param name="wnd"></param> /// <returns></returns> public void HideWindow(UIWndBase wnd) { foreach (Type t in mWindowDic.Keys.ToArray()) { if (mWindowDic[t] == wnd) { mWindowDic[t].Show(false); mWindowDic[t].transform.position = hidPos; break; } } }
/// <summary> /// 销毁窗口 /// </summary> /// <param name="wnd"></param> /// <returns></returns> public void DestroyWindow(UIWndBase wnd) { foreach (Type t in mWindowDic.Keys.ToArray()) { if (mWindowDic[t] == wnd) { mWindowDic.Remove(t); wnd.Destroy(); break; } } }
/// <summary> /// 窗口显示,队列型加载 /// </summary> public void ShowWindow(WindowID windowId, bool bAppend = false) { if (wndResDict.ContainsKey(windowId)) { if (cacheWndDict.ContainsKey(windowId)) { UIWndBase wnd = cacheWndDict [windowId]; if (wnd.status == WindowStatus.Inactive) { if (bAppend) { if (backStack.Count == 0) { backStack.Push(curShowWnd); } backStack.Push(wnd); AdjustAlpha(); } else { HideAllCach(); BreakBackStack(); curShowWnd.Close(); } wnd.Show(); curShowWnd = wnd; } else if (wnd.status == WindowStatus.Gray) { curShowWnd.Close(); curShowWnd = wnd; backStack.Pop(); AdjustAlpha(); } else if (wnd.status == WindowStatus.Active) { Debug.Log("当前窗口已经是显示窗口"); } wnd.Refresh(); } else { RealShow(windowId, bAppend); } } else { Debug.Log(windowId.ToString() + " 不存在资源"); } }
/// <summary> /// 从字典移除窗口 /// </summary> /// <param name="wnd"></param> /// <returns></returns> public UIWndBase RemoveWindow(UIWndBase wnd) { UIWndBase _wnd = null; foreach (Type t in mWindowDic.Keys.ToArray()) { if (mWindowDic[t] == wnd) { _wnd = mWindowDic[t]; mWindowDic.Remove(t); break; } } return(_wnd); }
private void RealShow(WindowID windowId, bool bAppend) { string wndPath = wndResDict [windowId]; GameObject prefab = null; if (GameManager.Instance.ResFrom != ResourceFrom.Bundle) { prefab = ResourceManager.LoadResource("UIPrefab/" + windowId.ToString()) as GameObject; } else { prefab = ResourceManager.GetInstance().LoadAsset(wndPath, windowId.ToString()); } if (prefab != null) { GameObject clone = (GameObject)GameObject.Instantiate(prefab); UnityTools.AddChildToTarget(wndRoot.transform, clone.transform); UIWndBase wnd = clone.GetComponent <UIWndBase> (); wnd.status = WindowStatus.Active; if (curShowWnd != null) { wnd.preWndID = curShowWnd.wndID; } wnd.wndID = windowId; if (bAppend) { if (backStack.Count == 0) { backStack.Push(curShowWnd); } curShowWnd = wnd; backStack.Push(curShowWnd); AdjustAlpha(); } else { curShowWnd = wnd; HideAllCach(); BreakBackStack(); } cacheWndDict.Add(windowId, curShowWnd); curShowWnd.AdjustAlpha(1.0f); CheckCach(); wnd.Refresh(); } }