using System.Collections; using System.Collections.Generic; using Module.Log; using UnityEngine; using XLua; public class LuaUIManager { [CSharpCallLua] public delegate void OnOpenUIDelegate(bool bSuccess, object param, GameObject uiObj); private static LuaUIManager _Instance; public Dictionary LuaUIs = new Dictionary(); public Dictionary ShowingUIs = new Dictionary(); public static LuaUIManager Instance { get { if (_Instance == null) _Instance = new LuaUIManager(); return _Instance; } } public GameObject GetUIInstance(string uiName) { if (LuaUIs.ContainsKey(uiName)) return LuaUIs[uiName]; return null; } #region load ui public enum UIContainerType { Base = 1, Pop = 4, MenuPop = 5, Tip = 6, Message = 8 } public void ShowLuaUI(string uiName, OnOpenUIDelegate callBack = null, object param = null, bool defaultHide = false) { ShowLuaUIType(uiName, UIContainerType.MenuPop, callBack, param, defaultHide); } public void ShowLuaUIType(string uiName, UIContainerType uiType, OnOpenUIDelegate callBack = null, object param = null, bool defaultHide = false) { if (LuaUIs.ContainsKey(uiName)) { if (!defaultHide) { LuaUIs[uiName].gameObject.SetActive(true); LuaUIs[uiName].gameObject.transform.SetAsLastSibling(); } if (callBack != null) callBack(true, param, LuaUIs[uiName].gameObject); } else { var hash = new Hashtable { {"UIType", uiType}, {"OnOpenUIDelegate", callBack}, {"Param", param}, {"DefaultHide", defaultHide} }; LoadAssetBundle.Instance.LoadUI(LoadAssetBundle.BUNDLE_PATH_UI + uiName, uiName, LoadUICallBack, hash); } //UIManager.Instance().ShowBlurBackGround(); } public void ShowLuaUIAsChild(string uiName, GameObject parent, OnOpenUIDelegate callBack = null, object param = null, bool defaultHide = false) { var hash = new Hashtable { {"Parent", parent}, {"OnOpenUIDelegate", callBack}, {"Param", param}, {"DefaultHide", defaultHide} }; if (LuaUIs.ContainsKey(uiName)) { if (parent != null) { LuaUIs[uiName].transform.SetParent(parent.transform); LuaUIs[uiName].transform.localPosition = Vector3.zero; LuaUIs[uiName].transform.localScale = Vector3.one; LuaUIs[uiName].GetComponent().offsetMax = Vector2.zero; LuaUIs[uiName].GetComponent().offsetMin = Vector2.zero; } if (!defaultHide) LuaUIs[uiName].gameObject.SetActive(true); if (callBack != null) callBack(true, param, LuaUIs[uiName].gameObject); } else { LoadAssetBundle.Instance.LoadUI(LoadAssetBundle.BUNDLE_PATH_UI + uiName, uiName, LoadUICallBack, hash); } } // 因为会存先加载的资源比后加载的资源慢,所以提供取消回调,保证加载顺序关系 public void CancelLoadUICallBack(string uiName) { LoadAssetBundle.Instance.UnloadAssetWithPathFix(LoadAssetBundle.BUNDLE_PATH_UI, uiName); } private void LoadUICallBack(string uiName, GameObject resObj, Hashtable hashParam) { GameObject newUI; var defaultHide = (bool) hashParam["DefaultHide"]; if (hashParam.ContainsKey("Parent")) { var parent = (GameObject) hashParam["Parent"]; newUI = UIManager.InitUIFromPrefab(resObj, parent.transform, -1, defaultHide); newUI.name = uiName; if (!LuaUIs.ContainsKey(uiName)) LuaUIs.Add(uiName, newUI); LogModule.DebugLog("init ui in parent:" + uiName); } else { var parent = UIManager.Instance().PopUIRoot; var uiTypeIndex = -1; if (hashParam.ContainsKey("UIType")) { var uiType = (UIContainerType) hashParam["UIType"]; uiTypeIndex = (int) uiType; switch (uiType) { case UIContainerType.Base: parent = UIManager.Instance().BaseUIRoot; break; case UIContainerType.Pop: parent = UIManager.Instance().PopUIRoot; break; case UIContainerType.MenuPop: parent = UIManager.Instance().MenuPopUIRoot; break; case UIContainerType.Tip: parent = UIManager.Instance().TipUIRoot; break; case UIContainerType.Message: parent = UIManager.Instance().MessageUIRoot; break; } } newUI = UIManager.InitUIFromPrefab(resObj, parent, uiTypeIndex, defaultHide); LuaUIs.Add(uiName, newUI); ShowingUIs.Add(uiName, newUI); } var delOpenUI = hashParam["OnOpenUIDelegate"] as OnOpenUIDelegate; if (delOpenUI != null) delOpenUI(newUI != null, hashParam["Param"], newUI); } public void CloseUI(string uiName) { if (LuaUIs.ContainsKey(uiName)) LuaUIs[uiName].SetActive(false); //UIManager.Instance().HideBlurBackGround(); } public void CloseAnyUI() { foreach (var luaUI in ShowingUIs) if (luaUI.Value.activeSelf) if (luaUI.Value.transform.parent != UIManager.Instance().BaseUIRoot) CloseUI(luaUI.Key); } public void ClearAllUI() { foreach (var luaUI in LuaUIs) if (luaUI.Value) Object.Destroy(luaUI.Value); LuaUIs.Clear(); ShowingUIs.Clear(); } public void ClearAllPop(bool closeAlways = false) { var popUI = new List(); foreach (var luaUI in LuaUIs) { //ui 为空,直接删除(某些UI由UIManager打开,但是包含LuaUI的Page可能导致此情况) if (luaUI.Value == null) popUI.Add(luaUI.Key); if (!closeAlways && luaUI.Value.activeInHierarchy) continue; if (luaUI.Value.transform.parent != UIManager.Instance().BaseUIRoot) popUI.Add(luaUI.Key); } for (var i = 0; i < popUI.Count; ++i) { if (LuaUIs[popUI[i]] != null) Object.Destroy(LuaUIs[popUI[i]]); LuaUIs.Remove(popUI[i]); if (ShowingUIs.ContainsKey(popUI[i])) ShowingUIs.Remove(popUI[i]); } } public void OnDestroyCallBack(List uiNameList) { for (var index = 0; index < uiNameList.Count; index++) if (LuaUIs.ContainsKey(uiNameList[index])) LuaUIs.Remove(uiNameList[index]); } #endregion }