using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using OpenCVForUnity.CoreModule; using UnityEngine.SceneManagement; using Yoga; using OpenCVForUnityExample; public class UIManager : MonoSingleton { private Dictionary _panelDic = new Dictionary(); private Stack _panelStack = new Stack(); public Camera UiCamera { get; set; } private static bool _isInited = false; public static bool IsInited { get => _isInited; private set => _isInited = value; } private RectTransform _uiPanelRoot; private RectTransform _uiPopRoot; private HudUI _hud; private Transform _uiRootTrans; //hud 页面 private NotificationPopupUI _hintPannel; public override void Init() { if (_isInited) return; //查找当前scene的摄像机 UiCamera = Camera.main; var canvases = GameObject.FindGameObjectsWithTag("UI"); GameObject canvas; if (canvases.Length <= 0) { canvas = new GameObject("UICanvas"); canvas.AddComponent(); } else canvas = canvases.ToList().Find(canvas => canvas.name == "UICanvas"); if (canvas == null) { canvas = new GameObject("UICanvas"); canvas.AddComponent(); } _uiRootTrans = canvas.transform; //优先层级 最高 hud 最低 panel //panel 挂载节点 if (transform.Find("PanelRoot") == null) { _uiPanelRoot = new GameObject("PanelRoot").AddComponent(); _uiPanelRoot.SetParent(_uiRootTrans); _uiPanelRoot.anchoredPosition = Vector2.zero; _uiPanelRoot.anchorMin = Vector2.zero; _uiPanelRoot.anchorMax = Vector2.one; _uiPanelRoot.offsetMin = Vector2.zero; _uiPanelRoot.offsetMax = Vector2.zero; } else _uiPanelRoot = transform.Find("PanelRoot").GetComponent(); _uiPanelRoot.SetSiblingIndex(1); //pop 挂载节点 if (transform.Find("PopRoot") == null) { _uiPopRoot = new GameObject("PopRoot").AddComponent(); _uiPopRoot.SetParent(_uiRootTrans); _uiPopRoot.anchoredPosition = Vector2.zero; _uiPopRoot.anchorMin = Vector2.zero; _uiPopRoot.anchorMax = Vector2.one; _uiPopRoot.offsetMin = Vector2.zero; _uiPopRoot.offsetMax = Vector2.zero; } else _uiPopRoot = transform.Find("PopRoot").GetComponent(); _uiPopRoot.SetSiblingIndex(2); //hud 挂载节点 if (transform.Find("HUDRoot") == null) { _hud = GetPanel(); _hud.transform.SetParent(_uiRootTrans); var rect = _hud.transform.GetComponent(); rect.anchorMin = Vector2.zero; rect.anchorMax = Vector2.one; rect.pivot = new Vector2(0.5f, 0.5f); rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width); rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height); rect.offsetMin = Vector2.zero; rect.offsetMax = Vector2.zero; _hud.Init(null); } else _hud = transform.Find("HUDRoot").GetComponent(); _hud.transform.SetSiblingIndex(3); _isInited = true; } public void LoadReset() { _isInited = false; Init(); } private T GetPanel() where T : UIBase { Type type = typeof(T); //无缓存,加载相对应的Panel文件 if (_panelDic.TryGetValue(type, out var panel)) { if (panel != null) _panelDic[type].Destroy(); _panelDic.Remove(type); } string path = UILoadConfig.GetPath(type.FullName); GameObject panelGo = Instantiate(Resources.Load(path)); panel = panelGo.GetComponent(); if (panel is UIPanelBase) panelGo.transform.SetParent(_uiPanelRoot); else if (panel is UIPopupBase) panelGo.transform.SetParent(_uiPopRoot); else if (panel is UIHudBase) { panelGo.transform.localPosition = Vector3.zero; //hud页面不需要缓存 return panel as T; } else throw new Exception("UIManager.GetPanel() : panel is not a type of UIPanelBase, UIPopupBase"); panelGo.transform.localPosition = Vector3.zero; _panelDic.Add(type, panel); return panel as T; } public void ShowPanel(params object[] args) where T : UIBase { T panel = GetPanel(); panel.Init(args); panel.gameObject.SetActive(true); panel.OnEnter(); _panelStack.Push(panel); } public void ShowPanel(bool hideCurrentPage, params object[] args) where T : UIBase { if (hideCurrentPage) { if (_panelStack.Count > 0) { var topPanel = _panelStack.Peek(); topPanel.OnPause(); } } ShowPanel(args); } public void ClearPanel() { foreach (var panel in _panelDic.Values) { panel.OnExit(); } _panelStack.Clear(); } public void PushPanel() where T : UIBase { if (_panelStack.Count > 0) { var topPanel = _panelStack.Peek(); topPanel.OnPause(); } var panel = GetPanel(); _panelStack.Push(panel); panel.OnEnter(); } private void PopPanel() { if (_panelStack.Count <= 0) { return; } UIBase topPanel = _panelStack.Pop(); topPanel.OnHide(); topPanel.OnExit(); if (_panelStack.Count > 0) { UIBase nextPanel = _panelStack.Peek(); nextPanel.OnResume(); } } public void CloseCurrent() { PopPanel(); } public void LoadScene() { EnableScreenMask(); var op = SceneManager.LoadSceneAsync("YogaMain"); op.completed += (operation) => { DisableScreenMask(); }; } public void EnableScreenMask() { } public void DisableScreenMask() { } public void CloseUI(UIBase targetUI) { if (_panelStack.Count <= 0) { return; } targetUI.OnHide(); targetUI.OnExit(); //从栈中移除 _panelStack = new Stack(_panelStack.Where(ui => ui != targetUI)); //打开顶层页面 if (_panelStack.Count > 0) { UIBase nextPanel = _panelStack.Peek(); nextPanel.OnResume(); } } //hud 页面 public void ShowHint(string title, string content) { EventManager.Instance.Dispatch(YogaEventType.ShowHint, title, content); } public void ShowMsgBox(string title, string content) { EventManager.Instance.Dispatch(YogaEventType.ShowMessage, title, content); } }