223 lines
7.1 KiB
C#
223 lines
7.1 KiB
C#
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<string, GameObject> LuaUIs = new Dictionary<string, GameObject>();
|
||
public Dictionary<string, GameObject> ShowingUIs = new Dictionary<string, GameObject>();
|
||
|
||
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<RectTransform>().offsetMax = Vector2.zero;
|
||
LuaUIs[uiName].GetComponent<RectTransform>().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<string>();
|
||
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<string> uiNameList)
|
||
{
|
||
for (var index = 0; index < uiNameList.Count; index++)
|
||
if (LuaUIs.ContainsKey(uiNameList[index]))
|
||
LuaUIs.Remove(uiNameList[index]);
|
||
}
|
||
|
||
#endregion
|
||
} |