using System; using System.Collections.Generic; namespace Game { public class UIManager : ManagerBase, IUIManager { private Queue _uis = new Queue(); private Dictionary _uiDic = new Dictionary(); private Dictionary _types = new Dictionary(); protected 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); } } protected override void OnUpdate(float dateTime) { base.OnUpdate(dateTime); foreach (var ui in _uis) { ui.Update(dateTime); } } protected override void OnPause() { base.OnPause(); foreach (var ui in _uis) { ui.Pause(); } } protected override void OnResume() { base.OnResume(); foreach (var ui in _uis) { ui.Resume(); } } public IUI CreateUI(UIType uiType) { var gameObject = Game.resourceManager.LoadUIGameObjectSync(uiType.ToString()); 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); #if UNITY_EDITOR gameObject.AddComponent().ui = ui; #endif ui.Init(); _uiDic.Add(uiType, ui); return ui; } public IUI ShowUI(UIType uiType) { if (_uiDic.TryGetValue(uiType, out var ui)) { _uis.Enqueue(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.Dequeue(); ui.Close(); return ui; } return null; } public void CloseAll() { while (_uis.Count > 0) { var ui = _uis.Dequeue(); ui.Close(); } } } }