using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; namespace HK { internal class UIManager : ManagerBase, IUIManager, IReference { private Stack _uis = new Stack(); private Dictionary _uiTemp = new Dictionary(); Transform canvas; public void Initialize() { canvas = GameObject.Find("Canvas").transform; } public void Dispose() { CloseAll(); } public IUI ShowUI(string uiName, string assetPath) { if (!_uiTemp.ContainsKey(uiName)) { var gameObject = ResourcesManager.Instance.Load(assetPath); _uiTemp.Add(uiName, gameObject); } var o = _uiTemp[uiName]; var go = GameObject.Instantiate(o, canvas); var uiBase = go.GetComponent(); _uis.Push(uiBase); uiBase.OnOpen(); return uiBase; } public T GetUI(string uiName) where T : UIBase { foreach (var uiBase in _uis) { if (uiBase is not T t) throw new InvalidCastException(); return t; } return default; } public bool HideUI(string uiName) { var array = _uis.ToList(); foreach (var uiBase in array) { if (uiBase.name == uiName) { uiBase.OnClose(); uiBase.OnDispose(); array.Remove(uiBase); break; } } _uis.Clear(); for (var i = array.Count - 1; i >= 0; i--) { _uis.Push(array[i]); } return true; } public bool HideUI(UIBase ui) { return HideUI(ui.name); } public void Log() { foreach (var uiBase in _uis) { Debug.Log(uiBase.name); } } public IUI CloseLast() { if (_uis.Count > 0) { var ui = _uis.Pop(); ui.OnClose(); ui.OnDispose(); return ui; } return null; } public void OnPause(params object[] data) { foreach (var ui in _uis) { ui.OnPause(); } } public void OnResume(params object[] data) { foreach (var ui in _uis) { ui.OnResume(); } } public void CloseAll() { while (_uis.Count > 0) { var ui = _uis.Pop(); ui.OnClose(); ui.OnDispose(); } } } }