using System; using System.Collections.Generic; using AibisDream.Framework; using UnityEngine; namespace AibisDream { public class UIManager : Kit.Singleton, IUIManager { #region 索引 private Dictionary _panelPool; public RectTransform Canvas { get; private set; } public Vector2 Resolution { get; set; } #endregion public override void OnSingletonInit() { InitRefs(); } 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; 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; panel.Hide(); } else { Debug.Log($"panel {type} 未注册"); } } public T GetPanel() where T : class, IUIPanel { return _panelPool.TryGetValue(typeof(T), out var ui) ? ui as T : 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; } }