using System; using System.Collections.Generic; using TMPro; using UnityEngine; namespace ZC { internal class UIManager : ManagerBase, IUIManager { private Stack _uis = new Stack(); private Dictionary _uiDic = new Dictionary(); // private Dictionary _types = new Dictionary(); public TMP_FontAsset font { get; set; } public override void OnInit() { base.OnInit(); // var types = new List<(Type, UITypeAttribute)>(); // AssemblyManager.GetTypesInhertType(typeof(UIBase), types); // foreach (var (type, uiTypeAttribute) in types) // { // _types.Add(uiTypeAttribute.UIType, type); // } } public override void OnUpdate(float time) { base.OnUpdate(time); foreach (var ui in _uis) { ui.OnUpdate(time); } } public override void OnPause() { base.OnPause(); foreach (var ui in _uis) { ui.Pause(); } } public override void OnResume() { base.OnResume(); foreach (var ui in _uis) { ui.Resume(); } } public IUI CreateUI(UIType uiType, string path, UILayer uiLayer) { var gameObject = ResourcesLocalComponent.Instance.LoadUIGameObjectSync(path, uiLayer); // if (!this._types.TryGetValue(uiType, out var type)) // { // throw new InvalidOperationException(); // } // // if (Activator.CreateInstance(type, false) is not UIBase ui) // throw new NullReferenceException(); // ui.SetGameObject(gameObject); var uiBase = gameObject.GetComponent(); uiBase.Init(); uiBase.Close(); _uiDic.Add(uiType, uiBase); //#if UNITY_EDITOR // view // var addComponent = gameObject.GetComponent(); // addComponent.SetStart(ui, this.font); //#endif return uiBase; } public IUI ShowUI(UIType uiType) { if (_uiDic.TryGetValue(uiType, out var ui)) { _uis.Push(ui); ui.Open(); return ui; } return null; } public T GetUI(UIType uiType) where T : UIBase { if (_uiDic.TryGetValue(uiType, out var ui)) { if (ui is not T t) throw new InvalidCastException(); return t; } return default; } public bool HideUI(UIType uiType) { if (_uiDic.TryGetValue(uiType, out var ui)) { ui.Close(); return true; } return false; } public IUI CloseLast() { if (_uis.Count > 0) { var ui = _uis.Pop(); ui.Close(); return ui; } return null; } public void CloseAll() { while (_uis.Count > 0) { var ui = _uis.Pop(); ui.Close(); } } } }