UIManager.cs 2.78 KB
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class UIManager : Singleton<UIManager>
{
    /// <summary>
    /// 缓存所有UI
    /// </summary>
    private Dictionary<string, UIBase> _dicUI = new Dictionary<string, UIBase>();

    /// <summary>
    /// 面板根节点
    /// </summary>
    public Transform uiRoot
    {
        get { return GameObject.Find("Top").transform; }
    }

    #region 管理UI

    /// <summary>
    /// 添加UI
    /// </summary>
    /// <param name="ui"></param>
    public void RegisterUI(IUIBase ui)
    {
        var curUi = ui.GetUI();
        if (!_dicUI.ContainsKey(curUi.GetType().Name))
        {
            _dicUI.Add(curUi.GetType().Name, curUi);
            if (curUi.isCanDestroy)
            {
                curUi.transform.SetParent(uiRoot, false);
                if (curUi.animationType == UIBase.EUiAnimationType.Fade)
                {
                    curUi.GetOrAddComponent<CanvasGroup>().alpha = 0;
                }
            }
            else
            {
                // 默认关闭所有UI
                curUi.Close(this);
            }
        }
    }

    /// <summary>
    /// 删除UI
    /// </summary>
    /// <param name="ui"></param>
    public void UnRegisterUI(IUIBase ui)
    {
        var curUI = ui.GetUI();
        if (_dicUI.ContainsKey(curUI.GetType().Name))
        {
            _dicUI.Remove(curUI.GetType().Name);
        }
    }

    #endregion


    #region 打开与关闭

    private void ShowUI(string name)
    {
        if (!_dicUI.ContainsKey(name))
        {
            Debug.LogError("未找到对应的UI:  " + name);
            return;
        }

        _dicUI[name].Open(this);
    }

    private void HideUI(string name)
    {
        if (!_dicUI.ContainsKey(name))
        {
            Debug.LogError("未找到对应的UI:  " + name);
            return;
        }

        _dicUI[name].Close(this);
    }

    #endregion

    /// <summary>
    /// 打开
    /// </summary>
    public void ShowUI<T>()
    {
        ShowUI(typeof(T).Name);
    }


    /// <summary>
    /// 关闭
    /// </summary>
    public void HideUI<T>()
    {
        HideUI(typeof(T).Name);
    }

    /// <summary>
    /// 获得某个UI
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public T GetUi<T>() where T : UIBase
    {
        var uiName = typeof(T).Name;
        if (_dicUI.ContainsKey(uiName))
        {
            return _dicUI[uiName] as T;
        }

        Debug.LogError("未找到对应的UI: " + uiName);
        return null;
    }
}

public interface IUIBase
{
    void RegisterUI() => UIManager.Instance.RegisterUI(this);
    void UnRegisterUI() => UIManager.Instance.UnRegisterUI(this);
    UIBase GetUI();
}