using System; using System.Collections.Generic; using AibisDream.Framework; using UnityEngine; namespace AibisDream { public class UIManager : Kit.Singleton, IUIManager { #region 索引 private Dictionary _panelPool; private readonly Stack _panelStack = new(); public RectTransform Canvas { get; private set; } public Vector2 Resolution { get; set; } #endregion public override void OnSingletonInit() { InitRefs(); } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { if (_panelStack.Count > 0) { var lastPanel = _panelStack.Peek(); HidePanel(lastPanel); } else { ShowPanel(); } } } private void InitRefs() { // 获取Canvas Canvas = transform.Find("UI Canvas").GetComponent(); // 获取Panel var panels = Canvas.GetComponentsInChildren(true); _panelPool = new Dictionary(); foreach (var panel in panels) { _panelPool[panel.GetType()] = panel; } EnumEventSystem.Global.Register(GameLoopEnum.AppStart, OnAppStart); EnumEventSystem.Global.Register(GameLoopEnum.GameStart, OnGameStart); EnumEventSystem.Global.Register(GameLoopEnum.GameQuit, OnGameQuit); } private void OnAppStart() { // 游戏打开 ShowPanel(); ShowPanel(); HidePanel(); HidePanel(); HidePanel(); HidePanel(); } private void OnGameStart() { // 开始游戏 HidePanel(); ShowPanel(); } private void OnGameQuit() { HidePanel(); ShowPanel(); } public void ShowPanel(Action call = null) where T : class, IUIPanel { var type = typeof(T); // 从缓存中检查panel if (_panelPool.TryGetValue(type, out var panel)) { if (panel.IsOpen) return; if (panel.IsCloseable) _panelStack.Push(panel); panel.Show(); call?.Invoke(panel as T); } else { Debug.Log($"panel {type} 未注册"); } } public void HidePanel() where T : IUIPanel { var type = typeof(T); // 从缓存中检查panel if (_panelPool.TryGetValue(type, out var panel)) { if (!panel.IsOpen) return; if (panel.IsCloseable) _panelStack.Pop(); panel.Hide(); } else { Debug.Log($"panel {type} 未注册"); } } private void HidePanel(T panel) where T : IUIPanel { if (_panelPool.ContainsValue(panel)) { if (!panel.IsOpen) return; if (panel.IsCloseable) _panelStack.Pop(); panel.Hide(); } else { Debug.Log($"panel {typeof(T)} 未注册"); } } public T GetPanel() where T : class, IUIPanel { if (_panelPool.TryGetValue(typeof(T), out var panel)) { return panel as T; } Debug.Log($"没有找到{typeof(T)}"); return null; } } public interface IUIManager { void ShowPanel(Action call = null) where T : class, IUIPanel; void HidePanel() where T : IUIPanel; T GetPanel() where T : class, IUIPanel; RectTransform Canvas { get; } Vector2 Resolution { get; set; } // 还没想好要不要用栈 // UIPanel Pop(); // void Push(T panel) where T : UIPanel; } }