• Unity的UI管理器


    1、代码 

    1. public class UIManager
    2. {
    3. private static UIManager instance = new UIManager();
    4. public static UIManager Instance => instance;
    5. //存储显示着的面板脚本(不是面板Gameobject),每显示一个面板就存入字典
    6. //隐藏的时候获取字典中对应面板 进行隐藏
    7. private Dictionary<string, BasePanel> panelDic = new Dictionary<string, BasePanel>();
    8. //得到Canvas用于设置为面板父对象
    9. private Transform canvasTrans;
    10. private UIManager()
    11. {
    12. //将Canvas作为预设体,UI管理器启动时创建Canvas
    13. GameObject canvas = GameObject.Instantiate(Resources.Load<GameObject>("UI/Canvas"));
    14. //得到创建的canvas
    15. canvasTrans = canvas.transform;
    16. //不移除Canvas,保证整个游戏中只有一个
    17. GameObject.DontDestroyOnLoad(canvas);
    18. }
    19. //显示面板
    20. public T ShowPanel<T>() where T:BasePanel
    21. {
    22. //保证泛型T的类型和预设体名字一样(规则)
    23. string panelName = typeof(T).Name;
    24. //判断字典中是否已经有这个面板
    25. if (panelDic.ContainsKey(panelName))
    26. {
    27. return panelDic[panelName] as T;
    28. }
    29. //如果字典中没有
    30. //根据面板名字动态创建预设体 设置父对象
    31. GameObject panelObj = GameObject.Instantiate(Resources.Load<GameObject>("UI/" + panelName));
    32. //把这个对象放到场景Canvas下面
    33. panelObj.transform.SetParent(canvasTrans,false);
    34. //
    35. T panel = panelObj.GetComponent<T>();
    36. //把这个面板脚本 存储到字典中
    37. panelDic.Add(panelName, panel);
    38. panel.ShowMe();
    39. return panel;
    40. }
    41. /// <summary>
    42. /// 隐藏面板
    43. /// </summary>
    44. /// <typeparam name="T">面板类型</typeparam>
    45. public void HidePanel<T>() where T : BasePanel
    46. {
    47. //根据泛型得名字
    48. string panelName = typeof(T).Name;
    49. //判断当前显示的面板有没有传入的面板
    50. if (panelDic.ContainsKey(panelName))
    51. {
    52. //面板淡出完毕后删除
    53. panelDic[panelName].HideMe(()=>
    54. {
    55. GameObject.Destroy(panelDic[panelName].gameObject);
    56. //删除字典里面存储的面板脚本
    57. panelDic.Remove(panelName);
    58. });
    59. }
    60. }
    61. //得到面板
    62. public T GetPanel<T>() where T : BasePanel
    63. {
    64. string panelName = typeof(T).Name;
    65. if (panelDic.ContainsKey(panelName))
    66. {
    67. return panelDic[panelName] as T;
    68. }
    69. //没有对应面板返回空
    70. return null;
    71. }
    72. }

    2、如何使用

    创建一个测试的UI面板(随便乱拼),将他作为预设体

    创建一个测试类

    1. public class TestMain : MonoBehaviour
    2. {
    3. // Start is called before the first frame update
    4. void Start()
    5. {
    6. UIManager.Instance.ShowPanel();
    7. }
    8. // Update is called once per frame
    9. void Update()
    10. {
    11. }
    12. }

    启动发现已经动态创建了Canvas和对应面板

  • 相关阅读:
    关于Mybaits缓存....
    开源与闭源:数字化时代的创新与合作之争
    02-文本属性
    蓝桥杯算法训练-移动
    Python函数详解(一)——函数的定义、调用及变量
    CSRF漏洞详解与挖掘
    云渲染比本地电脑渲染快多少?一个案例生动告诉你云渲染的速度优势
    华为云构建云原生DevSecOps平台,保障软件供应链全流程安全可信
    各种二端口滤波器网络仿真遇到的问题
    华纳云:centos系统中怎么查看cpu信息?
  • 原文地址:https://blog.csdn.net/holens01/article/details/132764024